从cairo surface对象获取RGB值

时间:2017-05-14 15:09:15

标签: c++ rgb cairo

给出这样的代码:

surface = cairo_xlib_surface_create(disp, root, DefaultVisual(disp, scr),
                                                DisplayWidth(disp, scr),
                                                DisplayHeight(disp, scr));

我不清楚我将如何访问表面对象RGB值。

有没有人有想法?

unsigned char *data = cairo_image_surface_get_data(surface);
int stride = cairo_image_surface_get_stride(surface);

我尝试使用上面的代码循环遍历unsigned char,但这不起作用。

1 个答案:

答案 0 :(得分:0)

从变量名称root,我猜您正在尝试截取屏幕截图。

cairo_xlib_surface_create给你的是一个X11 drawable作为cairo表面:实际的表面数据存在于X11服务器上,你可以在那里画画。

您显然在寻找:图像表面。这是程序中包含像素数据的一些内存块。

也许您正在寻找以下内容?

cairo_surface_t *x11_surface = cairo_xlib_surface_create(disp, root,
                DefaultVisual(disp, scr), DisplayWidth(disp, scr),
                DisplayHeight(disp, scr));
cairo_surface_t *image_surface = cairo_surface_create_similar_image(x11_surface,
                 CAIRO_FORMAT_RGB24, DisplayWidth(disp, scr),
                 DisplayHeight(disp, scr));

cairo_t *cr = cairo_create(image_surface);
cairo_set_source_surface(cr, x11_surface, 0, 0);
cairo_paint(cr);
cairo_destroy(cr);
cairo_surface_destroy(x11_surface);

unsigned char *data = cairo_image_surface_get_data(image_surface);
/* Do something with data */
cairo_surface_destroy(image_surface);

附加指针:Making a screenshot using Xlib and Cairo libs [fail]

修改:要在某个给定位置xy周围截取屏幕截图,请尝试以下操作:

cairo_surface_t *x11_surface = cairo_xlib_surface_create(disp, root,
                DefaultVisual(disp, scr), DisplayWidth(disp, scr),
                DisplayHeight(disp, scr));
cairo_surface_t *image_surface = cairo_surface_create_similar_image(x11_surface,
                 CAIRO_FORMAT_RGB24, 10, 10);

cairo_t *cr = cairo_create(image_surface);
cairo_set_source_surface(cr, x11_surface, -x-5, -y-5);
cairo_paint(cr);
cairo_destroy(cr);
cairo_surface_destroy(x11_surface);

unsigned char *data = cairo_image_surface_get_data(image_surface);
/* Do something with data */
cairo_surface_destroy(image_surface);