【问题标题】:How much memory should be allocated for the DIB data received from HBITMAP using GetDIBits function?使用 GetDIBits 函数从 HBITMAP 接收到的 DIB 数据应该分配多少内存?
【发布时间】:2011-11-10 09:50:28
【问题描述】:

使用 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)。

【问题讨论】:

  • 有个函数叫 CreateDIBitmap 但就是不知道这个函数能不能解决这个问题

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


【解决方案1】:

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

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

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

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

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

希望这会有所帮助!

【讨论】:

  • 你的意思是 sizeof(BITMAP) 确定吗?
  • @beren:DIB 数据是否包含 BMP 标头?如果是这样, bmpObject.bmWidthBytes*bmpObject.bmHeight 仍然是 DIB 数据的正确大小吗?因为我知道这个DIB数据实际上是内存中.bmp文件的图像。
  • 头和位是分开的
  • @Paul:如果你的意思是BITMAP结构的字段bmBits,那么NO,数据不包含头部。此外,您必须注意高度可能是负数(表示自下而上的位图)。最后,位图数据格式可能不是您所期望的。您必须检查字段 bmBitsPixel。
  • @beren:感谢关于负高度值的通知
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 2011-05-09
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多