如何将 BITMAPV5HEADER 与 CreateDIBitmap 函数一起使用

How to use BITMAPV5HEADER with CreateDIBitmap function

我正在尝试使用 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 不清楚,因为在字段定义中它说:

In const BITMAPINFOHEADER *lpbmih,

并在描述中:

lpbmih [in]
A pointer to a bitmap information header structure, BITMAPV5HEADER.

是的,type-casts 没问题。

BITMAPV5HEADER 文档指出:

The BITMAPV5HEADER structure is the bitmap information header file. It is an extended version of the BITMAPINFOHEADER structure.

BITMAPV5HEADER 的前 11 个字段与 BITMAPINFOHEADER 中的字段匹配。因此,您可以安全地将 type-casted BITMAPV5HEADER* 指针传递给 lpbmih 参数,其中需要 BITMAPINFOHEADER* 指针。

另一方面,

lpbmi 参数是另一回事。它期待一个 BITMAPINFO* 指针,但你给它一个 type-casted BITMAPV5HEADER* 指针。从技术上讲,BITMAPV5HEADER 不是 BITMAPINFO 的扩展,因此您应该传入一个单独的 BITMAPINFO 变量而不是 BITMAPV5HEADER 变量。

然而,BITMAPINFOBITMAPINFOHEADER开头,所以BITMAPV5HEADER的前11个字段将满足BITMAPINFO::bmiHeader字段。并且您将 header 的 biBitCount 字段设置为 32,将 biCompression 字段设置为 BI_RGB,因此没有使用颜色 table,因此 CreateDIBitmap() 不会尝试访问 BITMAPINFO::bmiColors 字段并最终将 BITMAPV5HEADER 的 alpha/gamma 字段读取为 RGB 值。因此,在这个特定的配置中,将 type-casted BITMAPV5HEADER* 指针传递给 lpbmi 参数,其中需要 BITMAPINFO* 指针也是 "safe".