位图压缩

Windows 支持压缩位图的格式,这些位图以每像素 8 位或 4 位定义其颜色。 压缩会减少位图所需的磁盘和内存存储。

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

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

 

  • 绝对模式下,第一个字节为零,第二个字节是 03H 到 FFH 范围内的值。 第二个字节表示后面的字节数,每个字节包含单个像素的颜色索引。 当第二个字节为 2 个或更少时,转义与编码模式具有相同的含义。 在绝对模式下,每次运行都必须为零填充,才能在 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