读取bmp头信息出错、、??

xgfhahaha 2010-01-08 07:03:23
先贴部分代码吧、、、
自己定义的头文件结构体:
typedef struct BMP_file //位图文件头,14个字节
{
unsigned int bfType; //文件类型
unsigned long bfSize; //bmp文件长度
unsigned int Reserved1;
unsigned int Reserved2;
unsigned long bfOffset; //文件描述区长度,16色为118,256色为1078
}bitmapfile;


typedef struct BMP_info //位图信息头,40个字节
{
unsigned long biSize;
unsigned long biWidth; //图像宽度
unsigned long biHeight; //图像高度
unsigned int biPlanes; //设备级别,必须是1
unsigned int biBitCount; //每个像素所需位数,必须是1(黑白),4(16色),8(256色)或24(真彩色)之一
unsigned long biCompression;
unsigned long biSizeImage;
unsigned long biXplosPerMeter;
unsigned long biYplosPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
}bitmapinfo;

在主函数main()中实现:
bitmapfile bmpfilehead;
bitmapinfo bmpfileinfo;

in_file = fopen("1.bmp", "rb");
if (in_file == NULL )
{
perror("fopen() failed");
exit(0);
}

fread(&bmpfilehead,1,14,in_file);
fread(&bmpfileinfo,1,40,in_file);

if(bmpfilehead.bfType != 0x4d42)
{
printf("Not a BMP file!\n");
exit(1);
}
cols = bmpfileinfo.biWidth;
rows = bmpfileinfo.biHeight;
i = bmpfileinfo.biSize;
j = bmpfileinfo.biBitCount;
fsize = bmpfilehead.bfSize;
foffsize = bmpfilehead.bfOffset;

问题:
我选用的是1.bmp是512*512的标准灰度Lena图像,结果识别“Not a BMP file!”,为什么啊、、?
如果我跳过判别bmp那段,后面的cols是512,rows是512,i是40,都是对的;后面的j竟然是0,fsize文件总大小才为4,后面的foffsize偏移量更离谱、、、
是什么原因啊、、?我觉得我定义的结构体应该没问题啊,读取信息顺序也应该是对的啊,怎么搞的啊、、、
...全文
231 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xgfhahaha 2010-01-10
  • 打赏
  • 举报
回复
问题已经解决、、、、、
fread(&bmpfilehead,1,14,in_file); 这个语句有问题,因为数据对齐后结构体bitmaphead的大小是16个字节,而我读取14个字节的数据来赋值,必然会造成数据错乱、、、、
谢谢大家!
xgfhahaha 2010-01-10
  • 打赏
  • 举报
回复
呵呵,谢谢大家关注、、、

肯定是bmp格式图像、、
我已经找到了问题:VC下面的unsigned int是四个字节,跟bmp头结构体定义不一致,我修改为unsigned short int就可以了、、、

但是还有一点小问题:先后读取14、40个字节以后,根据定义一个一个验证,发现bitmapinfo里面数据都是对的;bitmapfile里面的bfType、Reserved1是对的,而bfSize、Reserved2、bfoffset还是错的,郁闷的很、、、、

这是什么原因呢、、?莫非是bmp头信息破损、bmp头结构有几种定义,还是我读取代码有问题、、?
sanguomi 2010-01-10
  • 打赏
  • 举报
回复
差点以为是 bdmh
lhy 2010-01-10
  • 打赏
  • 举报
回复
会不会根本不是bmp文件?
xgfhahaha 2010-01-10
  • 打赏
  • 举报
回复
fread(&bmpfilehead,1,14,in_file);
fread(&bmpfileinfo,1,40,in_file);
它们的函数原形是:
fread(buffer,size,count,fp);
fread(buffer,size,count,fp);
其中buffer是读入或写出的数据缓存,size是数据项的大小,count的数据项的数目,fp是文件指针、、
我第一次读取14个字节之后,指针应该自动位于第15个字节位置、、
再说,我读取的前14个字节就错了、、、

到底是什么原因啊、、?高手指点说一下、、、
mdejtod 2010-01-08
  • 打赏
  • 举报
回复
fread(&bmpfilehead,1,14,in_file);
fread(&bmpfileinfo,1,40,in_file);
地址重叠,读取bmpfileinfo时,应该是从第15个偏移量开始,而不是从第一个偏移量开始

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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