代码开源(5)——彩色bmp图片转灰度

来源:互联网 发布:mac itunes12.7无铃声 编辑:程序博客网 时间:2024/05/16 06:57

         下面这个程序可以将一个彩色的bmp格式图片转换灰度图片:

#include <iostream.h>#include <windows.h>#include <stdio.h>/*BMP文件格式如下:㈠BITMAPFILEHEADER:位图文件头(只用于BMP文件)  bfType="BM"  bfSize  bfReserved1  bfReserved2  bfOffBits  从文件头到实际的位图数据的偏移字节数,即前三个部分长度之和㈡BITMAPINFOHEADER:位图信息头                  biSize     这个结构的长度,为40个字节  biWidth    图象的宽度,单位是像素  biHeight   图象的高度,单位是像素  biPlanes  biBitCount  biCompression  biSizeImage 实际的位图字节数据占用的字节数 biSizeImage=biWidth_*biHeight,其中biWidth必须是4的整数倍              如果biCompression为BI_RGB,则该项可能为0  biXPelsPerMeter  biYPelsPerMeter  biClrUsed  biClrImportant㈢Palette         :调色板                  灰度图象一般不需要考虑调色板,一般灰度图没有调色板㈣DIB Pixels      :图象数据*/BITMAPFILEHEADER bf;  //文件头BITMAPINFOHEADER bi;  //信息头RGBQUAD  *palette=NULL;     //调色板BYTE   *m_imagedata=NULL;   //图象数据指针BYTE   *m_outputdata=NULL;  //输出数据指针int     m_ImageWidth;   //图象宽度int     m_ImageHeight;  //图象高度void main(){FILE  *fp1,*fp2;  //文件指针,fp1为源文件,fp2为处理以后的文件//打开文件,到文件指针if((fp1=fopen("test.bmp","rb"))==NULL){MessageBox(NULL,"文件打开错误","warning",MB_OK);}fread((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp1);  //读取文件头,读取以后文件指针在文件头末尾(即信息头)//以下输出文件头的一些有用的数据int temp=bf.bfType;          //便于将开头两个字节转化为字符显示cout<<"BM标志:"<<(char *)(&temp)<<'\n';cout<<"偏移字节数:"<<bf.bfOffBits<<'\n';fread((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp1);  //读取信息头//以下输出信息头的一些有用的数据cout<<"图象宽度:"<<bi.biWidth<<'\n';cout<<"图象高度:"<<bi.biHeight<<'\n';m_ImageWidth=bi.biWidth;             //给图象宽度赋值m_ImageHeight=bi.biHeight;           //给图象高度赋值//每一行的数据必须是4的整数倍,如果不是,需要补齐    while(m_ImageWidth%4!=0) //让宽度为4的整数倍m_ImageWidth++;//读取调色板palette=(RGBQUAD *)new BYTE[bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER)];fread(palette,bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER),1,fp1);   m_imagedata= new BYTE[m_ImageHeight*m_ImageWidth*3];   //给图象数据指针分配空间fread(m_imagedata,m_ImageHeight*m_ImageWidth*3,1,fp1);  //读取图象数据 //图象数据是从第0行开始存储的,然后依次是第一行,第二行.......//图象数据读取以后就可以对其进行处理   m_outputdata= new BYTE[m_ImageHeight*m_ImageWidth*3];   //给图象数据指针分配空间//这一部分添加对图象数据即m_imagedata处理的过程,处理结果放在m_outputdata中    //如果想观察处理结果,可以把它们另存为一个文件,该文件使用原来文件的文件头,而图象数据为处理过的数据//这儿我仅把图象数据不作处理copy到输出图象中,得到的图象和原来一样for(int i=0;i<m_ImageHeight;i++){for(int j=0;j<m_ImageWidth*3;j=j+3){int k=m_ImageWidth*i*3+j;int gray=(int)(0.3*m_imagedata[k]+0.59*m_imagedata[k+1]+0.11*m_imagedata[k+2]);m_outputdata[k]=m_outputdata[k+1]=m_outputdata[k+2]=gray;}}//创建新文件if((fp2=fopen("result.bmp","wb"))==NULL){MessageBox(NULL,"文件创建失败","warning",MB_OK);}//写结果文件,文件信息部分用test文件的文件信息部分    fwrite((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp2);fwrite((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp2);fwrite(palette,bf.bfOffBits-sizeof(BITMAPFILEHEADER)-sizeof(BITMAPINFOHEADER),1,fp2);fwrite(m_outputdata,m_ImageHeight*m_ImageWidth*3,1,fp2); //写像素数据fclose(fp1);  //关闭文件fclose(fp2);}


原创粉丝点击