2016-03-08 71 views
1

我不能找到一种方法来解释在下列情况下的像素阵列: 我创建了MS一个BMP图像的2x2像素在Windows 7上画图保存为单色BMP(我认为意味着BMP与颜色深度每像素1个比特)如何解释在1 BPP BMP文件的像素阵列

这是图像的样子时放大它(黑色像素,白色像素,白色像素,黑像素) enter image description here

然后我打开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      [email protected] 

至于我的维基百科文章有关BMP格式读取(https://en.wikipedia.org/wiki/BMP_file_format)这部分是像素阵列:

3F00 0000 4000 0000

什么是像素阵列中的值的含义是什么? 3F值是否有特殊含义?

回答

3

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

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        [email protected] 

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

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

行数据由字节每个字节解释的字节,从最显著位到最低。

0x8中的高比特为1和0,并且我们应该看到颜色1(白色),接着颜色0(黑色),在底部行的顺序。其余的位被忽略,因为它们将对应于超出2的宽度的像素,因为接下来的三个字节仅存在以确保随后的行与4字节边界对齐。

为0x4的高位为0和1,因此,我们应该看到颜色0(黑色),接着颜色1(白色),在上下一行向上的顺序。和以前一样,其余的位被忽略。

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

(的事实0x3F的是类似的灰度值表明编码器也许没有打扰清除变量或寄存器写入色表后重新使用。)

+0

嗨阿德里安,为感谢您的说明。它非常有意义。奇怪的是,我试图在Windows 7上使用Photoshop CS6和MS Paint创建相同的BMP文件,并得到了上面粘贴的结果。你用来创建你的程序是什么? –

+0

我在Windows 7上使用了MS Paint。 –

+0

好的发现了问题。我使用vim和xxd来检查BMP文件的十六进制。当我没有在vim中用“vim -b pic.bmp”读取二进制文件中的BMP文件时,那个奇怪的状态就出现了,所以问题在于用vim显示十六进制文件,而不是文件本身。再次感谢您的帮助。 –