BITMAPINFOHEADER结构包含有关与设备无关的位图(DIB)的维度和颜色格式的信息。
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
会员
bisiz到
指定结构所需的字节数。
biWidth
指定位图的宽度(以像素为单位)。
biHeight
指定位图的高度(以像素为单位)。如果biHeight为正,位图为自底向上的DIB,其原点为左下角。如果biHeight为负,则位图是自顶向下的DIB,其原点是左上角。
双翼飞机
指定目标设备的平面数。该值必须设置为1。
biBitCount
指定每像素的位数。该值必须为1,4,8,16,24或32。
biCompression
指定压缩自下而上位图的压缩类型(自上而下的DIB不能被压缩)。它可以是以下值之一:
值 | 描述 |
BI_RGB | 未压缩的格式。 |
BI_RLE8 | 用于每像素8位的位图的游程长度编码(RLE)格式。压缩格式是一个双字节格式,包括一个计数字节,后跟一个包含颜色索引的字节。有关详细信息,请参阅以下备注部分。 |
BI_RLE4 | 用于每像素4位的位图的RLE格式。压缩格式是一个两字节格式,包括一个计数字节,后跟两个字长颜色索引。有关详细信息,请参阅以下备注部分。 |
BI_BITFIELDS | 指定位图未被压缩,颜色表由三个双字颜色掩码组成,分别指定每个像素的红色,绿色和蓝色分量。当使用16位和32位每像素位图时,这是有效的。 |
biSizeImage
指定图像的大小(以字节为单位)。BI_RGB位图可以设置为0。
biXPelsPerMeter
指定位图的目标设备的水平分辨率(以像素/米为单位)。应用程序可以使用该值从与当前设备的特性最匹配的资源组中选择位图。
biYPelsPerMeter
指定位图的目标设备的垂直分辨率(以像素/米为单位)。
biClrUsed
指定位图中实际使用的颜色表中的颜色索引数。如果该值为零,则位图使用与biCompression指定的压缩模式的biBitCount成员的值对应的最大颜色数。
如果biClrUsed非零,并且biBitCount成员小于16,则biClrUsed成员指定图形引擎或设备驱动程序访问的实际颜色数。如果biBitCount为16或更大,则biClrUsed成员指定用于优化Windows调色板性能的颜色表的大小。如果biBitCount等于16或32,则最佳调色板将在三个双字掩码之后立即开始。
如果位图是一个打包位图(位图数组立即跟随BITMAPINFO标题并由单个指针引用的位图),则biClrUsed成员必须为0或颜色表的实际大小。
biClrImportant
指定显示位图被认为重要的颜色索引数。如果该值为零,所有颜色都很重要。
备注
BITMAPINFO结构结合了BITMAPINFOHEADER结构和颜色表,以提供DIB的尺寸和颜色的完整定义。有关DIB的更多信息,请参阅BITMAPINFO数据结构的描述。
应用程序应使用bisiz到成员中存储的信息来定位BITMAPINFO结构中的颜色表,如下所示:
pColor = ((LPSTR)pBitmapInfo +
(WORD)(pBitmapInfo->bmiHeader.biSize));
Windows支持用于压缩位图的格式,每个像素定义八位或四位的颜色。压缩可减少位图所需的磁盘和内存存储空间。以下段落描述这些格式。
当biCompression成员是BI_RLE8时,使用8位位图的游程长度编码(RLE)格式压缩位图。该格式可以以编码或绝对模式进行压缩。两种模式都可以在同一位图中的任何位置进行。
*编码模式由两个字节组成:第一个字节指定使用第二个字节中包含的颜色索引绘制的连续像素数。此外,该对的第一个字节可以设置为零,以指示表示行尾,位图结束或增量的转义。转义的解释取决于对的第二个字节的值,可以是以下之一:
值 | 含义 |
0 | 行结束。 |
1 | 位图结束 |
2 | 三角洲。转义后的两个字节包含无符号值,指示当前位置下一个像素的水平和垂直偏移。 |
*在绝对模式下,第一个字节为零,第二个字节为03H至FFH范围内的值。第二个字节表示随后的字节数,每个字节包含单个像素的颜色索引。当第二个字节为2或更小时,转义符与编码模式中的含义相同。在绝对模式下,每个运行必须对齐在一个单词边界上。
以下示例显示了8位压缩位图的十六进制值。
03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01
02 78 00 00 09 1E 00 01
该位图将如下展开(两位数值表示单个像素的颜色索引):
04 04 04
06 06 06 06 06
45 56 67
78 78
向右移动当前位置5,向下移动1
78 78
行结束
1E 1E 1E 1E 1E 1E 1E 1E 1E
结束RLE位图
当biCompression成员是BI_RLE4时,位图通过使用4位位图的游程长度编码格式进行压缩,该位图也使用编码和绝对模式:
*在编码模式下,该对的第一个字节包含使用第二个字节中的颜色索引绘制的像素数。第二个字节包含两个颜色索引,一个在高位四位,一个位于低位四位。第一个像素使用由高阶四位指定的颜色绘制,第二个是使用低四位中的颜色绘制的,第三个是使用高阶四位的颜色绘制的,以及直到第一个字节指定的所有像素都被绘制为止。
*在绝对模式下,第一个字节为零,第二个字节包含随后的颜色索引数,后续字节包含高和低四位的颜色索引,每个像素的颜色索引为一个。在绝对模式下,每个运行必须对齐在一个单词边界上。为BI_RLE8描述的行尾,位图和增量转义也适用于BI_RLE4压缩。
以下示例显示了4位压缩位图的十六进制值。
03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01
04 78 00 00 09 1E 00 01
该位图将扩展如下(单位数值表示单个像素的颜色索引):
0 4 0
0 6 0 6 0
4 5 5 6 6 7
7 8 7 8
向右移动当前位置5,向下移动1
7 8 7 8
行结束
1 E 1 E 1 E 1 E 1
结束RLE位图
如果biHeight为负,表示自顶向下的DIB,则biCompression必须为BI_RGB或BI_BITFIELDS。自上而下的DIB无法压缩。
也可以看看