大家帮我看看这个读写bmp文件程序哪里出问题了,谢谢啦

cindysyp 2006-08-29 09:34:40
我的目的是想从一个bmp文件中读出数据,然后再写进另一文件中,但是好像在读、写图像数据块的时候出了问题,我不知道怎么改,调试不过去,请大虾帮帮忙,谢谢!!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义bmp文件结构
typedef struct tagBITMAPFILEHEADER{
unsigned short byType;
long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved1;
unsigned long bfOffBits;
}BITMAPFILEHEADER;

typedef struct tagBIPMAPINFOHEADER{
unsigned long bfSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
}BITMAPINFOHEADER;

typedef struct tagRGBQUAD{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
}RGBQUAD;

typedef struct tagBITMAPINFO{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
}BITMAPINFO;
typedef unsigned char BYTE;


int main(void)
{
BITMAPINFO bmpInfo;
BITMAPFILEHEADER bmpHead;
FILE* fa,*fs;
char* file_app="1.bmp";//目的文件
char* file_source="lena.bmp";//源文件




if((fs=fopen(file_source,"rb"))==NULL)
{
fprintf(stdout,"can not open the source file\n");
exit(1);
}


if((fa=fopen(file_app,"wb"))==NULL)
{
fprintf(stdout,"can not open the append file\n");
exit(1);
}





fread(&bmpHead,sizeof(BITMAPFILEHEADER),1,fs);
fwrite(&bmpHead,sizeof(BITMAPFILEHEADER),1,fa);

fread(&bmpInfo,sizeof(BITMAPINFO),1,fs);
fwrite(&bmpInfo,sizeof(BITMAPINFO),1,fa);

long lfileSize=bmpHead.bfSize-bmpHead.bfOffBits;

BYTE temp[lfileSize];

fread(temp,sizeof(char),lfileSize,fs);
fwrite(temp,sizeof(char),lfileSize,fa);


return 0;


}

...全文
421 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cindysyp 2006-09-05
  • 打赏
  • 举报
回复
"ln_cheng(New ID)
pCol=(RGBQUAD*)malloc(256);

分配小了,应该是sizeof(RGBQUAD)*256。"

程序改了,还是文件头读的不对,bfsize和bfoffbits的数据不对,但是不知道错在哪里了,还请大家多多帮助,谢谢!
qdhuxp 2006-09-04
  • 打赏
  • 举报
回复
gz
ln_cheng 2006-09-04
  • 打赏
  • 举报
回复
pCol=(RGBQUAD*)malloc(256);

分配小了,应该是sizeof(RGBQUAD)*256。
cindysyp 2006-08-31
  • 打赏
  • 举报
回复
为了表示对大家的感谢,将本贴再加50分:)
cindysyp 2006-08-31
  • 打赏
  • 举报
回复
修改后的程序如下,但是还是不对。我用断点调试,发现BITMAPFILEHEADER.bfSize和BITMAPFILEHEADER.bfOffBits读的数据不正确,但是文件头定义的没有问题啊,百思不得其解,还请大虾多多赐教!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义bmp文件结构
typedef struct tagBITMAPFILEHEADER{
unsigned short byType;
long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved1;
unsigned long bfOffBits;
}BITMAPFILEHEADER;

typedef struct tagBIPMAPINFOHEADER{
unsigned long bfSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
}BITMAPINFOHEADER;

typedef struct tagRGBQUAD{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
}RGBQUAD;


typedef unsigned char BYTE;


int main(void)
{
BITMAPINFOHEADER bmpInfoHead;
BITMAPFILEHEADER bmpHead;
FILE* fa,*fs;
char* file_app="1.bmp";//目的文件
char* file_source="lena.bmp";//源文件
RGBQUAD* pCol;
BYTE* pData;
long lfileSize;


if((fs=fopen(file_source,"rb"))==NULL)
{
fprintf(stdout,"can not open the source file\n");
exit(1);
}


if((fa=fopen(file_app,"wb"))==NULL)
{
fprintf(stdout,"can not open the append file\n");
exit(1);
}





fread(&bmpHead,sizeof(BITMAPFILEHEADER),1,fs);
fwrite(&bmpHead,sizeof(BITMAPFILEHEADER),1,fa);

fread(&bmpInfoHead,sizeof(BITMAPINFOHEAD),1,fs);
fwrite(&bmpInfoHead,sizeof(BITMAPINFOHEAD),1,fa);

pCol=(RGBQUAD*)malloc(256);
fread(pCol,sizeof(RGBQUAD),256,fs);
fwrite(pCol,sizeof(RGBQUAD),256,fa);
free pCol;

lfileSize=bmpHead.bfSize-bmpHead.bfOffBits;
pData=(BYTE*)malloc(lfileSize);
fread(pData,sizeof(BYTE),lfileSize,fs);
fwrite(pData,sizeof(BYTE),lfileSize,fa);
free(pData);


return 0;


}
ln_cheng 2006-08-31
  • 打赏
  • 举报
回复
fread(&bmpInfo,sizeof(BITMAPINFO),1,fs);
fwrite(&bmpInfo,sizeof(BITMAPINFO),1,fa);

调色板的大小跟位图深度有关,但没有任何一个位图只有一个RGBQUAD的,1位位图都有2个RGBQUAD,所以调色板读错了,那么后面读位图数据也跟着错了(文件读取的位置错误)。
cindysyp 2006-08-30
  • 打赏
  • 举报
回复
superarhow(苏泊尔耗)
因为用的是256×256的8位图像,所以用
long lfileSize = (int)((bmpInfo.biWidth + 3) / 4) * 4 * bmpInfo.biHeight * bmpInfo.biBitCount / 8;
和用
long lfileSize=bmpHead.bfSize-bmpHead.bfOffBits;
计算的值是一样的吧?
前者的计算结果=width*height
后者的计算结果=位图大小-位图头的偏置量

superarhow 2006-08-30
  • 打赏
  • 举报
回复
long lfileSize = (int)((bmpInfo.biWidth + 3) / 4) * 4 * bmpInfo.biHeight * bmpInfo.biBitCount / 8;
cindysyp 2006-08-30
  • 打赏
  • 举报
回复
刚才前面那个写错了,但是进入管理栏后我没有权利删除那个回复,真奇怪,自己 的回复也不能删除:(
cindysyp 2006-08-30
  • 打赏
  • 举报
回复
我将定义数组这一段程序改了,
/*long lfileSize=bmpHead.bfSize-bmpHead.bfOffBits;

BYTE temp[lfileSize];*/
修改成下面的这样,但是还是调试不通:(
BYTE* pData;
long lfileSize=bmpHead.bfSize-bmpHead.bfOffBits;
pData=(BYTE*)malloc(lfileSize);
fread(pData,sizeof(BYTE),lfileSize,fs);
fwrite(pData,sizeof(BYTE),lfileSize,fa);
free(pData);
//调试过程中看到bmpHead.bfSize的值和bmpHead.bfOffBits的值相等
cindysyp 2006-08-30
  • 打赏
  • 举报
回复
我将定义数组这一段程序改了,
/*long lfileSize=bmpHead.bfSize-bmpHead.bfOffBits;

BYTE temp[lfileSize];*/
修改成下面的这样,但是还是调试不通:(
BYTE* pData;
long lfileSize=bmpHead.bfSize-bmpHead.bfOffBits;
pData=(BYTE*)new BYTE[lfileSize];
fread(pData,sizeof(BYTE),lfileSize,fs);
fwrite(pData,sizeof(BYTE),lfileSize,fa);
//调试过程中看到bmpHead.bfSize的值和bmpHead.bfOffBits的值相等
格兰特杨 2006-08-29
  • 打赏
  • 举报
回复
agree ma100.
ma100 2006-08-29
  • 打赏
  • 举报
回复
long lfileSize=bmpHead.bfSize-bmpHead.bfOffBits;

BYTE temp[lfileSize];
如此定义数组不行
cindysyp 2006-08-29
  • 打赏
  • 举报
回复
应该没有溢出,256×256的图像,
我不是一边读一边写吗?我没有明白你的意思
格兰特杨 2006-08-29
  • 打赏
  • 举报
回复
看看overflow了没有(lfileSize的值是多少)?
最好一边读一边写。读文件头的部分看不出问题啊。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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