我正在尝试使用 BITMAPV5HEADER
创建具有alpha通道的位图:
BITMAPV5HEADER bi;
bi.bV5Size = sizeof(BITMAPV5HEADER);
bi.bV5Width = width;
bi.bV5Height = -height;
bi.bV5Planes = 1;
bi.bV5BitCount = 32;
bi.bV5Compression = BI_RGB;
bi.bV5SizeImage = 0;
bi.bV5XPelsPerMeter = 0;
bi.bV5YPelsPerMeter = 0;
bi.bV5ClrUsed = 0;
bi.bV5ClrImportant = 0;
bi.bV5AlphaMask = 0x000000FF;
bi.bV5RedMask = 0x0000FF00;
bi.bV5GreenMask = 0x00FF0000;
bi.bV5BlueMask = 0xFF000000;
bi.bV5CSType = LCS_sRGB;
bi.bV5Endpoints = CIEXYZTRIPLE();
bi.bV5GammaRed = 0;
bi.bV5GammaGreen = 0;
bi.bV5GammaBlue = 0;
bi.bV5Intent = LCS_GM_IMAGES;
bi.bV5ProfileData = 0;
bi.bV5ProfileSize = 0;
bi.bV5Reserved = 0;
*hBmp = CreateDIBitmap(hdc, (BITMAPINFOHEADER *) &bi, CBM_INIT, data, (BITMAPINFO *)&bi, DIB_RGB_COLORS);
但是我不确定类型转换是否正确。
CreateDIBitmap()
documentation尚不清楚,因为在字段定义中它说:并在说明中:
最佳答案
是的,类型转换很好。
BITMAPV5HEADER
文档指出:
BITMAPV5HEADER
的前11个字段与BITMAPINFOHEADER
中的字段匹配。这样,您可以安全地将类型转换的BITMAPV5HEADER*
指针传递到需要lpbmih
指针的BITMAPINFOHEADER*
参数。
另一方面,lpbmi
参数是另一个故事。它期望使用BITMAPINFO*
指针,但是您给了它一个类型转换的BITMAPV5HEADER*
指针。从技术上讲,BITMAPV5HEADER
不是BITMAPINFO
的扩展,因此您应该传递一个单独的BITMAPINFO
变量而不是BITMAPV5HEADER
变量。
但是,BITMAPINFO
以BITMAPINFOHEADER
开头,因此BITMAPV5HEADER
的前11个字段将满足BITMAPINFO::bmiHeader
字段。并且您将 header 的biBitCount
字段设置为32并将biCompression
字段设置为BI_RGB
,因此没有使用颜色表,因此CreateDIBitmap()
不会尝试访问BITMAPINFO::bmiColors
字段并最终读取BITMAPV5HEADER
的alpha / gamma字段作为RGB值。因此,在此特定配置中,将类型转换的BITMAPV5HEADER*
指针传递给lpbmi
参数(期望使用BITMAPINFO*
指针)也是“安全的”。