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 67
应00 03 45 56 67 00
吗?
答案 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
在此阶段,像素数据表示如下(请注意,根据文档,图像从左下角开始,从左到右):
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)(在绝对模式下指定三个红色像素,没有零填充),更新了标题中的文件大小,并保存了更改。00 03 4F 4F 4F
更改为00 03 4F 4F 4F 00
(在绝对模式下指定了三个红色像素,添加了一个零字节以结束16位字边界上的运行),更新了文件标题中的大小,并保存文件。