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 回答