我正在尝试了解如何在位图文件头中编码图像大小。 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?
答案 0 :(得分:1)
这是endianness的问题。 BMP uses little-endian encoding,因此首先读取最低有效字节:
102 =(102 * 256 0 )+(0 * 256 1 )+(0 * 256 2 )+(0 * 256 3 )
= 102
974 =(206 * 256 0 )+(3 * 256 1 )+(0 * 256 2 )+(0 * 256 3 )
= 206 +(3 * 256)