试图逐像素理解位图
Trying to understand bitmaps pixel by pixel
下面是位图中的十六进制数据
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的倍数。
- 如何在24位SDL_Surface上设置像素的颜色
- 如何使用 freetype2 访问单色位图中的像素状态
- 通过信号槽发送QPixmap指针,空像素图数据
- 将像素打包在盒子中的 1 位/带宽/二进制图像中
- 从位图提取像素数据的问题
- 使用 std::vector 保存 BMP 像素图
- 图像的像素格式始终返回 32 位
- C++ / OpenGL:纹理到像素图示例 - 缩小转换误差
- 从 QT 中的缓冲区加载像素图
- 从位图图像文件读取像素数据值
- 为什么锁定位对所有像素值返回 -842150451
- 从HWND获取并保存位图(每个像素8,4,1位-黑色图像)
- 将用于绘制为位图的像素格式更改
- 有没有办法在不复制所有像素的情况下将现有的像素数组转换为位图
- Win32 位图渲染速度如何比像素快
- 如何访问位图中的像素颜色
- 如何在SDL上加载原始像素位图
- 试图逐像素理解位图
- C++从8位位图构建像素数据,并访问bmiColor表信息
- 从指定坐标[x, y]处的位图数据获取像素颜色