版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liouyi250/article/details/78857498
这里有有一篇bitmap基本格式的博客,不再赘述
https://www.cnblogs.com/ZXNblog/p/4046342.html
下面讲述怎么将24为的bitmap图像变成灰色和黑白。
定义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);//蓝色矩阵
将图像每个像素的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; }
定义写入文件的函数
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);*/ } }
定义灰度定义函数
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; }
主函数调用,并释放指针
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;
原图:
灰色图像:
黑白图像: