1bpp Bitmap生成异常:添加8字节后可正常显示的原因排查
1bpp BMP生成后损坏,添加8字节后恢复的原因分析
问题描述
开发一个生成1位每像素(1bpp)Bitmap图像的简单库,使用BITMAPINFOHEADER构建文件,已处理行的4字节对齐,但生成的文件被图像查看器判定为损坏。手动用十六进制编辑器构建图像也无法正常打开,但在文件末尾添加任意8字节数据后,图像即可正常显示。生成600×600图像的代码如下:
from Library.bpp import Img samp = Img.new(600, 600, 1, 'INFO', colour= '0') samp.save('lol.bmp')
核心原因分析
问题出在1bpp格式BMP的必填调色板缺失,同时文件头的大小计算未匹配标准格式:
- 1bpp的BMP强制要求包含调色板,需要定义2个颜色条目(对应黑、白两种像素值),每个条目占4字节,总计8字节。如果你的代码没有写入这部分调色板数据,文件会比标准格式少8字节,导致图像解析器无法正确识别文件结构。
- 对应地,BITMAPFILEHEADER中的
bfSize(文件总字节数)和BITMAPINFOHEADER中的biSizeImage(像素数据总大小)字段计算错误,没有预留调色板的8字节空间。手动添加8字节后,刚好补足了缺失的结构长度,让解析器能按标准流程读取图像数据。
修复方案
- 在写入像素数据前,先写入8字节的调色板数据:按BMP小端序规则,依次写入黑色(
0x00000000,对应蓝0、绿0、红0、保留字节0)和白色(0x00FFFFFF,对应蓝255、绿255、红255、保留字节0)的RGBQUAD结构。 - 修正
bfSize计算:总文件大小 = BITMAPFILEHEADER(14字节) + BITMAPINFOHEADER(40字节) + 调色板(8字节) + 对齐后的像素数据大小。 - 修正
biSizeImage计算:该字段仅统计像素数据的总字节数(包含行填充),不要包含调色板的大小。
内容的提问来源于stack exchange,提问作者B1smuth
相关产品推荐
相关产品推荐

