【问题标题】:how to get a screen pixel's color in x11如何在 x11 中获取屏幕像素的颜色
【发布时间】:2013-07-05 07:28:39
【问题描述】:

我想获取整个 x11 显示器的顶部/左侧像素 (0;0) 的 RGB 值。

到目前为止我得到了什么:

XColor c;
Display *d = XOpenDisplay((char *) NULL);

XImage *image;
image = XGetImage (d, RootWindow (d, DefaultScreen (d)), x, y, 1, 1, AllPlanes, XYPixmap);
c->pixel = XGetPixel (image, 0, 0);
XFree (image);
XQueryColor (d, DefaultColormap(d, DefaultScreen (d)), c);
cout << c.red << " " << c.green << " " << c.blue << "\n";

但我需要将这些值设为0..255(0.00)..(1.00),而它们看起来0..57825,这是我不认识的格式。

另外,为了获得一个像素而复制整个屏幕非常慢。因为这将在速度关键的环境中使用,如果有人知道一种更高效的方法来做到这一点,我将不胜感激。也许使用 1x1 大小的 XGetSubImage,但我在 x11 开发方面非常糟糕,不知道如何实现。

我该怎么办?

【问题讨论】:

  • 当然,这就是我现在正在做的事情,但这让我毛骨悚然,因为 a) 我不知道它为什么起作用,b) 我不知道它有多可靠,并且 c ) 它仍然很慢(时间对单个像素说“cpu 0,054 total”!)。
  • 其实按照this的说法,应该只是未初始化的垃圾值。在 XGetPixel 返回的 long 上使用一些基本的位操作符,您应该已经设置好了。
  • 屏幕上限本来就很慢。如果有任何其他方式可以获得您想要的内容,请使用它而不是屏幕截图。
  • 获得我想要的东西的唯一另一种方法是获取随机运行时内存偏移并在通过 wine 运行的外部进程中搞乱。所以,基本上,我认为使用那个像素仍然更快。 XGetSubImage 会更快(实际上屏幕只覆盖我需要的像素),但不知道如何。
  • 使用 Qt 或 Gtk 之类的工具包...要简单得多....

标签: c++ linux x11 xlib


【解决方案1】:

我获取了您的代码并进行了编译。打印的值(缩放到 0-255)给我的值与我为桌面背景图像设置的值相同。

#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

using namespace std;

int main(int, char**)
{
    XColor c;
    Display *d = XOpenDisplay((char *) NULL);

    int x=0;  // Pixel x 
    int y=0;  // Pixel y

    XImage *image;
    image = XGetImage (d, XRootWindow (d, XDefaultScreen (d)), x, y, 1, 1, AllPlanes, XYPixmap);
    c.pixel = XGetPixel (image, 0, 0);
    XFree (image);
    XQueryColor (d, XDefaultColormap(d, XDefaultScreen (d)), &c);
    cout << c.red/256 << " " << c.green/256 << " " << c.blue/256 << "\n";

    return 0;
}

【讨论】:

  • 您的代码无法为我编译。我需要在某些功能之前添加XXRootWindowXDefaultScreenXDefaultColormap
【解决方案2】:

来自XColor(3) 手册页:

红色、绿色和蓝色值始终在 0 到 65535 的范围内,与显示硬件中实际使用的位数无关。服务器将这些值缩小到硬件使用的范围。黑色由 (0,0,0) 表示,白色由 (65535,65535,65535) 表示。在某些函数中,flags 成员控制使用红色、绿色和蓝色成员中的哪一个,并且可以是 DoRed、DoGreen 和 DoBlue 的零个或多个的包含 OR。

因此,您必须将这些值缩放到您想要的任何范围。

【讨论】:

  • 实际上我试过了(因为它是最接近的值),但与 57825 相比它更不准确 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 2015-02-08
  • 2017-08-17
  • 1970-01-01
相关资源
最近更新 更多