试图逐像素理解位图

Trying to understand bitmaps pixel by pixel

本文关键字:位图 像素      更新时间:2023-10-16

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

424 d e000000 28000000 02000000 28000000 0000 0000 46000000 0100 0100 0000 08000000 00000000 00000000 00000000 08000000 00000000 0000 ffff ff00 c000 0000 0000 0000

我需要理解所有的值代表什么,尤其是像素值。这是一个用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个字节……

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)。

c0 00 00 00

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

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