使用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之前,必须分配接收数据LPVBIT的缓冲区,因为GetDibits不会自动分配此缓冲区。

问题是应该分配多少内存以接收DIB数据?认为HBITMAP具有BMP_WIDTH和BMP_HEIGHT的宽度和高度;位图为32位(RGBA)。

有帮助吗?

解决方案

我认为最简单的方法是调用getObject()函数(和顺便说一句以获取图像位):

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

然后,您只需使用位图字段:

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

请注意对齐惠姆处理图像字节!

希望这会有所帮助!

其他提示

LPVBIT指向的内存必须是一个扫描线的大小,乘以高度。每个扫描线必须在DWORD边界上对齐。

由于您使用的是32位颜色,因此每条扫描线自然会满意,只要您确保第一个扫描线,即记忆块的开始,是4个字节对齐。

因此,以字节测量的答案为4*宽度*高度,以4个字节边界对齐。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top