我正在使用FreeImage库来存储和操作位图数据。我的部分代码要求我截取窗口(在 Windows 中),并将其存储为FBITMAP*
(FreeImage 的位图数据结构)。我解决这个问题的方法包括两个步骤:捕获图像,然后将其转换为FBITMAP*
.
要捕获图像,我会执行以下操作:
HWND window; // Assume this is a valid handle to my window
int width; // width of window client area
int height; // height of window client area
HDC windowDC = GetDC(window);
HDC captureDC = CreateCompatibleDC(windowDC);
HBITMAP screenshot = CreateCompatibleBitmap(windowDC, width, height);
SelectObject(captureDC, screenshot);
BitBlt(captureDC, 0, 0, width, height,
captureDC, 0, 0, SRCCOPY|CAPTUREBLT);
ReleaseDC(window, windowDC);
DeleteDC(captureDC);
FreeImage 提供了一个函数,它返回一个指向像素数据的原始指针:
BYTE* FreeImage_GetBits(FBITMAP*)
常见问题解答解释说HBITMAP
(位图的 WinAPI 句柄)可以转换为FBITMAP*
using GetDIBits
,它将源HBITMAP
和目标原始指针作为参数,并将像素数据从一个复制到另一个。
这种方法的问题是我已经将数据复制了两次——一次是BitBlt
从窗口 DC 复制到HBITMAP
内存 DC 中的选定内容,然后再次从HBITMAP
FreeImage 内存缓冲区复制。我希望消除这种低效率并将数据直接复制到BitBlt
操作中的原始指针。为此,我需要一个内存 DC,其中有一个HBITMAP
选定的内存 DC,它HBITMAP
指向我的内存缓冲区,而不是 Windows 为其分配的内存。
我怎样才能做到这一点?