C++读取和保存bmp图片的程序,有问题,求指导!
这是我写的读取和保存bmp图片的C++代码,运行环境是VS2008.
但是读取出来的信息有些不正确,比如文件的大小。而且保存后的图片打开出现绘图失败。
求大侠指导!
我的代码:
ReadBmp.h
/*#define BYTE (unsigned char)#define WORD (unsigned short)#define DWORD (unsigned int)*/typedef unsigned char BYTE;typedef unsigned short WORD;typedef unsigned int DWORD;typedef struct tagBITMAPFILEHEADER{ WORD bfType;//文件类型,必须是0x424D,即字符“BM” DWORD bfSize;//文件大小 WORD bfReserved1;//保留字 WORD bfReserved2;//保留字 DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数 //WORD aa;}BITMAPFILEHEADER;//位图文件头定义;typedef struct tagBITMAPINFOHEADER{ DWORD biSize;//信息头大小 DWORD biWidth;//图像宽度 DWORD biHeight;//图像高度 WORD biPlanes;//位平面数,必须为1 WORD biBitCount;//每像素位数 DWORD biCompression; //压缩类型 DWORD biSizeImage; //压缩图像大小字节数 DWORD biXPelsPerMeter; //水平分辨率 DWORD biYPelsPerMeter; //垂直分辨率 DWORD biClrUsed; //位图实际用到的色彩数 DWORD biClrImportant; //本位图中重要的色彩数}BITMAPINFOHEADER; //位图信息头定义typedef struct tagRGBQUAD{ BYTE rgbBlue; //该颜色的蓝色分量 BYTE rgbGreen; //该颜色的绿色分量 BYTE rgbRed; //该颜色的红色分量 BYTE rgbReserved; //保留值}RGBQUAD;//调色板定义
#include "ReadBmp.h"#include "stdlib.h"#include <iostream>using namespace std;//变量定义BITMAPFILEHEADER strHead;RGBQUAD strPla[256];//256色调色板BITMAPINFOHEADER strInfo;int main(){ char filename[30];//bmp文件名 WORD type; FILE *fpi,*fpw; //cout<<"sizeof(strHead)"<<sizeof(strHead)<<endl; //cout<<"sizeof(strInfo)"<<sizeof(strInfo)<<endl; cout<<"请输入所要读取的文件名:"<<endl; cin>>filename; if((fpi=fopen(filename,"rb"))==NULL){ cout<<"open the bmp file error!"<<endl; exit(0); } //读取bmp文件的文件头和信息头 fread((char *)&strHead,1,sizeof(strHead),fpi); fread((char *)&strInfo,1,sizeof(strInfo),fpi); //读取调色板 for(int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++){ fread((char *)&strPla[nCounti],1,sizeof(RGBQUAD),fpi); } fclose(fpi); type=strHead.bfType; cout<<"bfType value is "<<hex<<type<<endl; cout<<"bfSize value is "<<hex<<strHead.bfSize<<endl; cout<<hex<<strPla[0].rgbRed<<"---"<<hex<<strPla[0].rgbGreen<<"---"<<hex<<strPla[0].rgbBlue<<endl; if((fpw=fopen("b.bmp","w"))==NULL){ cout<<"create the bmp file error!"<<endl; exit(0); } fwrite((char *)&strHead,1,sizeof(strHead),fpw); fwrite((char *)&strInfo,1,sizeof(strInfo),fpw); for(int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++){ fwrite((char *)&strPla[nCounti],1,sizeof(RGBQUAD),fpw); } fclose(fpw); system("pause");}
fread((char *)&strPla[nCounti],1,sizeof(RGBQUAD),fpi);
}
fclose(fpi);
//在读这个之间先去掉头部0x0300,与调色板项目数,4个字节。。。。
一般bmp文件存储时,一个entry并不是RGBQUAD四个字节,而是3个,把reserved那个字节去掉了,读出的时候你得自己写程序恢复出来,写入的时候再去掉。。。
[解决办法]
结构体中内存应该是双字节对齐,BM后应该有一个字节的偏移