Working with bitmaps is very useful for me, so I really struggle with the online tutorials and strategies that I read. Basically my goal is to scan the screen for a specific RGB value. I believe that the steps for this are to capture the screen in hBitmap and then create an array of RGB values ββfrom it through which I can scan.
I started with GetPixel, but it is very slow. The solution was to use GetDIBits, which creates an array of RGB values. The problem is that it returns weird and possibly random RGB values.
I am using the following code that I found from another tutorial:
int ScreenX = GetDeviceCaps(GetDC(0), HORZRES); int ScreenY = GetDeviceCaps(GetDC(0), VERTRES); BYTE* ScreenData = new BYTE[3*ScreenX*ScreenY]; void ScreenCap() { HDC hdc = GetDC(GetDesktopWindow()); HDC hdcMem = CreateCompatibleDC (hdc); HBITMAP hBitmap = CreateCompatibleBitmap(hdc, ScreenX, ScreenY); BITMAPINFOHEADER bmi = {0}; bmi.biSize = sizeof(BITMAPINFOHEADER); bmi.biPlanes = 1; bmi.biBitCount = 24; bmi.biWidth = ScreenX; bmi.biHeight = -ScreenY; bmi.biCompression = BI_RGB; bmi.biSizeImage = ScreenX * ScreenY; SelectObject(hdcMem, hBitmap); BitBlt(hdcMem, 0, 0, ScreenX, ScreenY, hdc, 0, 0, SRCCOPY); GetDIBits(hdc, hBitmap, 0, ScreenY, ScreenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS); DeleteDC(hdcMem); ReleaseDC(NULL, hdc); } inline int PosR(int x, int y) { return ScreenData[3*((y*ScreenX)+x)+2]; } inline int PosG(int x, int y) { return ScreenData[3*((y*ScreenX)+x)+1]; } inline int PosB(int x, int y) { return ScreenData[3*((y*ScreenX)+x)]; }
I am testing this with the following code. I pressed Shift to invoke ScreenCap, and then move the cursor to the desired location and press Space to see what RGB value is in that place. Am I completely nuts?
int main() { while ( true ) { if (GetAsyncKeyState(VK_SPACE)){ // Print out current cursor position GetCursorPos(&p); printf("X:%d Y:%d \n",px,py); // Print out RGB value at that position int r = PosR(px, py); int g = PosG(px, py); int b = PosB(px, py); printf("r:%dg:%db:%d \n",r,g,b); } else if (GetAsyncKeyState(VK_ESCAPE)){ printf("Quit\n"); break; } else if (GetAsyncKeyState(VK_SHIFT)){ ScreenCap(); printf("Captured\n"); } } system("PAUSE"); return 0; }