3

我正在使用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 中的选定内容,然后再次从HBITMAPFreeImage 内存缓冲区复制。我希望消除这种低效率并将数据直接复制到BitBlt操作中的原始指针。为此,我需要一个内存 DC,其中有一个HBITMAP选定的内存 DC,它HBITMAP指向我的内存缓冲区,而不是 Windows 为其分配的内存。

我怎样才能做到这一点?

4

0 回答 0