如何将BITMAPV5HEADER与CreateDIBitmap功能一起使用

How to use BITMAPV5HEADER with CreateDIBitmap function

本文关键字:功能 一起 CreateDIBitmap BITMAPV5HEADER      更新时间:2023-10-16

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

Inconst BITMAPINFOHEADER *lpbmih,

并在描述中:

lpbmih [in]
指向位图信息标头结构的指针,BITMAPV5HEADER。

是的,类型转换很好。

BITMAPV5HEADER文档指出:

BITMAPV5HEADER结构是位图信息头文件。它是BITMAPINFOHEADER结构的扩展版本。

BITMAPV5HEADER的前 11 个字段与BITMAPINFOHEADER中的字段匹配。 因此,可以安全地将类型转换的BITMAPV5HEADER*指针传递到需要BITMAPINFOHEADER*指针的lpbmih参数。

另一方面,lpbmi参数是另一回事。 它期待一个BITMAPINFO*指针,但你给它一个类型转换的BITMAPV5HEADER*指针。 从技术上讲,BITMAPV5HEADER不是BITMAPINFO的扩展,所以你应该传入一个单独的BITMAPINFO变量而不是你的BITMAPV5HEADER变量。

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