C语言实现Box Blur算法后输出BMP文件损坏无法打开问题
Box Blur生成BMP文件损坏修复方案
代码可正确读取图像宽高,说明BMP文件头的基础读取逻辑正常,输出文件无法打开由以下4个编码错误导致,逐个修复即可正常生成可用文件:
- 二进制文件打开模式错误
Windows平台下C语言默认以文本模式打开文件时,会自动对换行符做转义替换,直接破坏二进制格式的BMP数据。当前代码使用的"r"、"w+"均为文本模式,必须替换为二进制读写模式:FILE* fIn = fopen("test.bmp", "rb"); FILE* fOut = fopen("result.bmp", "wb"); - 未处理BMP行4字节对齐规则
BMP格式规定每一行像素数据的字节长度必须是4的整数倍,不足时会在每行末尾补0-3个填充字节。当前代码直接按height * width连续读取3字节像素,当图像宽度不是4的倍数时,会把填充字节当成像素数据读入,后续写入的像素数据整体错位,和文件头声明的尺寸不匹配。
正确的行字节数计算方式为:
读取、写入像素时需要逐行操作,跳过每行末尾的填充字节,不要直接连续读写int pixelBytesPerRow = width * 3; // 24位色每个像素占3字节 int rowSize = (pixelBytesPerRow + 3) / 4 * 4; // 向上对齐到4字节倍数height*width个像素。 - 输出缓冲区边缘像素未赋值
卷积循环只处理了1<=x<=height-2、1<=y<=width-2范围内的非边缘像素,输出缓冲区out的边缘位置是malloc返回的未初始化随机值,直接写入文件会导致像素数据错乱。最简单的修复方式是卷积前先把原图像素完整拷贝到out缓冲区,卷积过程只覆盖非边缘位置即可。 - 未关闭文件句柄
所有读写操作完成后必须调用fclose(fIn)和fclose(fOut),否则留在IO缓冲区的数据不会被真正写入磁盘,生成的文件会缺失尾部内容。
内容的提问来源于stack exchange,提问作者twennyfouwr
相关产品推荐
相关产品推荐

