• 将24位BMP真彩图转换成BMP灰度图


    转自:http://blog.csdn.net/xiakq/article/details/2956902

           真正的24位真彩图与8位的灰度图的区别就在于,真彩图文件中没有调色板,灰度图有调色板,真彩图中的象素矩阵是RGB值,灰度图中的象素矩阵是调色板索引值。

            我在这里用C语言只简单的改变象素矩阵的RGB值,来达到彩色图转变为灰度图,并没有添加调色板。

             主要步骤:    选择算法把R,G,B三原色转换成灰度颜色。

             算法选取

            (1)平均值算法:   
              顾名思意,就是取某点R、G、B三原色的平均值作为该点转换之后的灰度颜色,可用公式表示如下:   
              R=G=B=(R+G+B)/3   
            (2)快速算法:   
              由于平均值算法的公式当中有除3的步骤,所以如果用在游戏中的话实时效果一定会大打折扣,所以有必要将其改造一下,首先想到的是用移位来代替除法,我们使用/4(也就是>>2)来实现。但是/3和/4之间的误差太大,有必要将其公式改造一下,设改造后的公式为(R+G+B+a)>>2,解出a的值是(R+G+B)/3,我们暂时取a为128(0~255的中间值)。公式如下:   
      R=G=B=(R+G+B+128)/4>>2   
      (3).加权平均值算法:   
              根据光的亮度特性,其实正确的灰度公式应当是R=G=B=R*0.299+G*0.587+B0.144,为了提高速度我们做一个完全可以接受的近似,公式变形如下:   
      R=G=B=(R*3+G*6+B)/10   
      (4).精确加权平均值算法:   
              如果你的程序不是用于游戏,而只是想得到灰度图,那么就老老实实的使用带浮点数的公式吧:   
      R=G=B=R*0.299+G*0.587+B0.144

     

     

    源代码

     

     

     

    #include <stdio.h>  
    #include <windows.h> 


    int main()
    {
     BITMAPFILEHEADER bmpfileheader;     //文件头
     BITMAPINFOHEADER bmpinfoheader;     //信息头
        
     BYTE *matrix1;                      //象素矩阵
     FILE *fp;                           //读取操作流
     FILE *store;                        //读出操作流

     


     fp=fopen("picture.bmp","r+b");
     if (fp == NULL) 
     {  
      printf("Open failed/n");
      
      return 1;  
     } 
     else  
      printf("Open Successsfully/n");

        
     fread(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,fp);//读取文件头
     fread(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,fp);//读取信息头
     if (bmpinfoheader.biBitCount != 24)
     {
      printf("The error picture!");
      return 1;
     }
     
       
      
        matrix1 = new BYTE[bmpinfoheader.biSizeImage];
     memset(matrix1,0,bmpinfoheader.biSizeImage);
     

     fread(matrix1,1,bmpinfoheader.biSizeImage,fp);//读取象素矩阵

     fclose(fp);


     for(unsigned long k=0;k<bmpinfoheader.biSizeImage;k=k+3)
     {
      
      *(matrix1+k)=*(matrix1+k+1)=*(matrix1+k+2)=(*(matrix1+k)+*(matrix1+k+1)+*(matrix1+k+2))/3;
     
     }

     

        //创建新的灰度图
     
     store=fopen("test.bmp","w+b");
     fwrite(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,store);
     fwrite(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,store);

     fwrite(matrix1,1,bmpinfoheader.biSizeImage,store);
     fclose(store);

     int a;
     scanf("%d",&a);

     return 0;
    }

     

     

     

            


  • 相关阅读:
    兼容所有浏览器的CSS3圆角效果
    浏览器兼容 IE6、IE7、IE8、Firefox、Opera CSS hack区分
    分享30个优秀的网站导航设计案例
    解析如何改善和优化 Web 服务器性能
    分享40款效果非常漂亮的 HTML5 & CSS3 网站模板,模板免费下载
    分享20个非常有创意的蓝色风格网页作品触发你的设计灵感
    分享20个效果非常绚丽的 CSS3 特性应用演示
    推荐12个优秀的 HTML5 网站设计案例欣赏
    网站设计风格及色彩搭配技巧
    舞动你的文字,巧用CSS中marquee属性
  • 原文地址:https://www.cnblogs.com/pamxy/p/2991459.html
Copyright © 2020-2023  润新知