VC中保存BMP位图文件的方法及BMP文件格式带源码实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includestdio.h#includeWindows.h//几个全局变量,存放读入图像的位图数据、宽、高、颜色表及每像素所占位数(比特)//此处定义全局变量主要为了后面的图像数据访问及图像存储作准备unsignedchar*pBmpBuf;//读入图像数据的指针intbmpWidth;//图像的宽intbmpHeight;//图像的高RGBQUAD*pColorTable;//颜色表指针intbiBitCount;//图像类型boolreadBmp(char*bmpName){//二进制读方式打开指定的图像文件FILE*fp=fopen(bmpName,rb);if(fp==0)return0;//跳过位图文件头结构BITMAPFILEHEADERfseek(fp,sizeof(BITMAPFILEHEADER),0);//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中BITMAPINFOHEADERhead;fread(&head,sizeof(BITMAPINFOHEADER),1,fp);//获取图像宽、高、每像素所占位数等信息bmpWidth=head.biWidth;bmpHeight=head.biHeight;biBitCount=head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)intlineByte=(bmpWidth*biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256if(biBitCount==8){//申请颜色表所需要的空间,读颜色表进内存pColorTable=newRGBQUAD[256];fread(pColorTable,sizeof(RGBQUAD),256,fp);}//申请位图数据所需要的空间,读位图数据进内存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;//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0intcolorTablesize=0;if(biBitCount==8)colorTablesize=1024;//待存储图像数据每行字节数为4的倍数intlineByte=(width*biBitCount/8+3)/4*4;//以二进制写的方式打开文件FILE*fp=fopen(bmpName,wb);if(fp==0)return0;//申请位图文件头结构变量,填写文件头信息BITMAPFILEHEADERfileHead;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;//写文件头进文件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=lineByte*height;head.biWidth=width;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;//写位图信息头进内存fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);//如果灰度图像,有颜色表,写入文件if(biBitCount==8)fwrite(pColorTable,sizeof(RGBQUAD),256,fp);//写位图数据进文件fwrite(imgBuf,height*lineByte,1,fp);//关闭文件fclose(fp);return1;}//调色板与灰度图像的关系voidmain(){//读入指定BMP文件进内存charreadPath[]=tarret.BMP;readBmp(readPath);//输出图像的信息printf(width=%d,height=%d,biBitCount=%d\n,bmpWidth,bmpHeight,biBitCount);//改变灰度图像的颜色表蓝色分量的值,察看前后变化if(biBitCount==8){for(inti=0;i256;i++){pColorTable[i].rgbBlue=255-pColorTable[i].rgbBlue;}}//将图像数据存盘charwritePath[]=tarret1.BMP;saveBmp(writePath,pBmpBuf,bmpWidth,bmpHeight,biBitCount,pColorTable);//清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间delete[]pBmpBuf;if(biBitCount==8)delete[]pColorTable;}#includestdio.h#includeWindows.hBYTE*pBmpBuf;//读¨¢入¨?图ª?像?数ºy据Y的Ì?指?针?intbmpWidth;//图ª?像?的Ì?宽¨ªintbmpHeight;//图ª?像?的Ì?高?RGBQUAD*pColorTable;//颜?色¦?表À¨ª指?针?intbiBitCount;//图ª?像?类¤¨¤型¨ªboolreadBmp(char*bmpName){FILE*fp=fopen(bmpName,rb);//二t进?制?读¨¢方¤?式º?打䨰开a指?定¡§的Ì?图ª?像?文?件tif(fp==NULL)return0;fseek(fp,sizeof(BITMAPFILEHEADER),0);//跳¬?过y位?图ª?文?件t头ª¡¤结¨¢构1BITMAPFILEHEADERBITMAPINFOHEADERhead;//定¡§义°?位?图ª?信?息¡é头ª¡¤结¨¢构1变À?量¢?,ê?读¨¢取¨?位?图ª?信?息¡é头ª¡¤进?内¨²存ä?,ê?存ä?放¤?在¨²变À?量¢?head中Dfread(&head,sizeof(BITMAPINFOHEADER),1,fp);bmpWidth=head.biWidth;//获?取¨?图ª?像?宽¨ª、¡é高?、¡é每?像?素?所¨´占?位?数ºy等̨¨信?息¡ébmpHeight=head.biHeight;biBitCount=head.biBitCount;intlByte=(bmpWidth*biBitCount/8+3)/4*4;//定¡§义°?变À?量¢?,ê?计?算?图ª?像?每?行D像?素?所¨´占?的Ì?字Á?节¨²数ºy/*if(biBitCount==8){pColorTable=newRGBQUAD[256];fread(pColorTable,sizeof(RGBQUAD),256,fp);}*/pBmpBuf=newBYTE[lByte*bmpHeight];//申¦¨º请?位?图ª?数ºy据Y所¨´需¨¨要°a的Ì?空?间?,ê?读¨¢位?图ª?数ºy据Y进?内¨²存ä?fread(pBmpBuf,1,lByte*bmpHeight,fp);fclose(fp);//关?闭À?文?件treturn1;}boolsaveBmp(char*bmpName,BYTE*imgBuf,intwidth,intheight,intbiBitCount,RGBQUAD*pColorTable){if(!imgBuf)return0;intcolorTablesize=0;//颜?色¦?表À¨ª大䨮小?,以°?字Á?节¨²为a单Ì£¤位?,灰¨°度¨¨图ª?像?颜?色¦?表À¨ª为a1024字Á?节¨²,彩¨º色¦?图ª?像?颜?色¦?表À¨ª大䨮小?为a0/*if(biBitCount==8)colorTablesize=1024;*/intlByte=(width*biBitCount/8+3)/4*4;//待äy存ä?储ä¡é图ª?像?数ºy据Y每?行D字Á?节¨²数ºyFILE*fp=fopen(bmpName,wb);//以°?二t进?制?写¡ä的Ì?方¤?式º?打䨰开a文?件tif(fp==NULL)return0;//申¦¨º请?位?图ª?文?件t头ª¡¤结¨¢构1变À?量¢?,ê?填¬?写¡ä文?件t头ª¡¤信?息¡éBITMAPFILEHEADERfileHead;fileHead.bfType=0x4D42;//bmp类¤¨¤型¨ª//bfSize是º?图ª?像?文?件t4个?组Á¨¦成¨¦部?分¤?之?和¨ªfileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lByte*height;fileHead.bfReserved1=0;fileHead.bfReserved2=0;//bfOffBits是º?图ª?像?文?件t前¡ã三¨y个?部?分¤?所¨´需¨¨空?间?之?和¨ªfileHead.bfOffBits=54+colorTablesize;fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);//写¡ä文?件t头ª¡¤进?文?件tBITMAPINFOHEADERhead;//申¦¨º请?位?图ª?信?息¡é头ª¡¤结¨¢构1变À?量¢?,ê?填¬?写¡ä信?息¡é头ª¡¤信?息¡éhead.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=height;head.biPlanes=1;head.biSize=40;head.biSizeImage=lByte*height;head.biWidth=width;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);//写¡ä位?图ª?信?息¡é头ª¡¤进?内¨²存ä?fwrite(imgBuf,height*lByte,1,fp);//写¡ä位?图ª?数ºy据Y进?文?件tfclose(fp);//关?闭À?文?件treturn1;}boolrgb_to_yuv(BYTE*imgBuf,intwidth,intheight){inti=0,j=0;for(i=0;iheight;i++){for(j=0;jwidth;

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功