用C语言储存BMP文件

时间:2008-06-05 12:58:11   来源:论坛整理  作者:  编辑:chinaitzhe
我用C语言成功读取了一副BMP文件,像素数据都已经可以成功的显示出来。现在我想储存这幅图像到另外一个位置,虽然新的save的BMP文件可以打开,但是不知道为何整副图片是黑色的,和原来的文件不一样。我查看了新save的文件的像素数据,应该是正确的,和原来的图片一样,那么这是为什么会发生这样的事情呢?请教大家了。我的图片是黑白二色的,调色板应该正常设置了。
网友回复:检查文件头中的BITMAPINFOHEADER
网友回复:不要查看像素数据了,看看头结构吧。
网友回复:看看头结构。
网友回复:看头结构。
网友回复:
这是我的文件头,请问有没有问题呢?

int saveBMPhead(char *file) //写BMP文件头
{
struct BITMAPFILEHEADER filehead ={'B','M',0,0,0,0,}; //位图文件头
struct BITMAPINFOHEADER bmi={40,0,0,1,0,0,0,0,0,0,0,}; //位图信息头
RGBQUAD rgb;
FILE *fp;

int m,flag=0;
ColorNum=1 < <BitCount; //计算调色板单元数
if(BitCount <=8) m=ColorNum*4; //计算调色板数据字节数
else m=0;
ColorMap=14 bmi.biSize; //计算调色板数据存储位置
OffBits=ColorMap m; //计算像素存储位置
fp=fopen(file,"w b"); //建立图像文件
if(fp!=NULL){
flag=1;
bmi.biWidth=Width; //设置图像参数
bmi.biHeight=Height;
bmi.biBitCount=BitCount;
bmi.biXpelspermeter=Xpelspermeter;
bmi.biYpelspermeter=Ypelspermeter;
bmi.biSizeImage=BiSizeImage;
bmi.biClrUsed=ClrUsed;
bmi.biClrImportant=biClrImportant;
filehead.bfOffBits=OffBits;
filehead.bfSize=(long)BytesPerLine*Height OffBits;
fwrite(&filehead,sizeof(filehead),1,fp); //写位图文件头
fwrite(&bmi,sizeof(bmi),1,fp); //写位图信息头
rgb.rgbRed=rgbRed;
rgb.rgbGreen=rgbGreen;
rgb.rgbBlue=rgbBlue;
rgb.rgbReversed=rgbReversed;
//if(bmi.biBitCount <=8){

fclose(fp); //关闭图像文件
cout < <bmi.biClrImportant < <endl;
}
return(flag);
}
网友回复:这是我的头文件,请问有没有问题呢?

int saveBMPhead(char *file) //写BMP文件头
{
struct BITMAPFILEHEADER filehead ={'B','M',0,0,0,0,}; //位图文件头
struct BITMAPINFOHEADER bmi={40,0,0,1,0,0,0,0,0,0,0,}; //位图信息头
RGBQUAD rgb;
FILE *fp;

int m,flag=0;
ColorNum=1 < <BitCount; //计算调色板单元数
if(BitCount <=8) m=ColorNum*4; //计算调色板数据字节数
else m=0;
ColorMap=14 bmi.biSize; //计算调色板数据存储位置
OffBits=ColorMap m; //计算像素存储位置
fp=fopen(file,"w b"); //建立图像文件
if(fp!=NULL){
flag=1;
bmi.biWidth=Width; //设置图像参数
bmi.biHeight=Height;
bmi.biBitCount=BitCount;
bmi.biXpelspermeter=Xpelspermeter;
bmi.biYpelspermeter=Ypelspermeter;
bmi.biSizeImage=BiSizeImage;
bmi.biClrUsed=ClrUsed;
bmi.biClrImportant=biClrImportant;
filehead.bfOffBits=OffBits;
filehead.bfSize=(long)BytesPerLine*Height OffBits;
fwrite(&filehead,sizeof(filehead),1,fp); //写位图文件头
fwrite(&bmi,sizeof(bmi),1,fp); //写位图信息头
rgb.rgbRed=rgbRed;
rgb.rgbGreen=rgbGreen;
rgb.rgbBlue=rgbBlue;
rgb.rgbReversed=rgbReversed;
//if(bmi.biBitCount <=8){

fclose(fp); //关闭图像文件
cout < <bmi.biClrImportant < <endl;
}
return(flag);
}
网友回复:发现一个新问题,我用ps就可以顺利打开,但是用Windows自带的看图软件或者AcdSee就无法正确显示,但是用ps打开后,在另储为在电脑后,又可以显示了,这是不是与Windows的格式有关呢?
网友回复:把代码全贴出来看看。
关键字:语言,储存,BMP,文件,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面