如何解释 1 bpp BMP 文件中的像素阵列

How to interpret the pixel array in a 1 bpp BMP file

在以下情况下我找不到解释像素阵列的方法: 我在 Windows 上使用 MS Paint 创建了一个 2x2 像素的 BMP 图像。将其保存为单色 BMP(我认为这意味着颜色深度为每像素 1 位的 BMP)

这是图像放大后的样子(黑色像素、白色像素、白色像素、黑色像素)

然后我用十六进制编辑器打开bmp,我可以看到以下信息:

00: 424d 4600 0000 0000 0000 3e00 0000 2800  BMF.......>...(.
10: 0000 0200 0000 0200 0000 0100 0100 0000  ................
20: 0000 0800 0000 0000 0000 0000 0000 0000  ................
30: 0000 0000 0000 0000 0000 3f3f 3f00 3f00  ..........???.?.
40: 0000 4000 0000 0a                        ..@....

据我在维基百科文章中读到的关于 BMP 格式的文章 (https://en.wikipedia.org/wiki/BMP_file_format) 这部分是像素数组:

3f00 0000 4000 0000

像素数组中的值是什么意思? 3F值是否有特殊含义?

您发布的十六进制转储与您发布的图片不完全对应。这是我得到的:

00000000 42 4D 46 00 00 00 00 00 00 00 3E 00 00 00 28 00 BMF.......>...(.
00000010 00 00 02 00 00 00 02 00 00 00 01 00 01 00 00 00 ................
00000020 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 00 00 00 00 FF FF FF 00 80 00 ................
00000040 00 00 40 00 00 00                               ..@...

颜色 table 从 0x36 开始。那里有两个 RGBQUAD。第一个,0x00000000,对应于黑色。接下来,0x00FFFFFF,对应白色。

像素数据在那之后开始。每个像素由一个位表示。尽管图像的每一行只需要两位,但每一行都与四字节边界对齐。因此第一行是 0x80000000,第二行是 0x40000000。某些应用程序可能不会费心清除填充位。

行数据逐字节解释,每个字节中从最高位到最低位。

0x8 的高位是 1 和 0,我们应该在底行看到颜色 1(白色)后跟颜色 0(黑色)。其余位将被忽略,因为它们将对应于宽度超过 2 的像素,因为接下来的三个字节的存在只是为了确保后续行与 4 字节边界对齐。

0x4 的高位是 0 和 1,因此我们应该在下一行中看到颜色 0(黑色)后跟颜色 1(白色)。和以前一样,其余位将被忽略。

在您的十六进制转储中,颜色 table 是黑色 (0x00000000) 和灰色 (0x003F3F3F)。没什么大不了的。像素数据在第一行(底部)上具有高位 0 和 0,在第二(顶部)行上具有高位 0 和 1。其他位是用于填充的随机垃圾。

(0x3F 类似于灰度值的事实表明编码器可能没有费心清除在写入颜色后重新使用的变量或寄存器table。)