Prog: Pixelfarbe auslesen

Hallo,
es kommt oft vor, dass man Pixelfarbe irgendwo auslesen will.
Ich hab einfach ein Tool geschrieben, das die Pixelfarbe unter der Mausposition auslesen und als RGB Wert darstellen kann(auch als Farbvisualisierung).

Das Program ist in C/C++ geschrieben und läuft nur unter Windows, da ich WinAPI verwende.

Sourcecode ist sehr klein und Kommentare sind auch enthalten:

Download(src+exe): getPixel

Sourcecode(benötigt gdi32.lib):

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

//process the window messages
LRESULT CALLBACK windowProc(HWND, UINT, WPARAM, LPARAM);
//extract RGB values from COLORREF
void toRGB(COLORREF color, unsigned char *rgb);

//handle to the screen
HDC screen;
//timer id
unsigned int timer = 100;
//interval in ms to get the color
unsigned int interval = 100;
//color of the pixel under mouse pointer
//colorref has form: 0x00bbggrr
COLORREF pixelColor = 0;
COLORREF pixelColorLast = 0;
//color rectangle for visualization
RECT colorRect;

//main function
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow)
{
    //program and class name
    const char *progName = "getPixel";

    //create window class
    WNDCLASS windowClass;

    //message function
    windowClass.lpfnWndProc = windowProc;
    //enable redrawing
    windowClass.style       = CS_HREDRAW | CS_VREDRAW;
    //program instance
    windowClass.hInstance   = hInstance;
    //standard cursor
    windowClass.hCursor     = LoadCursor(NULL, IDC_ARROW);
    //standard icon
    windowClass.hIcon       = LoadIcon(NULL, IDI_APPLICATION);
    //gray background
    windowClass.hbrBackground = static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));
    //extra buffer
    windowClass.cbClsExtra  = 0;
    windowClass.cbWndExtra  = 0;
    //name to represent our window class
    windowClass.lpszClassName = progName;
    //we don't need menu
    windowClass.lpszMenuName  = NULL;

    //register our class to windows
    if(!RegisterClass(&windowClass))
            return 0;

    //create window
    HWND window;
    window = CreateWindowEx(WS_EX_TOPMOST, //allways on top of others
                            progName, //name of window class
                            progName, //text in the titlebar
                            //no resizable window without minimize option
                            WS_OVERLAPPEDWINDOW^WS_MAXIMIZEBOX^WS_THICKFRAME,
                            //default window position
                            CW_USEDEFAULT, CW_USEDEFAULT,
                            //window width and height
                            300, 185,
                            //no parent window
                            NULL,
                            //no menu
                            NULL,
                            hInstance,
                            //no extra parameters
                            NULL);

    //quit if we can't create a window
    if(!window)
        return 0;

    //show
    ShowWindow(window, nCmdShow);
    UpdateWindow(window);

    //process messages
    MSG message;
    while(GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    return message.wParam;
}

LRESULT CALLBACK windowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        //window creation
        case WM_CREATE:
        {
            //get the whole display context
            screen = CreateDC("DISPLAY",NULL,NULL,NULL);
            if(!screen)
                return 0;

            //set timer to get the pixel color
            if(!SetTimer(hwnd, timer, interval, NULL))
                return 0;

            //rectangle for color visualisation
            colorRect.left   = 180;
            colorRect.top    = 15;
            colorRect.right  = 280;
            colorRect.bottom = 126;

        }break;
        //timer
        case WM_TIMER:
        {
            //get the current mouse position
            POINT mousePos;
            GetCursorPos(&mousePos);

            //get the color under the mouse position
            pixelColor = GetPixel(screen, mousePos.x, mousePos.y);

            //if the color doesn't change, then don't redraw
            if(pixelColor!=pixelColorLast)
                InvalidateRect(hwnd, NULL, true);

            //save color for comparisson
            pixelColorLast = pixelColor;
        }break;
        //repaint
        case WM_PAINT:
        {
            //get the window device context for drawing
            PAINTSTRUCT ps;
            HDC windowDC;
            windowDC = BeginPaint(hwnd, &ps);

            //background color for text
            SetBkColor(windowDC, 0x848284);

            //draw rectangular frame around our rectangle
            Rectangle(windowDC, colorRect.left-1,  colorRect.top-1,
                        colorRect.right+1, colorRect.bottom+1);

            //draw the rectangle in pixel color for more visuualization
            HBRUSH color = CreateSolidBrush(pixelColor);
            FillRect(windowDC, &colorRect, color);

            char text[50] = " ";
            //saves rgb values
            unsigned char rgbColors[3];
            //extract RGB values from COLORREF
            toRGB(pixelColor, rgbColors);

            //Output of information
            sprintf(text, "Red   :  0x%02X  %d", rgbColors[0], rgbColors[0]);
            TextOut(windowDC, 10, 15, text, strlen(text));

            sprintf(text, "Green:  0x%02X %d", rgbColors[1], rgbColors[1]);
            TextOut(windowDC, 10, 45, text, strlen(text));

            sprintf(text, "Blue  :  0x%02X  %d", rgbColors[2], rgbColors[2]);
            TextOut(windowDC, 10, 75, text, strlen(text));

            sprintf(text, "RGB Color:  0x%02X%02X%02X", rgbColors[0], rgbColors[1],  rgbColors[2]);
            TextOut(windowDC, 10, 115, text, strlen(text));

            EndPaint(hwnd, &ps);
        }break;
        case WM_DESTROY:
        {
            //clean up
            DeleteDC(screen);
            KillTimer(hwnd, timer);
            PostQuitMessage(0);
            return 0;
        }break;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

//rgb[0] = red
//rgb[1] = green
//rgb[2] = blue
void toRGB(COLORREF color, unsigned char *rgb)
{
    rgb[0] = (color & 0x000000FF);
    rgb[1] = (color & 0x0000FF00)>>8;
    rgb[2] = (color & 0x00FF0000)>>16;
}

Screenshot:
getpixel.PNG



MADCrew
 
Ich sag mal danke und werd es bei Gelegenheit testen.
Aber ich hab auf jeden Fall auch schon öfter nach sowas gesucht.

Gruß
schmitti81
 
Zurück
Oben