应该使用GetDIBits函数为从HBITMAP接收的DIB数据分配多少内存?

MSDN中对GetDIBits函数的描述如下:

int GetDIBits(
  __in     HDC hdc,
  __in     HBITMAP hbmp,
  __in     UINT uStartScan,
  __in     UINT cScanLines,
  __out    LPVOID lpvBits,
  __inout  LPBITMAPINFO lpbi,
  __in     UINT uUsage
);

但是,必须在调用GetDIBits之前分配用于接收数据lpvBits的缓冲区,因为GetDIBits不会自动分配该缓冲区。

问题是应该分配多少内存来接收DIB数据?假设HBITMAP的width&height为Bmp_Width&Bmp_Height;位图是32位(RGBA)。

最佳答案

我认为最简单的方法是调用GetObject()函数(以及BTW以获取图像位):

BITMAP bmpObject;
GetObject(hBitmap, sizeof(BITMAP), &bmpObject);

然后,您只需使用位图字段:
LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

注意对齐对齐处理图像字节!

希望这会有所帮助!

10-05 21:57