专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 图形/图像

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

发布时间:2011-06-27 20:37:26 文章来源:www.iduyao.cn 采编人员:星星草
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++){
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: