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

没有昵称阿
阿里巴巴Java技术专家
博客专家认证
2011-07-25 09:32:10
这是我写的读取和保存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;//调色板定义



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


...全文
786 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
alltoy11 2011-08-30
  • 打赏
  • 举报
回复
结构体中内存应该是双字节对齐,BM后应该有一个字节的偏移
the_venus 2011-08-28
  • 打赏
  • 举报
回复
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那个字节去掉了,读出的时候你得自己写程序恢复出来,写入的时候再去掉。。。
dianwei_wang 2011-07-26
  • 打赏
  • 举报
回复
我不是高手,程序上没看出来什么问题。
没有昵称阿 2011-07-26
  • 打赏
  • 举报
回复
求大侠指导啊~~~
没有昵称阿 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hui918 的回复:]
单步调试看看,看看文件头的每部分数据对不?
这样我也看不出来什么
[/Quote]

读取bmp文件我已经调试成功了,正确程序见http://blog.csdn.net/xiajun07061225/article/details/6633938

但是,保存bmp文件我还是没有弄好,总是出现绘图失败的情况。

求指点啊~~
hui918 2011-07-26
  • 打赏
  • 举报
回复
单步调试看看,看看文件头的每部分数据对不?
这样我也看不出来什么

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧