2016-02-08 3 views
1

Когда я нажимаю на свое окно, я получаю правильные значения x y от другой функции. С этими значениями я не хочу получать значение цвета RGB в текущем активном окне, а не на весь экран. Сейчас я думаю, что он читает весь экран. Как я могу отредактировать этот код, чтобы заставить его работать? (само окно представляет собой Fl_Double_Window с использованием библиотеки FLTK).Получите пиксельный цвет RGB с XGetPixel на сфокусированном окне в C++

Изображения объяснить проблему: clicking on territory color

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" ; 

} 

ответ

0

Я нашел способ, используя 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); 

} 

    } 
0

Используйте ручку окна, которое используется для визуализации карты в смене RootWindow(); поскольку вы уже получаете правильные координаты x/y, вы должны иметь этот дескриптор, доступный где-то.