2011-01-29 9 views
6

Vorrei ottenere i valori RGB di un pixel con coordinate x, y sullo schermo. Come potrei fare questo in C++?Ottenere il colore del pixel in C++

Sto provando a creare il mio effetto sfocatura gaussiano.

Questo sarebbe in Windows 7.

Modifica

Quali biblioteche devono essere inclusi per questo per funzionare?

Quello che ho intenzione:

#include <iostream> 

using namespace std ; 

int main(){ 

    HDC dc = GetDC(NULL); 
    COLORREF color = GetPixel(dc, 0, 0); 
    ReleaseDC(NULL, dc); 

    cout << color; 

} 
+1

Informazioni insufficienti. Puoi spiegare perché vuoi farlo? Inoltre, questo è sicuramente OS specifico. –

+0

Mi dispiace, ho aggiunto più informazioni. – rectangletangle

risposta

7

Come menzionato in un post precedente, si desidera la funzione GetPixel dall'API Win32.

GetPixel si trova all'interno di gdi32.dll, quindi se si dispone di una corretta configurazione dell'ambiente, si dovrebbe essere in grado di includere windows.h (che include wingdi.h) e si dovrebbe essere d'oro.

Se si dispone di una configurazione ambiente minima per qualsiasi motivo, è possibile utilizzare direttamente LoadLibrary su gdi32.dll.

Il primo parametro di GetPixel è un handle per il contesto del dispositivo, che può essere recuperato chiamando la funzione GetDC (disponibile anche tramite <windows.h>).

Un esempio di base che carica GetPixel dalla DLL e che stampa il colore del pixel ovunque sia il cursore è il seguente.

#include<windows.h> 
#include<stdio.h> 

int main(int argc, char** argv) 
{ 
    FARPROC pGetPixel; 

    HINSTANCE _hGDI = LoadLibrary("gdi32.dll"); 
    if(_hGDI) 
    { 
     pGetPixel = GetProcAddress(_hGDI, "GetPixel"); 
     HDC _hdc = GetDC(NULL); 
     if(_hdc) 
     { 
      POINT _cursor; 
      GetCursorPos(&_cursor); 
      COLORREF _color = (*pGetPixel) (_hdc, _cursor.x, _cursor.y); 
      int _red = GetRValue(_color); 
      int _green = GetGValue(_color); 
      int _blue = GetBValue(_color); 

      printf("Red: 0x%02x\n", _red); 
      printf("Green: 0x%02x\n", _green); 
      printf("Blue: 0x%02x\n", _blue); 
     } 
     FreeLibrary(_hGDI); 
    } 
    return 0; 
} 
+0

Si noti che se si vuole fare questo per più di pochi pixel 'GetPixel' è un cane lento. Il modo veloce è creare un DC compatibile, creare e selezionare un DIBSection al suo interno e quindi accedere direttamente alla memoria che supporta i suoi pixel. –

12

È possibile utilizzare GetDC sulla finestra NULL per ottenere un contesto di periferica per l'intero schermo, ed è possibile seguire che con una chiamata a GetPixel:

HDC dc = GetDC(NULL); 
COLORREF color = GetPixel(dc, x, y); 
ReleaseDC(NULL, dc); 

Ovviamente, è necessario acquisire e rilasciare il contesto del dispositivo solo una volta mentre si esegue tutta la lettura dei pixel per maggiore efficienza.

+0

@ Anteater7171- Se si '#include ' che dovrebbe essere sufficiente, a condizione che si stia costruendo da Visual Studio. Ho usato questo trucco molti anni fa senza fare nulla di speciale al di là di questo. – templatetypedef

+0

@ Anteater7171- Scusa, non so nulla di questo compilatore e non posso aiutarti molto. Probabilmente vuoi collegare in alcuni dei file DLL di sistema come 'gdi32.lib', e potrebbe valere la pena di cercare su MSDN quali librerie specifiche sono richieste. – templatetypedef