应使用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)。
答案 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字节边界开始。