【问题标题】:How to interpret the pixel array in a 1 bpp BMP file如何解释 1 bpp BMP 文件中的像素阵列
【发布时间】:2016-06-22 02:52:54
【问题描述】:

在以下情况下我找不到解释像素数组的方法: 我在 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值有特殊含义吗?

【问题讨论】:

    标签: image image-processing graphics bmp raster-graphics


    【解决方案1】:

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

    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 与灰度值相似的事实表明编码器可能没有费心清除在编写颜色表后重复使用的变量或寄存器。)

    【讨论】:

    • 嗨,阿德里安,感谢您的解释。这很有意义。奇怪的是,我尝试在 Windows 7 上使用 Photoshop CS6 和 MS Paint 创建相同的 BMP 文件,并得到了上面粘贴的结果。你用来创建你的程序是什么?
    • 我在 Windows 7 上使用了 MS Paint。
    • 好的,问题找到了。我使用 vim 和 xxd 来检查 BMP 文件的十六进制。当我没有通过“vim -b pic.bmp”在vim中读取二进制BMP文件时,就会出现奇怪的状态,所以问题在于vim显示十六进制,而不是文件本身。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多