C++ 使用C+;中聚焦窗口上的XGetPixel获取像素RGB颜色+;

C++ 使用C+;中聚焦窗口上的XGetPixel获取像素RGB颜色+;,c++,colors,x11,xlib,fltk,C++,Colors,X11,Xlib,Fltk,当我点击我的窗口时,我从另一个函数得到正确的xy值。使用这些值,我不想在当前活动的窗口而不是整个屏幕上获取RGB颜色值。现在我认为它正在阅读整个屏幕。如何编辑此代码以使其正常工作?(窗口本身是使用FLTK库的Fl_双_窗口) 图片说明问题: intgetrgb(intx,inty) { XColor c; Display*d=XOpenDisplay((char*)NULL); XImage*图像; image=XGetImage(d,根窗口(d,默认屏幕(d)),x,y,1,1,所有平面,XY

当我点击我的窗口时,我从另一个函数得到正确的xy值。使用这些值,我不想在当前活动的窗口而不是整个屏幕上获取RGB颜色值。现在我认为它正在阅读整个屏幕。如何编辑此代码以使其正常工作?(窗口本身是使用FLTK库的Fl_双_窗口)

图片说明问题:

intgetrgb(intx,inty)
{
XColor c;
Display*d=XOpenDisplay((char*)NULL);
XImage*图像;
image=XGetImage(d,根窗口(d,默认屏幕(d)),x,y,1,1,所有平面,XYPixmap);
c、 像素=XGetPixel(图像,x,y);
XFree(图像);
XQueryColor(d、DefaultColormap(d、DefaultScreen(d))、&c);

不能使用用于渲染贴图的窗口句柄而不是RootWindow();因为您已经获得了正确的x/y坐标,所以必须在某个地方使用该句柄。

使用用于渲染贴图的窗口句柄而不是RootWindow());因为您已经获得了正确的x/y坐标,所以您必须在某个地方提供该句柄。

我找到了一种使用Fl\U BMP\U图像(gInterface.carte)的方法:


我找到了一种使用Fl\U BMP\U图像(gInterface.carte)的方法:

int getRGB(int x, int y)
{

    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, x, y);
    XFree (image);
    XQueryColor (d, DefaultColormap(d, DefaultScreen (d)), &c);
    cout << c.red/256 << " " << c.green/256 << " " << c.blue/256 << "\n" ;

}
void  GetPixelColor(int x, int y,char *r,char *g, char *b) //get RGB color from clicked pixel x,y and returns rgb
{


    const char*  buf = gInterface.carte->data()[0];
    long index = (y * gInterface.carte->w() * gInterface.carte->d()) + (x * gInterface.carte->d()); // X/Y -> buf index

     if (gInterface.carte->count()==1) { // RGB

            *r = *(buf+index+0);
            *g = *(buf+index+1);
            *b = *(buf+index+2);

            printf("%d, %d : %2d, %d, %d \n", x,y,                                 // hex dump r/g/b
                (unsigned char) *r,
                (unsigned char) *g ,
                (unsigned char) *b );

}

    }