0

現在、非常に遅い方法を使用せずに、ターゲット ウィンドウからコピーされたビットマップの個々のピクセルにアクセスしてテストする方法を探していますGetPixel()memDC呼び出された時点でビットマップのコピーが含まれている場合BitBlt()、個々のピクセルをトラバースしてその値をテストするより高速な方法はありますか?

HWND target = (HWND)0x0002051A; // this is just for debugging; when i get to the release version it will detect the intended window automatically
HBITMAP hBitmap;
RECT winRect;
HDC winDC, memDC;
winDC = GetDC(target);
GetClientRect(target, &winRect);
memDC = CreateCompatibleDC(winDC);
hBitmap = CreateCompatibleBitmap(winDC, winRect.right-winRect.left, winRect.bottom-winRect.top);
SelectObject(memDC, hBitmap);
BitBlt(memDC, 0, 0, winRect.right-winRect.left, winRect.bottom-winRect.top, winDC, 0, 0, SRCCOPY);
// Perform other tasks based on the color values of pixels...
ReleaseDC(memDC);
ReleaseDC(winDC);
DeleteObject(hBitmap);
4

1 に答える 1

2

を使用してターゲットビットマップを作成すると、CreateDIBSectionを経由せずに生のピクセルにアクセスできますGetPixel

たとえば、BITMAPINFO渡すパスで32 bpp画像(解釈が最も簡単な形式)が指定されている場合、。などを使用して任意のピクセルにアクセスできます*( ((LPDWORD)pBits) + ( y * width ) + x)

さまざまなビット深度形式がメモリにどのように配置されるかの詳細については、ドキュメントを参照してくださいBITMAPINFOHEADER。また、a)ビットマップ行は常にDWORDで整列され、b)トップダウンビットマップを作成するには負の高さを渡す必要があることに注意してください。

また、を使用しない、または使用できない場合はCreateDIBSection、を使用GetDIBitsして、希望するDIB形式のビットマップのメモリ内コピーを取得できます。(呼び出す前に、DCからビットマップが選択されていることを確認してくださいGetDIBits。)

于 2013-03-05T20:19:12.343 に答える