使用C语言操作bitmap(彩色变灰色,黑白)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liouyi250/article/details/78857498

这里有有一篇bitmap基本格式的博客,不再赘述
https://www.cnblogs.com/ZXNblog/p/4046342.html
下面讲述怎么将24为的bitmap图像变成灰色和黑白。

  1. 定义BITMAPFILEHEADER,和BITMAPINFOHEADER,并从原图像获取图像信息

        typedef unsigned char uc;
        BITMAPFILEHEADER fileHeader;//在windows.h文件中有定义 
        BITMAPINFOHEADER infoHeader;//同上 
    
        FILE* f=fopen("1.bmp","rb");
        FILE* f2=fopen("4.bmp","wb");
        fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,f);
        fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,f);
        int height,width;
        width=infoHeader.biWidth;
        height=infoHeader.biHeight;
        uc* r=(uc*)malloc(width*height);//红色矩阵 
        uc* g=(uc*)malloc(width*height);//绿色矩阵 
        uc* b=(uc*)malloc(width*height);//蓝色矩阵 
    
  2. 将图像每个像素的rgb颜色读取到数组中

    void loadImage(FILE* fin,uc* r,uc* g,uc *b,int height,int width){
        //fin文件指针已经过了两个文件头 
        int stride=((24*width+31)>>5)<<2;//取4的倍数,
        uc *t=(uc*)malloc(stride);; 
        for(int i=0;i<height;i++){
            fread(t,1,stride,fin);
            for(int j=0;j<width;j++){
                *(r+i*width+j)=t[3*j+2];//红色,从左下角开始读取 
                *(g+i*width+j)=t[3*j+1];//绿色 
                *(b+i*width+j)=t[3*j];//蓝色 
            }
        }
        free(t);
        t=NULL;
    }
    
  3. 定义写入文件的函数

    void removeBitmapColor(FILE* fout,int height,int width,uc (*fun)(uc r,uc g,uc b),uc *r,uc *g,uc *b){
        //fun为计算灰度的函数指针
        int stride=((24*width+31)>>5)<<2;
        uc *t=(uc*)malloc(stride);
        uc temp;
        for(int i=0;i<height;i++){
            for(int j=0;j<width;j++){
                temp=(*fun)(*(r+i*width+j),*(g+i*width+j),*(b+i*width+j));
    //          printf("%d ",temp);
    /*恢复原图 
                t[3*j]=*(b+i*width+j);
                t[3*j+1]=*(g+i*width+j);
                t[3*j+2]=*(r+i*width+j);
    */  
    /*图像去色,变成灰度图像
                t[3*j]=t[3*j+1]=t[3*j+2]=temp;  */
    /*变成黑白图像 
            if(temp>128)
                t[3*j]=t[3*j+1]=t[3*j+2]=(uc)255;
            else
                t[3*j]=t[3*j+1]=t[3*j+2]=0;
            }
            fwrite(t,1,stride,fout);*/
        }
    }   
    
  4. 定义灰度定义函数

    uc func1(uc r,uc b,uc g){//matlab去色算法 
        float f=0.2989*(int)r+0.587*(int)b+0.114*(int)g;
        return uc((int)f);
    }
    uc func2(uc r,uc b,uc g){//opencv去色算法 
        float f=0.299*(int)r+0.587*(int)b+0.114*(int)g;
    }
    
  5. 主函数调用,并释放指针

    ILE* f2=fopen("4.bmp","wb");
    fwrite(&fileHeader,sizeof(BITMAPFILEHEADER),1,f2);
    fwrite(&infoHeader,sizeof(BITMAPINFOHEADER),1,f2);
    loadImage(f,r,g,b,height,width);    
    removeBitmapColor(f2,height,width,&func1,r,g,b);
    fclose(f);
    free(r);
    free(g);
    free(b);
    r=NULL;
    g=NULL;
    b=NULL;
    

    原图:
    24位
    灰色图像:
    24位
    黑白图像:
    24位

猜你喜欢

转载自blog.csdn.net/liouyi250/article/details/78857498