如何用C++进行位图RGB读写操作

【字号: 日期:2023-04-23浏览:33作者:雯心

问题描述

我想通过C语言打开指定位图的RGB值信息,类似Matlab中imread函数功能.由于无法将像素一一映射成控制台字符按原图显示,我通过重写该图看是否与原图一致验证读位图操作是否成功.结果写出来的位图无法打开.我对比了一下,占用存储空间也比原文件小一点,我猜测是自己对此类型图片的存储结构不了解导致的错误.以下是读写位图操作的代码,请各位指点:

#include<stdlib.h>#include<iostream>#include<windows.h> //文件路径 #define READPATH 'c:UsersasusDesktop000.bmp'#define WRITEPATH 'c:UsersasusDesktop0.bmp'//位图宽和高 #define W 72#define H 1980using namespace std;int main(){ BITMAPFILEHEADER bitFile; BITMAPINFOHEADER bitInfo; RGBQUAD rgbQuad; BYTE b[W][H]; FILE *fp;//读文件 if(!(fp = fopen(READPATH, 'r'))) {printf('Error1!');exit(0); }//读文件头 if(!(fread(&bitFile, sizeof(bitFile), 1, fp) && fread(&bitInfo, sizeof(bitInfo), 1, fp) && fread(&rgbQuad, sizeof(rgbQuad), 1, fp))) {fclose(fp);printf('Error2!');exit(0); }//读数据 if(!(fread(&b, sizeof(BYTE), W * H, fp))) {fclose(fp);printf('Error3!');exit(0); } fclose(fp);//写文件 if(!(fp = fopen(WRITEPATH, 'w+'))) {printf('Error4!');exit(0); } if(!(fwrite(&bitFile, sizeof(bitFile), 1, fp) && fwrite(&bitInfo, sizeof(bitInfo), 1, fp) && fwrite(&rgbQuad, sizeof(rgbQuad), 1, fp))) {fclose(fp);printf('Error5!');exit(0); } if(!(fwrite(&b, sizeof(BYTE), W * H, fp))) {fclose(fp);printf('Error6!');exit(0); } fclose(fp); cout<<endl<<'Succeed!'<<endl; return 0;}

//经回答的朋友提醒我补充一下,以上代码是针对我测试用的8位位图的,不具有普适性.

问题解答

回答1:

代码还没仔细看过,先留个坑再说。。。

先说说一眼看下去的结果,看到一句fwrite(&b, sizeof(BYTE), W * H, fp),题主的bmp是256色的么,如果是24位的应该是W*H*3才对。另外,bmp格式的位图文件中存在align,故数据块的大小不应该通过W*H*(位深度/3),而是通过读取文件头中的信息得到

回答2:

之前用C写过一个https://github.com/luckyScrip...可以维基百科查一下这个格式的二进制存了哪些东西~

相关文章: