我正在使用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*)
The FAQ说明可以使用HBITMAP
将FBITMAP*
(位图的WinAPI句柄)转换为GetDIBits
,其中包含HBITMAP
和目标原始指针作为参数,并将像素数据从一个复制到另一个。
这种方法的问题在于我已经将数据复制了两次 - 一次在BitBlt
从窗口DC到内存DC中选择的HBITMAP
,然后再从{{1到FreeImage内存缓冲区。我希望消除这种低效率,并将数据直接复制到HBITMAP
操作中的原始指针。为了实现这一点,我需要一个内存DC,其中选择了BitBlt
,并且HBITMAP
指向我的内存缓冲区而不是Windows分配给它的内存。
我怎样才能做到这一点?