4

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

这是图像在缩放时的样子(黑色像素、白色像素、白色像素、黑色像素) 在此处输入图像描述

然后我用十六进制编辑器打开 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值有什么特殊含义吗?

4

1 回答 1

5

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

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                               ..@...

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

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

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

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

0x4 的高位是 0 和 1,所以我们应该看到颜色 0(黑色),然后是颜色 1(白色),按顺序在下一行。和以前一样,其余位被忽略。

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

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

于 2016-03-08T19:16:18.187 回答