Ottenere il colore di un pixel da una struttura BITMAP.

di il
2 risposte

Ottenere il colore di un pixel da una struttura BITMAP.

Salve a tutti, sto scrivendo un programma in C++ che sia in grado di fare uno screenshot di una specifica area dello schermo, successivamente salvarlo in una variabile HBITMAP, poi convertirla in BITMAP, e adesso vorrei che il programma sia in grado di analizzare se in un certo pixel del BITMAP è presente un certo colore. Il mio problema è proprio qui, ho il BITMAP ma non so come analizzarne la struttura, ovvero come controllarne i singoli pixel. Grazie in anticipo per l'aiuto

Codice:

#include <iostream>
#include <windows.h>

using namespace std;

void screenshot(POINT,POINT);

int main()
{
	POINT a,b;
    	a.x=0;
    	a.y=0;
    	b.x=500;
    	b.y=500;
    
    	screenshot(a,b);
	
	return 0;
}

void screenshot(POINT a, POINT b)
{
    	// Salvo lo screenshot in HBITMAP
    	HDC     hScreen = GetDC(NULL);
    	HDC     hDC     = CreateCompatibleDC(hScreen);
    	HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, abs(b.x-a.x), abs(b.y-a.y));
    	HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
    	BOOL    bRet    = BitBlt(hDC, 0, 0, abs(b.x-a.x), abs(b.y-a.y), hScreen, a.x, a.y, SRCCOPY);
 
    	// Converto HBITMAP in BITMAP
    	BITMAP Btmp;
    	GetObject(hBitmap, sizeof(BITMAP), &Btmp);
 
    	// Pulizia
    	SelectObject(hDC, old_obj);
    	DeleteDC(hDC);
    	ReleaseDC(NULL, hScreen);
    	DeleteObject(hBitmap);
}

2 Risposte

  • Re: Ottenere il colore di un pixel da una struttura BITMAP.

    Prendi spunto da questo codice
    
    /* Globals */
    int ScreenX = 0;
    int ScreenY = 0;
    BYTE* ScreenData = 0;
    
    void ScreenCap() 
    {
        HDC hScreen = GetDC(NULL);
        ScreenX = GetDeviceCaps(hScreen, HORZRES);
        ScreenY = GetDeviceCaps(hScreen, VERTRES);
    
        HDC hdcMem = CreateCompatibleDC(hScreen);
        HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, ScreenX, ScreenY);
        HGDIOBJ hOld = SelectObject(hdcMem, hBitmap);
        BitBlt(hdcMem, 0, 0, ScreenX, ScreenY, hScreen, 0, 0, SRCCOPY);
        SelectObject(hdcMem, hOld);
    
        BITMAPINFOHEADER bmi = {0};
        bmi.biSize = sizeof(BITMAPINFOHEADER);
        bmi.biPlanes = 1;
        bmi.biBitCount = 32;
        bmi.biWidth = ScreenX;
        bmi.biHeight = -ScreenY;
        bmi.biCompression = BI_RGB;
        bmi.biSizeImage = 0;// 3 * ScreenX * ScreenY;
    
        if(ScreenData)
            free(ScreenData);
        ScreenData = (BYTE*)malloc(4 * ScreenX * ScreenY);
    
        GetDIBits(hdcMem, hBitmap, 0, ScreenY, ScreenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
    
        ReleaseDC(GetDesktopWindow(),hScreen);
        DeleteDC(hdcMem);
        DeleteObject(hBitmap);
    }
    
    inline int PosB(int x, int y) 
    {
        return ScreenData[4*((y*ScreenX)+x)];
    }
    
    inline int PosG(int x, int y) 
    {
        return ScreenData[4*((y*ScreenX)+x)+1];
    }
    
    inline int PosR(int x, int y) 
    {
        return ScreenData[4*((y*ScreenX)+x)+2];
    }
    
    bool ButtonPress(int Key)
    {
        bool button_pressed = false;
    
        while(GetAsyncKeyState(Key))
            button_pressed = true;
    
        return button_pressed;
    }
    
    int main() 
    {
        while (true) 
        {
           if (ButtonPress(VK_SPACE))
           {  
    
              // Print out current cursor position
              POINT p;
              GetCursorPos(&p);
              printf("X:%d Y:%d \n",p.x,p.y);
              // Print out RGB value at that position
              std::cout << "Bitmap: r: " << PosR(p.x, p.y) << " g: " << PosG(p.x, p.y) << " b: " << PosB(p.x, p.y) << "\n";
    
           } else if (ButtonPress(VK_ESCAPE))
           {
              printf("Quit\n");
              break;
           } else if (ButtonPress(VK_SHIFT))
           {
              ScreenCap();
              printf("Captured\n");
           }
        }
    
        system("PAUSE");
        return 0;
    }
    
  • Re: Ottenere il colore di un pixel da una struttura BITMAP.

    oregon ha scritto:


    Prendi spunto da questo codice
    Grazie mille, ho risolto
Devi accedere o registrarti per scrivere nel forum
2 risposte