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

时间:2011-09-05 07:01:04

标签: c++ visual-c++ bitmap gdi dib

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

GetDNIB函数在MSDN中描述如下:

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的宽度和高度为Bmp_Width& Bmp_Height;并且位图是32位(RGBA)。

2 个答案:

答案 0 :(得分:1)

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

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

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

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

注意处理图像字节的对齐方式!

希望这会有所帮助!

答案 1 :(得分:1)

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

由于您使用的是32位颜色,因此每条扫描线自然满足该要求,只要您确保第一条扫描线(即内存块的起点)是4字节对齐的。

因此,以字节为单位的答案是4 *宽*高,对齐以从4字节边界开始。