24位BMP转ASCII输出错位(斜切分半)问题及修复方案
24位BMP转ASCII文本输出错位问题的解决
问题现象
编写C++程序将24位BMP文件转换为ASCII文本并保存为TXT文件时,遇到输出异常:转换带有灰度层次的“心形”图像后,输出的ASCII文本呈现斜向切分的状态,图像右半部分先显示,左半部分紧随其后,完全不符合原始图像的结构。
问题根源(原始代码的readPixels函数问题)
原始代码中readPixels函数未正确处理BMP文件的扫描线字节对齐和行存储顺序,导致像素读取顺序错乱,最终输出的ASCII图像错位。
原始readPixels函数代码
void readPixels(FILE* bmpFile, unsigned char* pixels, int width, int height) { for (int i = 0; i < height; i++) { fread(pixels + i * width * 3, 3, width, bmpFile); } }
修改后的解决方案
经指导修改readPixels函数,正确处理BMP的行对齐填充字节,同时调整行读取顺序(BMP图像的扫描线是从下到上存储的):
修改后的readPixels函数代码
void readPixels(FILE* bmpFile, unsigned char* pixels, int width, int height) { // BMP每行字节数需对齐到4字节 int rowSize = (width * 3 + 3) / 4 * 4; for (int i = height - 1; i >= 0; i--) { // 读取对应行的像素数据 fread(pixels + i * width * 3, 3, width, bmpFile); // 跳过该行的填充字节 fseek(bmpFile, rowSize - width * 3, SEEK_CUR); } }
验证结果
修改后重新转换心形BMP图像,输出的ASCII文本恢复正常,图像结构与原始BMP一致,错位问题完全解决。
内容的提问来源于stack exchange,提问作者Adas
相关产品推荐
相关产品推荐

