大家帮我看看这个读写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;


}

...全文
370 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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的值是多少)?
最好一边读一边写。读文件头的部分看不出问题啊。
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.4w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2006-08-29 09:34
社区公告
暂无公告