从变量名root,我猜你是在截图。
cairo_xlib_surface_create 为您提供了一个可绘制为 cairo 表面的 X11:实际表面数据位于 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);