如何制作4bpp自定义位图文件?4位色深位图生成报错求解
BMP 4bpp生成问题排查
核心错误点
你使用的是12字节长度的BITMAPCOREHEADER结构,存在三个关键错误:
- 调色板结构用错:
BITMAPCOREHEADER对应的调色板条目是RGBTRIPLE类型,每个条目仅3字节,顺序为蓝、绿、红,没有额外保留位。你新增红色条目时多写了1字节,直接导致整个文件结构错位,解析器无法识别。 - 颜色存储顺序搞反:你想要的红色RGB(255,0,0),在BMP调色板中需要按BGR顺序存储为
00 00 FF,你写的FF 00 00实际对应蓝色。 - 元数据计算错误:修改调色板长度后,文件头的
bfSize(文件总大小)、bfOffBits(像素数据起始偏移)两个字段需要重新精确计算,你随意修改的27和24不符合实际结构长度。
关于颜色表的疑问
可以直接在颜色表中放入任意RGB值(转换为BGR顺序存储即可),只要像素数据里的索引值对应颜色表的位置,就能正常引用,没有额外限制。如果需要兼容全平台解析器,位深<=8时,调色板条目数建议补到2^位深个,也就是4bpp补满16个RGBTRIPLE,未使用的条目填充0即可,避免部分解析器校验不通过。
可参考的4bpp单红色像素位图十六进制示例(使用BITMAPCOREHEADER)
42 4D 28 00 00 00 00 00 00 00 24 00 00 00 0C 00 00 00 01 00 01 00 01 00 04 00 FF FF FF 00 00 00 00 00 FF 20 00 00 00
结构说明:
- 文件总大小0x28=40字节
- 像素数据起始偏移0x24=36字节
- 调色板共3个
RGBTRIPLE,分别对应索引0(白色)、索引1(黑色)、索引2(红色) - 像素数据
0x20表示1个像素引用索引2的红色,剩余4位补0,末尾补3个0满足扫描行4字节对齐要求
内容的提问来源于stack exchange,提问作者zdwlees
相关产品推荐
相关产品推荐

