Bitmap'lerle çalışmak benim için çok yeni, dolayısıyla okuduğum çevrimiçi eğiticiler ve stratejilerle gerçekten uğraştım. Temel olarak amacım, ekranı belirli bir RGB değeri için taramaktır. Bunu yapmak için adımların, ekranı bir hBitmap'te yakalamak ve daha sonra içinden tarayabileceğim bir dizi RGB değeri üretmek olduğuna inanıyorum.C++ RGB'yi hBitmap'den alma
Başlangıçta GetPixel ile başladım, ancak bu çok yavaş. Çözüm, RGB değerleri dizisini üreten GetDIBits'i kullanmaktı. Sorun, bunun yerine garip ve muhtemelen rastgele RGB değerlerini döndürmesidir. Aşağıdaki kod ile bunu test
/* Globals */
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)];
}
:
ben başka öğretici bulunamadı Aşağıdaki kodu kullanıyorum. ScreenCap'i çağırmak için Shift'e basıyorum ve ardından imlecimi istenen konuma taşıyorum ve RGB değerinin o konumda ne olduğunu görmek için Space'e basıyorum. Tamamen deliriyor muyum?
int main() {
while (true) {
if (GetAsyncKeyState(VK_SPACE)){
// Print out current cursor position
GetCursorPos(&p);
printf("X:%d Y:%d \n",p.x,p.y);
// Print out RGB value at that position
int r = PosR(p.x, p.y);
int g = PosG(p.x, p.y);
int b = PosB(p.x, p.y);
printf("r:%d g:%d b:%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;
}
Sen RGB talebinde, ancak kod BGR gibi verileri tedavi gibi görünüyor . –
Okuduğum şeyden, GetDIBits'in doğasının bu sırayla döndüğüne inanıyorum. Ama sanırım, tüm r = g = b olan tamamen siyah/beyaz bir ekranda test etsem bile, rgb değerlerinin hala rasgele olduğu görülüyor. Bu yüzden aslında beyaz olduğunda siyahı ve bazen siyah olduğunda beyazı bildirir. – Mike
[GetDIBits ve X, Y kullanarak pikseller arasında döngü] olası bir kopyası (http://stackoverflow.com/questions/3688409/getdibits-and-loop-through-pixels-using-xy) – sashoalm