2013-07-08 4 views
4

전체 x11 디스플레이의 위쪽/왼쪽 픽셀 (0; 0)의 RGB 값을 가져 오려고합니다. 내가 지금까지 알아 낸x11에서 화면 픽셀의 색을 얻는 방법

는 : 그들은 내가 인식 어떤 형식입니다 0..57825, 같이 동안

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)해야합니다.

또한 하나의 픽셀을 얻으려고 전체 화면을 복사하는 것은 매우 느립니다. 이것은 속도가 중요한 환경에서 사용될 것이기 때문에 누군가가 이것을 수행하는 더 좋은 방법을 알고 있다면 고맙겠습니다. 어쩌면 1x1 크기의 XGetSubImage을 사용하지만, x11 개발에서 나쁘고 구현 방법을 모르겠습니다.

어떻게해야합니까? XColor(3) 사람 페이지에서

+0

57825로 나누기? –

+0

그게 바로 지금하고있는 일입니다. 그러나 그것은 왜 저주합니다. 왜냐하면 왜 그것이 효과가 있는지, b) 나는 그것이 얼마나 신뢰할 수 있는지, 그리고 c) 여전히 느리다는 것을 알지 못하기 때문입니다. 단일 픽셀의 경우 "cpu 0,054 total'"). – nonchip

+0

사실 [This] (http : //tronche.com/gui/x/xlib/color/structures.html)에 따르면, 초기화되지 않은 정크 값이어야합니다. XGetPixel에서 반환 한 long에 대해 몇 가지 기본 비트 연산자를 사용하면 설정해야합니다. –

답변

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

:

빨강, 녹색, 파랑 값의 범위는 항상 0을 포함 65535, 실제로 디스플레이 하드웨어에 사용되는 비트 수의 독립. 서버는이 값을 하드웨어가 사용하는 범위로 조정합니다. 검정색은 (0,0,0)으로 표시되고 흰색은 (65535,65535,65535)로 표시됩니다. 일부 함수에서 flags 멤버는 빨간색, 녹색 및 파란색 멤버 중 어느 것이 사용되는지 제어하며 0 개 이상의 DoRed, DoGreen 및 DoBlue를 포함하는 OR 일 수 있습니다.

그래서이 값을 원하는 범위로 확장해야합니다.

+0

실제로 나는 이것을 시도했다. (가장 가까운 값을 가지고 있기 때문에), 57825 :-( – nonchip

관련 문제