2013-07-08 4 views
4

Я хочу получить значение RGB верхнего/левого пикселя (0; 0) всего дисплея x11.Как получить цвет пикселя экрана в x11

что я получил до сих пор:

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, который не является форматом я признаю.

также, копирование всего экрана, чтобы получить один пиксель, очень медленно. так как это будет использоваться в критически важных средах, я был бы признателен, если кто-то знает более эффективный способ сделать это. Возможно, используя XGetSubImage размера 1x1, но я очень плохо разбираюсь в разработке x11 и не знаю, как это реализовать.

Что мне делать?

+0

Разделить на 57825? –

+0

уверен, вот что я делаю прямо сейчас, но это дает мне крипы, потому что: а) я не знаю, почему это работает, б) я не знаю, насколько это надежно и в) Это все еще медленно (время говорит «cpu 0,054 total» для одного пикселя!). – nonchip

+0

Собственно, согласно [this] (http: // http: //tronche.com/gui/x/xlib/color/structures.html), это должны быть просто неинициализированные значения нежелательной почты. Используйте некоторые базовые бит-мудрые операторы в длинном, возвращаемом XGetPixel, и вы должны быть установлены. –

ответ

7

Я взял ваш код и получил его для компиляции. Значения, напечатанные (масштабируемые до 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, 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/256 << " " << c.green/256 << " " << c.blue/256 << "\n"; 

    return 0; 
} 
+0

Ваш код не компилируется для меня. Мне нужно было добавить 'X' перед некоторыми функциями:' XRootWindow', 'XDefaultScreen' и' XDefaultColormap'. – Rakete1111

2

На странице XColor(3) человек:

красного, зеленого и синего значения всегда находятся в диапазоне от 0 до 65535 включительно, независимо от количества битов, фактически используемых в оборудовании дисплея. Сервер масштабирует эти значения до диапазона, используемого аппаратным обеспечением. Черный представлен (0,0,0), а белый - (65535 65535 65535). В некоторых функциях элемент flags контролирует, какой из красных, зеленых и синих элементов используется и может быть включенным ИЛИ из нуля или более из DoRed, DoGreen и DoBlue.

Таким образом, вы должны масштабировать эти значения в любом диапазоне.

+0

На самом деле я пробовал это (потому что это самое близкое значение имеет смысл), но это более неточно по сравнению с 57825 :-( – nonchip

Смежные вопросы