资源描述:
《vc中保存bmp位图文件的方法及bmp文件格式带源码实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include"stdio.h"#include"Windows.h"//几个全局变量,存放读入图像的位图数据、宽、高、颜色表及每像素所占位数(比特)//此处定义全局变量主要为了后面的图像数据访问及图像存储作准备unsignedchar*pBmpBuf;//读入图像数据的指针intbmpWidth;//图像的宽intbmpHeight;//图像的高RGBQUAD*pColorTable;//颜色表指针intbiBitCount;//图像类型boolreadBmp(char*bmpName){ //二进制读方式打开指定的图像文件 FI
2、LE*fp=fopen(bmpName,"rb"); if(fp==0)return0; //跳过位图文件头结构BITMAPFILEHEADER fseek(fp,sizeof(BITMAPFILEHEADER),0); //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中 BITMAPINFOHEADERhead; fread(&head,sizeof(BITMAPINFOHEADER),1,fp); //获取图像宽、高、每像素所占位数等信息 bmpWidth=head.biWidth; bmpHeight=
3、head.biHeight; biBitCount=head.biBitCount; //定义变量,计算图像每行像素所占的字节数(必须是4的倍数) intlineByte=(bmpWidth*biBitCount/8+3)/4*4; //灰度图像有颜色表,且颜色表表项为256 if(biBitCount==8){ //申请颜色表所需要的空间,读颜色表进内存 pColorTable=newRGBQUAD[256]; fread(pColorTable,sizeof(RGBQUAD),256,fp); } //申请位图数据所需要的空间,
4、读位图数据进内存 pBmpBuf=newunsignedchar[lineByte*bmpHeight]; fread(pBmpBuf,1,lineByte*bmpHeight,fp); //关闭文件 fclose(fp); return1;}boolsaveBmp(char*bmpName,unsignedchar*imgBuf,intwidth,intheight, intbiBitCount,RGBQUAD*pColorTable){ //如果位图数据指针为0,则没有数据传入,函数返回 if(!imgBuf) return0
5、; //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0 intcolorTablesize=0; if(biBitCount==8) colorTablesize=1024; //待存储图像数据每行字节数为4的倍数 intlineByte=(width*biBitCount/8+3)/4*4; //以二进制写的方式打开文件 FILE*fp=fopen(bmpName,"wb"); if(fp==0)return0; //申请位图文件头结构变量,填写文件头信息 BITMAPFILEHEADERfileH
6、ead; fileHead.bfType=0x4D42;//bmp类型 //bfSize是图像文件4个组成部分之和 fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) +colorTablesize+lineByte*height; fileHead.bfReserved1=0; fileHead.bfReserved2=0; //bfOffBits是图像文件前三个部分所需空间之和 fileHead.bfOffBits=54+colorTablesize;
7、 //写文件头进文件 fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp); //申请位图信息头结构变量,填写信息头信息 BITMAPINFOHEADERhead; head.biBitCount=biBitCount; head.biClrImportant=0; head.biClrUsed=0; head.biCompression=0; head.biHeight=height; head.biPlanes=1; head.biSize=40; head.biSizeImage=lin
8、eByte*height; head.biWidth=width; head.biXPelsPerMeter=0; head.biYPelsPerMeter=0; //写位图信息头进内存 fw