逐像素理解位图

4
以下是位图中的十六进制数据:
424d 46000000 0000 0000 3e000000 28000000 02000000 02000000 0100 0100 00000000 08000000 00000000 00000000 00000000 00000000 0000 0000 ffff ff00 c000 0000 0000 0000
我需要了解所有值的含义,尤其是像素值。这是用mspaint保存的单色位图。以下是我的理解/误解...大部分信息都可以从维基和搜索bmp获得。这只是我试图分解我的bmp,其中顶部有两个黑色像素和底部有两个白色像素。
42 4d       is BM
46 00 00 00 size of entire file
00 00       reserved 1
00 00       reserved 2
3e 00 00 00 offset to where pixel data can be found

28 00 00 00 # of bytes in this header
02 00 00 00 width of bmp
02 00 00 00 height of bmp
01 00       # of planes
01 00       # of bits per pixel
00 00 00 00 compression
08 00 00 00 size of raw data in pixel array in bytes
00 00 00 00 horizontal resolution pix/m
00 00 00 00 vertical resolution pix/m
00 00 00 00 number of colors
00 00 00 00 important colors
00 00 00 00  x=1 y=2  pixel value?  is supposed to be white
ff ff ff 00  x=2 y=2  pixel value?  is supposed to be white
c0 00 00 00  x=1 y=1  pixel value?  is supposed to be black
00 00 00 00  x=2 y=1  pixel value?  is supposed to be black

最后一个像素的值真的很令人困惑,我不明白它们怎么会等于它们应该等于的值,而且我认为 RGB 或 BGR 数据只有 3 个字节?此外,像素数据可以被找到的偏移量超出位图中最后一个字节 2 个字节...我感觉自己完全解码错误了或者其他什么。

数据似乎与实际位图不匹配。您有8个字节的数据,但您肯定显示了16个字节。每像素的位数应该是1吗?我有点困惑。字节数与您的第一个数字0x46相匹配。这全部来自一个位图吗? - Mats Petersson
而且,是否有可能将BMP文件上传到某个在线平台,以便我们查看? - Mats Petersson
2个回答

9
00 00 00 00
ff ff ff 00

这些字节是颜色调色板。由于每像素的位数设置为1,调色板中只能有两种颜色。第一种颜色是黑色(00 00 00 00),第二种是白色(ff ff ff 00)。每种颜色的最后一个字节只是填充字节,始终设置为00

c0 00 00 00
00 00 00 00

这是实际像素数据。每一行像素必须填充到最近的4个字节,以包含数据。因此,在这里,第一行是像素的底部行,第二行是像素的顶部行(因为BMP像素顺序是自下而上)。由于我们使用每个像素1位,所以应该在字节级别查看它。具体来说,像素的第一行如下:

1100 0000  0000 0000  0000 0000  0000 0000

由于每行像素中只有两个像素,每个像素只有1位,因此只有前两位是有意义的。在这种情况下,11 指定第一个和第二个像素是调色板中的第二种颜色(1)。现在来看第二行:

0000 0000  0000 0000  0000 0000  0000 0000

再次看第一个像素和第二个像素即可,它们分别是00。这表示接下来的像素采用调色板中的第一种颜色(0)。


2
值得注意的是:BMP像素顺序是自下而上,从左到右。因此,前两个位编码底部的白色像素,接下来的两个位编码上部的黑色像素。 - leemes
好的,这样就清楚多了。那么关于末尾的其他00 00 00 00 00 00字节呢?它们是什么? - itb
1
@itb:很可能是填充。如果我没记错的话,BMP规定每行填充到4字节对齐。2行=最小4*2=8字节。 - leander
@leander 是的,我同意。 - Joseph Mansfield
非常感谢,我相信以后还会有更多问题,但现在我可以真正地处理我的bmp文件了:) - itb

3

c0 00 00 00

这个块的最后3个字节是为了填充而存在的。

必须在每一行的末尾添加填充字节(不一定为0),以使每一行的长度达到四个字节的倍数。当像素数组加载到内存中时,每一行必须从内存地址开始,该地址是4的倍数。


谢谢,我觉得维基百科应该再提供一些例子 :) - itb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接