我正在开发一个用 C++ 编写的用于缓存 GDI 对象的 API,我在其中实现了模仿 win32 API 的不同 Create 方法。一种这样的方法是CreateDIBPatternBrushPt()
,它将 a 接收VOID*
到打包的 DIB 中。VOID*
包含一个结构,BITMAPINFO
后面紧跟一个定义位图像素的字节数组。我对打包的 DIB 进行了一些研究。根据这本书,Programming Windows 以及 Wikipedia,长度等于行长度和biHeight
(的成员BITMAPINFOHEADER
)的乘积,其中:
RowLength = 4 * ((bmi.bcWidth * bmi.bcBitCount + 31) / 32) ;
所以,目前我的想法是做这样的事情:
//copy BIMAPINFO to access width and height
//lpPackedDIB is the VOID* parameter of CreateDIBPatternBrushPt()
BITMAPINFO tmpBitmapInfo;
std::memcpy(&tmpBitmapInfo, lpPackedDIB, sizeof(BITMAPINFO));
//copy entire packed DIB
int rowLength = 4 * ((tmpBitmapInfo.bmiHeader.biWidth * tmpBitmapInfo.bmiHeader.biBitCount + 31) / 32);
std::memcpy(m_pPackedDIB, lpPackedDIB, sizeof(BITMAPINFO) + rowLength * std::abs(bitmapInfo.bmiHeader.biHeight));
这似乎是一种有效的方法吗?我还想知道lpPackedDIB
使用 的人会从哪里来CreateDIBPatternBrushPt()
,以便我可以正确测试这个逻辑。
编辑:
参考资料: https ://msdn.microsoft.com/en-us/library/windows/desktop/dd183493(v=vs.85).aspx https://en.wikipedia.org/wiki/BMP_file_format#File_structure https:// /www-user.tu-chemnitz.de/~heha/petzold/ch15b.htm(特别是“DIB 像素位”部分)