给出这样的代码:
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,但这不起作用。
答案 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]
修改:要在某个给定位置x
和y
周围截取屏幕截图,请尝试以下操作:
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);