2013-03-05 62 views
0

我目前正在寻找一种方法来访问和测试从目标窗口中复制的位图的各个像素,而不使用非常慢的方法GetPixel()。由于memDC在调用BitBlt()时包含位图的副本,是否有更快的方式来遍历各个像素并测试它们的值?访问像素的24位位图,而不使用GetPixel()?

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); 

回答

2

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

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

请参阅BITMAPINFOHEADER的文档以了解不同的位深度格式在内存中的布局细节,并记住a)位图行始终是DWORD对齐的,并且b)您需要传递负高度以创建一个top-下位图。

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

+0

非常感谢!现在使用'GetDIBits',我的算法运行得非常快,比以前快得多! – 2013-03-05 21:12:42