与RLE位图中的字边界对齐:Microsoft文档中的矛盾

时间:2017-09-21 17:18:10

标签: bitmap compression memory-alignment run-length-encoding

Microsoft的Bitmap Compression文档,特别是BI_RLE8(使用游程编码压缩的8位索引颜色)的描述,包括以下绝对模式的描述:

  

在绝对模式下,第一个字节为零,第二个字节为03H到FFH范围内的值。第二个字节表示后面的字节数,每个字节包含单个像素的颜色索引[到颜色表]。 [...]在绝对模式下,每次运行必须在字边界上对齐。

据推测,这意味着具有奇数编号长度的运行必须填零(尽管未指定,我假设在此上下文中字长为16位)。

但是,文档中的示例包含一个奇数编号的运行,它不会在字边界上结束:

[03 04] [05 06] [00 03 45 56 67] [02 78] [00 02 05 01] [02 78] [00 00] [09 1E] [00 01] 

00 03 45 56 6700 03 45 56 67 00吗?

2 个答案:

答案 0 :(得分:2)

为加强对问题和现有答案的主张,我找到了包含特定BMP格式规范的文档(http://www.martinreddy.net/gfx/2d/BMP.txt)。

很有趣的是,这里显示了相同的示例,除了添加了正确的填充字节(在引号下方):

Absolute mode is signaled by the first byte in the pair being set to zero and
the second byte to a value between 0x03 and 0xFF. The second byte represents
the number of bytes that follow, each of which contains the color index of a
single pixel. Each run must be aligned on a word boundary.  Following is an
example of an 8-bit RLE bitmap (the two-digit hexadecimal values in the
second column represent a color index for a single pixel):

Compressed data     Expanded data

03 04               04 04 04 
05 06               06 06 06 06 06 
00 03 45 56 67 00   45 56 67 
02 78               78 78 
00 02 05 01         Move 5 right and 1 down 
02 78               78 78 
00 00               End of line 
09 1E               1E 1E 1E 1E 1E 1E 1E 1E 1E 
00 01               End of RLE bitmap 

答案 1 :(得分:1)

我修改了一个8位索引颜色位图,结果似乎表明运行应该实际上是零填充以在16位字边界上结束(因此00 03 45 56 67应该是00 03 45 56 67 00

详细说明:

  • 在Microsoft Paint(版本1607,Windows 10附带)中,我按以下方式创建了一个包含红色(R),绿色(G)和蓝色(B)像素的4x4位图:

    BRBR
    BBBB
    GGBB
    RRRG
    
  • 我将文件保存为256色位图(没有使用索引颜色或游程编码的选项)。
  • 我在Gnu图像操作程序(GIMP)中打开文件,将颜色模式更改为索引(通过图像>模式>索引),并将其导出为" Windows BMP",检查关闭"运行长度编码"选项。
  • 我制作了该文件的副本并在HxD(十六进制编辑器)中打开它。
  • 在此阶段,像素数据表示如下(请注意,根据文档,图像从左下角开始,从左到右):

    03 4F // Three red pixels
    01 71 // One green pixel
    00 00 // EOL
    00 04 71 71 E8 E8 // GGBB
    00 00 // etc.
    04 E8
    00 00
    00 04 E8 4F E8 4F
    00 01 // EOF
    
  • 在像素数据区域的开头,我用03 4F替换了00 03 4F 4F 4F(编码模式中指定的三个红色像素;请注意红色映射到颜色表中的索引0x4F = 79)(在绝对模式下指定三个红色像素,没有零填充),更新了标题中的文件大小,并保存了更改。
  • 在GIMP和Paint中打开时,修改后的文件呈现错误:前两行和右下角像素中的像素为黑色,第三行中的最后两个像素为绿色而不是蓝色。 / LI>
  • 在HxD中,我将00 03 4F 4F 4F更改为00 03 4F 4F 4F 00(在绝对模式下指定了三个红色像素,添加了一个零字节以结束16位字边界上的运行),更新了文件标题中的大小,并保存文件。
  • 在GIMP中打开时,文件现在可以正确呈现。在Paint中打开时,顶行是黑色的(我怀疑我忽略了更新Paint使用但不是GIMP的头字段),否则图像是正确的。