4

下面是位图中的十六进制数据

424D 46000000 0000 0000 0000 3E000000 28000000 02000000 02000000 0100 0100 0100 00000000000000000000000000000000000000000000000000000000000000000000000000000000来不通000000000000000000000000000000000000000000000000000000 000000000000来

我需要了解所有值代表什么,尤其是像素值。这是一个用 mspaint 保存的位图,它是一个单色位图。以下是我的理解/误解...其中大部分是您从 wiki 和搜索 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 个字节……我觉得我在解码它完全错误之类的。

4

2 回答 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)。

于 2013-05-05T19:07:08.620 回答
3

c0 00 00 00

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

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

于 2013-05-05T19:20:23.633 回答