欢迎来到天天文库
浏览记录
ID:11748004
大小:207.00 KB
页数:21页
时间:2018-07-13
《位bmp彩色图转换为位灰度图的方法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、24位bmp彩色图转换为24位灰度图的方法一、所用到的流处理函数:fstream:可同时进行读写操作的文件类;或ofstream:写操作(从内存中读数据到文件)的文件类;ifstream:读操作(从文件读数据到内存)的文件类。二、位图文件的格式:①位图文件头,所用结构体:BITMAPFILEHEADER,占14个字节②位图信息头,所用结构体:BITMAPINFOHEADER,占40个字节③颜色表项,所用结构体:RGBQUAD,由biBitCount值决定④数据区,当结构体BITMAPINFOHEADER中的成员变量biBitCount=1时,1个字节代表8个像素;biBitCount=2
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结构体大小的空间;当bi
3、BitCount=24时,③颜色表项不占空间,即位图文件只有①②④三项,这是因为数据区中3个字节代表一个像素,本身含有三原色分量值。三、需要注意的问题:1.bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp文件,数据区前三个字节代表位图左下角第一个元素;2.bmp文件存储的图片数据每行所占的字节数都是4的整数倍,不够的用0补充,所以有biSizeImage=((((bi.Width*bitBitCount)+31)&~31)/8)*bi.biHeight3.对于24位bmp文件,若图片每行像素所占字节数满足是4的整数倍这个条件,由于BITMAPFILEHEADER和BI
4、TMAPINFOHEADER所占的总字节数为54,不是4的倍数,所以补0后为56字节。四、方法一:BOOLCprogram2Dlg::RGB2GRAY(CStringstrPath){fstreamInfile;fstreamOutfile;BITMAPFILEHEADERbfheader={0};BITMAPINFOHEADERbiheader;unsignedchar*src;unsignedchar*dst;//打开与创建Infile.open("In_Picture.bmp",ios::binary
5、ios::in);Outfile.open("Out_Picture.bmp",
6、ios::binary
7、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);//彩色转灰度像
8、素处理,可在此加入图像处理算法dst=newunsignedchar[biheader.biHeight*biheader.biWidth*3];inttmp;unsignedlongj=0;for(unsignedlongi=0;i9、te((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;
9、te((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;
此文档下载收益归作者所有