【问题标题】:Get RGB values from cairo surface object从 cairo 表面对象获取 RGB 值
【发布时间】:2017-10-13 09:52:46
【问题描述】:

给定这样的代码:

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,但这不起作用。

【问题讨论】:

    标签: c++ rgb cairo


    【解决方案1】:

    从变量名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]

    编辑:要在给定位置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);
    

    【讨论】:

    • 感谢您的回复。我特别想计算像素值的平均值,实际上是基于屏幕截图。我不需要画 :) 要添加更多信息,我只想估计屏幕有多暗。通过能够获得可能的 RGB 值。如果我能知道鼠标在哪里,然后围绕鼠标周围的像素循环,那就太好了,但这是下一个挑战。
    • XQueryPointer 为您提供当前鼠标位置:tronche.com/gui/x/xlib/window-information/XQueryPointer.html
    • 我更新了我的答案,为您提供有关如何仅在给定位置周围获得 10x10 区域的提示。我希望这会有所帮助,但请注意:如果该 10x10 区域的一部分位于根窗口之外,您最终可能会看到“随机垃圾”而不是屏幕截图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多