首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

C++读取和保存bmp图片的程序,有有关问题,求指导

2012-03-13 
C++读取和保存bmp图片的程序,有问题,求指导!这是我写的读取和保存bmp图片的C++代码,运行环境是VS2008.但是

C++读取和保存bmp图片的程序,有问题,求指导!
这是我写的读取和保存bmp图片的C++代码,运行环境是VS2008.

但是读取出来的信息有些不正确,比如文件的大小。而且保存后的图片打开出现绘图失败。
求大侠指导!

我的代码:
ReadBmp.h

C/C++ code
/*#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;//调色板定义



ReadBmp.cpp
C/C++ code
#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");}




[解决办法]
我不是高手,程序上没看出来什么问题。
[解决办法]
单步调试看看,看看文件头的每部分数据对不?
这样我也看不出来什么
[解决办法]
typedef struct tagBITMAPFILEHEADER{
WORD bfType;//文件类型,必须是0x424D,即字符“BM”
DWORD bfSize;//文件大小
WORD bfReserved1;//保留字
WORD bfReserved2;//保留字
DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数
//WORD aa;
}BITMAPFILEHEADER;//位图文件头定义;
WORD bfType;//文件类型,必须是0x4D42,不是0x424D,intel 处理器是little endian,不是big endian

//读取调色板
for(int nCounti=0;nCounti<strInfo.biClrUsed;nCounti++){


fread((char *)&strPla[nCounti],1,sizeof(RGBQUAD),fpi);
}
fclose(fpi);
//在读这个之间先去掉头部0x0300,与调色板项目数,4个字节。。。。

一般bmp文件存储时,一个entry并不是RGBQUAD四个字节,而是3个,把reserved那个字节去掉了,读出的时候你得自己写程序恢复出来,写入的时候再去掉。。。
[解决办法]
结构体中内存应该是双字节对齐,BM后应该有一个字节的偏移

热点排行