试图逐个像素地理解位图

时间:2013-05-05 18:57:35

标签: c++

下面是位图

中的十六进制数据

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个字节...我觉得我正在解码它完全错误或其他什么。

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:3)

c0 00 00 00

此块的最后3个字节用于填充

  

填充字节(不一定是0)必须附加到行的末尾,以便将行的长度调到四个字节的倍数。当像素阵列加载到内存中时,每行必须从4的倍数的内存地址开始。