您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 24位bmp彩色图转换为24位灰度图的方法
24位bmp彩色图转换为24位灰度图的方法一、所用到的流处理函数:fstream:可同时进行读写操作的文件类;或ofstream:写操作(从内存中读数据到文件)的文件类;ifstream:读操作(从文件读数据到内存)的文件类。二、位图文件的格式:①位图文件头,所用结构体:BITMAPFILEHEADER,占14个字节②位图信息头,所用结构体:BITMAPINFOHEADER,占40个字节③颜色表项,所用结构体:RGBQUAD,由biBitCount值决定④数据区,当结构体BITMAPINFOHEADER中的成员变量biBitCount=1时,1个字节代表8个像素;biBitCount=2时,1个字节代表2个像素;biBitCount=8时,1个字节代表1个像素;biBitCount=16时,2个字节代表1个像素;biBitCount=24时,3个字节代表1个像素;RGBQUAD结构体的定义如下:typedefstructtagRGBQUAD{BYTErgbBlue;//蓝色分量BYTErgbGreen;//绿色分量BYTErgbRed;//红色分量BYTErgbReserved;//保留值,必须为0.}RGBQUAD;即一个RGBQUAD结构体占4个字节,当biBitCount=1,2,4,8时,颜色表项分别占2,4,16,256个RGBQUAD结构体大小的空间;当biBitCount=24时,③颜色表项不占空间,即位图文件只有①②④三项,这是因为数据区中3个字节代表一个像素,本身含有三原色分量值。三、需要注意的问题:1.bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp文件,数据区前三个字节代表位图左下角第一个元素;2.bmp文件存储的图片数据每行所占的字节数都是4的整数倍,不够的用0补充,所以有biSizeImage=((((bi.Width*bitBitCount)+31)&~31)/8)*bi.biHeight3.对于24位bmp文件,若图片每行像素所占字节数满足是4的整数倍这个条件,由于BITMAPFILEHEADER和BITMAPINFOHEADER所占的总字节数为54,不是4的倍数,所以补0后为56字节。四、方法一:BOOLCprogram2Dlg::RGB2GRAY(CStringstrPath){fstreamInfile;fstreamOutfile;BITMAPFILEHEADERbfheader={0};BITMAPINFOHEADERbiheader;unsignedchar*src;unsignedchar*dst;//打开与创建Infile.open(In_Picture.bmp,ios::binary|ios::in);Outfile.open(Out_Picture.bmp,ios::binary|ios::out);//读取文件头与信息头Infile.read((char*)&bfheader,sizeof(bmp_fileheader));Infile.read((char*)&biheader,sizeof(bmp_infoheader));//开辟空间载入内存src=newunsignedchar[biheader.biHeight*biheader.biWidth*3];Infile.read((char*)src,sizeof(unsignedchar)*biheader.biHeight*biheader.biWidth*3);//彩色转灰度像素处理,可在此加入图像处理算法dst=newunsignedchar[biheader.biHeight*biheader.biWidth*3];inttmp;unsignedlongj=0;for(unsignedlongi=0;ibiheader.biHeight*biheader.biWidth*3;i+=3){tmp=(src[i]+src[i+1]+src[i+2])/3;dst[j++]=(unsignedchar)tmp;dst[j++]=(unsignedchar)tmp;dst[j++]=(unsignedchar)tmp;}//写文件头与信息头Outfile.write((char*)&bfheader,sizeof(bmp_fileheader));Outfile.write((char*)&biheader,sizeof(bmp_infoheader));Outfile.write((char*)dst,sizeof(unsignedchar)*biheader.biWidth*biheader.biHeight*3);delete[]src;delete[]dst;returnTRUE;}五、方法二:BOOLCprogram2Dlg::PictureProcessing(CStringstrPath){//fstreaminput_file;//fstreamoutput_file;bmp_fileheaderbfh={0};bmp_infoheaderbih;unsignedchar*src_buff;unsignedchar*dst_buff;FILE*fpin=fopen(In_Picture.bmp,rb);FILE*fpout=fopen(Out_Picture.bmp,wb);if(fpin==NULL||fpout==NULL)return0;fread(&bfh,sizeof(bmp_fileheader),1,fpin);fread(&bih,sizeof(bmp_infoheader),1,fpin);src_buff=newunsignedchar[bih.biHeight*bih.biWidth*3];fread(src_buff,sizeof(unsignedchar),bih.biHeight*bih.biWidth*3,fpin);dst_buff=newunsignedchar[bih.biHeight*bih.biWidth*3];inttmp;unsignedlongj=0;for(unsignedlongi=0;ibih.biHeight*bih.biWidth*3;i+=3){tmp=(src_buff[i]+src_buff[i+1]+src_buff[i+2])/3;dst_buff[j++]=(unsignedchar)tmp;dst_buff[j++]=(unsignedchar)tmp;dst_buff[j++]=(unsignedchar)tmp;}fwrite(&bfh,sizeof(bmp_fileheader),1,fpout);fwrite(&bih,sizeof(bmp_infoheader),1,fpout);fwrite(dst_buff,sizeof(unsignedchar),bih.biWidth*bih.biHeight*3,fpout);delete[]src_buff;delete[]dst_buff;returnTRUE;}
本文标题:24位bmp彩色图转换为24位灰度图的方法
链接地址:https://www.777doc.com/doc-2913452 .html