C++实现BMP红黑渐变图像生成出现布局异常问题排查
问题原因与修复方案
你代码里存在3个核心错误,按优先级修复即可得到预期效果:
- 第一处:像素行地址计算错误
你在写入每行像素时的地址偏移计算错误:
每个像素占3字节,每行的总字节数是// 错误写法: image.write((const char*)arr + (i * width), width * 3);width * 3,所以第i行的起始偏移应该是i * width * 3,修改为:// 正确写法: image.write((const char*)arr + (i * width * 3), width * 3); - 第二处:BMP头字段赋值越界
BMP文件头的所有数字字段都是固定长度的4字节32位无符号整数,而你使用size_t类型赋值,在64位系统下size_t为8字节,写入时会覆盖相邻的头字段导致文件头损坏。需要用固定长度的uint32_t替代size_t赋值,同时先将整个头清零避免未初始化的垃圾值:void writeHeader() { memset(header, 0, 54); memcpy(header, "BM", 2); *(uint32_t*)(header + 2) = fullSize; *(uint32_t*)(header + 10) = 54; *(uint32_t*)(header + 14) = 40; *(uint32_t*)(header + 18) = width; *(uint32_t*)(header + 22) = height; *(uint16_t*)(header + 26) = 1; *(uint16_t*)(header + 28) = 24; } - 第三处:文件打开模式必须指定二进制
你已经修复了这一点,image.open(name, std::ios::binary)可以避免Windows下文本模式自动转义换行符导致的文件字节错位问题。
额外可选优化
BMP格式的像素行是从下往上存储的,你当前代码写入的第一行是图像的最底部,如果你后续做非均匀行的图像,需要倒序遍历写入像素数组:
for (size_t i = 0; i < height; i++) { // 从最后一行开始写,保证图像上下方向正确 image.write((const char*)arr + ((height - 1 - i) * width * 3), width * 3); image.write(pad_, padding); }
内容的提问来源于stack exchange,提问作者Jurby
相关产品推荐
相关产品推荐

