You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:01:06