2

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

GetDIBits 函数在 MSDN 中描述如下:

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

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

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

4

2 回答 2

1

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

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

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

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

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

希望这会有所帮助!

于 2011-09-05T07:23:32.697 回答
1

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

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

所以答案(以字节为单位)是 4*width*height,对齐以从 4 字节边界开始。

于 2011-09-05T07:27:38.813 回答