现在的位置: 首页 > 综合 > 正文

如何把bmp真彩图片灰化?

2012年02月09日 ⁄ 综合 ⁄ 共 1003字 ⁄ 字号 评论关闭

       首先,要先了解一下bmp图片的格式。所谓的真彩图,即位深为24位的bmp图片,每个像素用三个字节表示,使得色彩更加丰富,真彩图不带调色板,原因是因为呢,真彩图用RGB三字节来表示即可,而调色板不是不可行,而是调色板结构体除了RGB之外还预留了一个字节,用此方法表示的话,就使得图片变得比较大了,不可取。

       那么我们的流程该怎么走呢?

       1.打开一个已知路径下的图片文件(bmp格式)。如:

           CFileDialog filedlg(TRUE, NULL, NULL,
                  OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
                        _T("图像(*.bmp)|*.bmp"));

            FILE *finput;;

              finput = _tfopen(path,_T("rb+"));

       2.定义位图信息头,以及位图文件头结构体,读取位图数据:

            BITMAPFILEHEADER bmfh; //位图文件头
            BITMAPINFOHEADER bmih; //位图信息头

            fread(&bmfh,sizeof(BITMAPFILEHEADER),1,finput);//读取文件头 
            fread(&bmih,sizeof(BITMAPINFOHEADER),1,finput);//读取信息头

            fread(buf,1,Size,finput);//Size即数据大小,buf指缓存

      3.  根据公式  color = 0.299*r+0.587*g+0.114*b灰化

           for(unsigned long k=0;k<Size;k=k+3) 
     { 
     *(buf+k)=*(buf+k+1)=*(buf+k+2)=(*(buf+k)*0.299+*(buf+k+1)*0.587+*(buf+k+2)*0.114); 
     } 

     4.重新把文件数据写入一个文件,即可看到灰化效果咯。。。

     DEMO地址:http://download.csdn.net/detail/chenfanfanwin/5289145

抱歉!评论已关闭.