位图压缩

Windows支持使用每像素 8 或 4 位来定义其颜色的位图的格式。 压缩可减少位图所需的磁盘和内存存储。

当位图信息标头结构的 压缩 成员BI_RLE8时,将使用运行长度编码 (RLE) 格式来压缩 8 位位图。 此格式可以采用编码模式或绝对模式进行压缩。 这两种模式都可以在同一位图中的任何位置发生:

  • 编码模式 由两个字节组成:第一个字节指定使用第二个字节中包含的颜色索引绘制的连续像素数。 此外,可以将配对的第一个字节设置为零,以指示表示行尾、位图末尾或增量的转义字符,具体取决于第二个字节的值。 转义的解释取决于配对的第二个字节的值,可以是以下值之一。
含义
0 行尾。
1 位图末尾。
2 三角洲。 转义后的 2 个字节包含无符号值,指示从当前位置到下一个像素的偏移量。

 

  • 绝对模式下,第一个字节为零,第二个字节是 03H 到 FFH 范围内的值。 第二个字节表示后面的字节数,每个字节都包含单个像素的颜色索引。 当第二个字节为两个或更少时,转义的含义与编码模式相同。 在绝对模式下,每个运行都必须为零填充,以在 16 位字边界上结束。

以下示例显示了 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 
move current position 5 right and 1 up 
78 78 
end of line 
1E 1E 1E 1E 1E 1E 1E 1E 1E 
end of RLE bitmap 

压缩 成员BI_RLE4时,将使用 4 位位图的运行长度编码格式压缩位图,该位图还使用编码模式和绝对模式:

  • 在编码模式下,配对的第一个字节包含使用第二个字节中的颜色索引绘制的像素数。 第二个字节包含两个颜色索引,一个是高阶 4 位,另一个是低阶 4 位。 第一个像素是使用高阶 4 位指定的颜色绘制的,第二个像素是使用低阶 4 位的颜色绘制的,第三个是使用高阶 4 位的颜色绘制的,依此,直到绘制第一个字节指定的所有像素为止。
  • 在绝对模式下,第一个字节为零。 第二个字节包含后面的颜色索引数。 后续字节在其高低顺序 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 
move current position 5 right and 1 up 
7 8 7 8 
end of line 
1 E 1 E 1 E 1 E 1 
end of RLE bitmap