访问24位位图的像素,而不使用GetPixel()?

时间:2013-03-05 20:06:39

标签: windows winapi colors bitmap gdi

我目前正在寻找一种方法来访问和测试目标窗口中复制的位图的各个像素,而不使用非常慢的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);

1 个答案:

答案 0 :(得分:2)

如果使用CreateDIBSection创建目标位图,则可以访问原始像素,而不必通过GetPixel

E.g。如果您传递的BITMAPINFO指定了32-bpp图像(要解释的最简单格式),则可以使用*( ((LPDWORD)pBits) + ( y * width ) + x)之类的内容访问任意像素。

有关如何在内存中布置不同bitdepth格式的详细信息,请参阅BITMAPINFOHEADER的文档,并记住a)位图行始终是DWORD对齐的,并且b)您需要传递负高度才能创建自上而下的位图。

如果您不使用或不能使用CreateDIBSection,则可以使用GetDIBits以所需的DIB格式获取位图的内存副本。 (确保在调用GetDIBits之前从任何DC中选择位图。)