使用 XGetPixel 在 C++ 中聚焦 window 获取像素 RGB 颜色
Get pixel RGB color with XGetPixel on focused window in C++
当我点击我的 window 时,我从另一个函数得到了正确的 x y 值。使用这些值,我不想在当前活动的 window 而不是整个屏幕上获取 RGB 颜色值。现在我认为它正在阅读整个屏幕。如何编辑此代码以使其正常工作? (window 本身是一个 Fl_Double_Window 使用 FLTK 库)。
图片说明问题:
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" ;
}
使用用于渲染地图的 Window 句柄代替 RootWindow();由于您已经获得正确的 x/y 坐标,因此您必须在某处使用该句柄。
我找到了使用 Fl_BMP_image (gInterface.carte) 的方法:
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 );
}
}
当我点击我的 window 时,我从另一个函数得到了正确的 x y 值。使用这些值,我不想在当前活动的 window 而不是整个屏幕上获取 RGB 颜色值。现在我认为它正在阅读整个屏幕。如何编辑此代码以使其正常工作? (window 本身是一个 Fl_Double_Window 使用 FLTK 库)。
图片说明问题:
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" ;
}
使用用于渲染地图的 Window 句柄代替 RootWindow();由于您已经获得正确的 x/y 坐标,因此您必须在某处使用该句柄。
我找到了使用 Fl_BMP_image (gInterface.carte) 的方法:
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 );
}
}