我正在尝试使用 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变量。

但是,BITMAPINFOBITMAPINFOHEADER开头,因此BITMAPV5HEADER的前11个字段将满足BITMAPINFO::bmiHeader字段。并且您将 header 的biBitCount字段设置为32并将biCompression字段设置为BI_RGB,因此没有使用颜色表,因此CreateDIBitmap()不会尝试访问BITMAPINFO::bmiColors字段并最终读取BITMAPV5HEADER的alpha / gamma字段作为RGB值。因此,在此特定配置中,将类型转换的BITMAPV5HEADER*指针传递给lpbmi参数(期望使用BITMAPINFO*指针)也是“安全的”。

10-07 12:22