创建指向现有内存缓冲区的HBITMAP

时间:2013-03-22 17:11:43

标签: c++ winapi bitmap freeimage

我正在使用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说明可以使用HBITMAPFBITMAP*(位图的WinAPI句柄)转换为GetDIBits,其中包含HBITMAP和目标原始指针作为参数,并将像素数据从一个复制到另一个。

这种方法的问题在于我已经将数据复制了两次 - 一次在BitBlt从窗口DC到内存DC中选择的HBITMAP,然后再从{{1到FreeImage内存缓冲区。我希望消除这种低效率,并将数据直接复制到HBITMAP操作中的原始指针。为了实现这一点,我需要一个内存DC,其中选择了BitBlt,并且HBITMAP指向我的内存缓冲区而不是Windows分配给它的内存。

我怎样才能做到这一点?

0 个答案:

没有答案