使用GetDibits函数从HBITMAP接收到的DIB数据应该分配多少内存?
-
25-10-2019 - |
题
使用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个字节边界对齐。
不隶属于 StackOverflow