BMP文件大小编码

BMP file size encoding

我想了解图像大小是如何在位图文件头中编码的。 wikipedia page 仅显示小于 255 字节的图像示例,因此大小以单个字节编码,后跟三个 0 字节。

问题是当我测试更大的图像时,我无法将编码字节与实际大小相关联。

$ identify bmp1.bmp
bmp1.bmp BMP3 10x10 10x10+0+0 1-bit sRGB 2c 102B 0.000u 0:00.000
$ identify bmp2.bmp
bmp2.bmp BMP3 92x76 92x76+0+0 1-bit sRGB 2c 974B 0.000u 0:00.000
In [28]: [ord(c) for c in bmp1[2:6]]
Out[28]: [102, 0, 0, 0]

In [29]: len(bmp1)
Out[29]: 102

In [30]: [ord(c) for c in bmp2[2:6]]
Out[30]: [206, 3, 0, 0]

In [31]: len(bmp2)
Out[31]: 974

如您所见,第一张图片有102个字节,文件头包含编码后的大小102。但是第二个图像有 974 个字节,文件头包含字节 206 和 3。这是因为文件头大小不可靠,我不应该尝试从这些字节中读取大小吗?不然206加3怎么算974?

这是 endianness. BMP uses little-endian encoding 的问题,因此首先读取最低有效字节:

102 = (102 * 2560) + (0 * 2561) + (0 * 256 2) + (0 * 2563)

= 102

974 = (206 * 2560) + (3 * 2561) + (0 * 256 2) + (0 * 2563)

= 206 + (3 * 256)