申请书范文网,分享全网优秀范文,学习好帮手!
申请书范文网 > 【图像处理基础】C语言对bmp图片进行处理

【图像处理基础】C语言对bmp图片进行处理

时间:2024-01-16 12:37:28

相关推荐

【图像处理基础】C语言对bmp图片进行处理

1.bmp文件的定义

#ifndef IMAGE_H#define IMAGE_Hvoid image_info(FILE* file);void image_save(FILE *file);void image_gray();void image_binarization();void image_opposite();void image_channel(); //抽取RGB通道void image_bright();//改变图像亮度typedef struct BMP{//14字节unsigned short bfType; //文件标识 2字节 必须为BMunsigned int bfSize; //文件大小 4字节unsigned short bfReserved1; //保留,每字节以"00"填写 2字节unsigned short bfReserved2; //同上 2字节unsigned int bfOffBits; //记录图像数据区的起始位置(图象数据相对于文件头字节的偏移量)。 4字节//40字节unsigned int biSize; //表示本结构的大小 4字节int biWidth; //位图的宽度 4字节int biHeight; //位图的高度 4字节unsigned short biPlanes; //永远为1 , 2字节unsigned short biBitCount; //位图的位数 分为1 4 8 16 24 32 2字节unsigned int biCompression; //压缩说明 4字节unsigned int biSizeImage; //表示位图数据区域的大小以字节为单位 4字节int biXPelsPerMeter; //用象素/米表示的水平分辨率 4字节int biYPelsPerMeter; //用象素/米表示的垂直分辨率 4字节unsigned int biClrUsed; //位图使用的颜色索引数 4字节unsigned int biClrImportant; //对图象显示有重要影响的颜色索引的数目 4字节} BMP;int line_byte;unsigned char *imagedata;extern BMP bmp;extern int line_byte;extern unsigned char *imagedata;#endif

2.bmp图片的读写以及保存处理

#include<stdio.h>#include<stdlib.h>#include"image.h"void image_info(FILE *file){int times=3; //输入文件名次数。char bmp_name[10]; //文件名printf("\nplease enter a file name for reading:");do{if (times<3){printf("\nplease enter a file name for reading again:");}fflush(stdin);gets(bmp_name);//printf("\n%s",bmp_name);file=fopen(bmp_name,"rb+"); //打开一个文件进行读写操作。--times;if (file==NULL){printf("\nerror opening %s for reading! ",bmp_name);}else{break;}}while(times!=0);if (times==0){printf("\nsorry, shutdown!");exit(1);}//读取图像信息fseek(file,0L,0); //读取图像文件类型fread(&bmp,sizeof(BMP),1,file);printf("\n bmp tpye: %u",bmp.bfType);printf("\n bmp size: %u",bmp.bfSize);printf("\n bmp reserved1: %u",bmp.bfReserved1);printf("\n bmp reserved2: %u",bmp.bfReserved2);printf("\n bmp offBits: %u",bmp.bfOffBits);printf("\n bmp bisize: %u",bmp.biSize);printf("\n bmp biWidth: %d",bmp.biWidth);printf("\n bmp biHeight: %d",bmp.biHeight);printf("\n bmp biplans: %u",bmp.biPlanes);printf("\n bmp biBitCount: %u",bmp.biBitCount);printf("\n bmp biCompression: %u",bmp.biCompression);printf("\n bmp biSizeImage: %u",bmp.biSizeImage);printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);printf("\n bmp biClrUsed: %u",bmp.biClrUsed);printf("\n bmp biClrImportant: %u\n",bmp.biClrImportant);line_byte=(bmp.biWidth*bmp.biBitCount/8+3)/4*4; //获得图像数据每行的数据个数//printf("dfsa%u",bmp.line_byte);//bmp.imagedata=NULL;imagedata=(unsigned char*)malloc(bmp.biSizeImage);fseek(file,(long)bmp.bfOffBits,0);fread(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);fclose(file);}//保存图像void image_save(FILE *file){int times=3; //输入文件名次数。char bmp_name[10]; //文件名//int i; //记录数据区个数printf("\nplease enter a file name for writeing:");do{if (times<3){printf("\nplease enter a file name for writeing again:");}fflush(stdin);gets(bmp_name);printf("\n%s",bmp_name);file=fopen(bmp_name,"wb+"); //打开一个文件进行读写操作。--times;if (file==NULL){printf("\nerror opening %s for writing",bmp_name);}else{break;}}while(times!=0);if (times==0){printf("\nsorry, shutdown!");exit(1);}//写文件头printf("\n%s",bmp_name);fseek(file,0L,0); //图像文件类型fwrite(&(bmp.bfType),sizeof(short),1,file);printf("\n bmp tpye: %d",bmp.bfType);fseek(file,2L,0); //图像文件大小fwrite(&(bmp.bfSize),sizeof(int),1,file);printf("\n bmp size: %d",bmp.bfSize);fseek(file,6L,0); //图像文件保留字1fwrite(&(bmp.bfReserved1),sizeof(short),1,file);printf("\n bmp reserved1: %d",bmp.bfReserved1);fseek(file,8L,0); //图像文件保留字2fwrite(&(bmp.bfReserved2),sizeof(short),1,file);printf("\n bmp reserved2: %d",bmp.bfReserved2);fseek(file,10L,0);//数据区的偏移量fwrite(&(bmp.bfOffBits),sizeof(short),1,file);printf("\n bmp offBits: %d",bmp.bfOffBits);fseek(file,14L,0);//文件头结构大小fwrite(&(bmp.biSize),sizeof(int),1,file);printf("\n bmp bisize: %d",bmp.biSize);fseek(file,18L,0);//图像的宽度fwrite(&(bmp.biWidth),sizeof(int),1,file);printf("\n bmp biWidth: %d",bmp.biWidth);fseek(file,22L,0);//图像的高度fwrite(&(bmp.biHeight),sizeof(int),1,file);printf("\n bmp biHeight: %d",bmp.biHeight);fseek(file,24L,0);//图像的面数fwrite(&(bmp.biPlanes),sizeof(short),1,file);printf("\n bmp biplans: %d",bmp.biPlanes);fseek(file,28L,0);//图像一个像素的字节数fwrite(&(bmp.biBitCount),sizeof(short),1,file);printf("\n bmp biBitCount: %d",bmp.biBitCount);fseek(file,30L,0);//图像压缩信息fwrite(&(bmp.biCompression),sizeof(short),1,file);printf("\n bmp biCompression: %d",bmp.biCompression);fseek(file,34L,0);//图像数据区的大小fwrite(&(bmp.biSizeImage),sizeof(int),1,file);printf("\n bmp biSizeImage: %d",bmp.biSizeImage);fseek(file,38L,0);//水平分辨率fwrite(&(bmp.biXPelsPerMeter),sizeof(int),1,file);printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);fseek(file,42L,0);//垂直分辨率fwrite(&(bmp.biYPelsPerMeter),sizeof(int),1,file);printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);fseek(file,46L,0);//颜色索引数fwrite(&(bmp.biClrUsed),sizeof(int),1,file);printf("\n bmp biClrUsed: %d",bmp.biClrUsed);fseek(file,50L,0);//重要颜色索引数fwrite(&(bmp.biClrImportant),sizeof(int),1,file);printf("\n bmp biClrImportant: %d\n",bmp.biClrImportant);fseek(file,(long)(bmp.bfOffBits),0);fwrite(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);fclose(file);}

3.bmp图片像素的处理(灰度化、二值化、反相、抽取RGB通道以及改变图像亮度)

//pixProcess.c文件#include<stdio.h>#include<stdlib.h>#include<math.h>#include"image.h"//灰度化void image_gray(){int i,j;unsigned char tmp;for (i=0;i<bmp.biHeight;i++){for (j=0;j<line_byte/3;j++){tmp=0.11*(*(imagedata+i*line_byte+j*3+0))+0.59*(*(imagedata+i*line_byte+j*3+1))+0.3*(*(imagedata+i*line_byte+j*3+2));imagedata[i*line_byte+j*3+0]=tmp;imagedata[i*line_byte+j*3+1]=tmp;imagedata[i*line_byte+j*3+2]=tmp;//printf("\nnidsfh%d %d",i,j);}}}//二值化void image_binarization(){int i,j;for (i=0;i<bmp.biHeight;i++){for (j=0;j<line_byte;j++){if ((*(imagedata+i*line_byte+j))<128){imagedata[i*line_byte+j]=0;}else{imagedata[i*line_byte+j]=255;}}}}//反相void image_opposite() {int i,j;for (i=0;i<bmp.biHeight;i++){for (j=0;j<line_byte;j++){imagedata[i*line_byte+j]=abs(255-imagedata[i*line_byte+j]);}}}//抽取RGB通道void image_channel() {int i,j;char rgb;printf("\nplease enter a char(r/g/b): ");fflush(stdin);scanf("%c",&rgb);if (rgb=='b'){for (i=0;i<bmp.biHeight;i++){for (j=0;j<line_byte/3;j++){imagedata[i*line_byte+3*j+1]=0;imagedata[i*line_byte+3*j+2]=0;}}}else if(rgb=='g'){for (i=0;i<bmp.biHeight;i++){for (j=0;j<line_byte/3;j++){imagedata[i*line_byte+3*j]=0;imagedata[i*line_byte+3*j+2]=0;}}}else{for (i=0;i<bmp.biHeight;i++){for (j=0;j<line_byte/3;j++){imagedata[i*line_byte+3*j]=0;imagedata[i*line_byte+3*j+1]=0;}}}}//改变图像亮度void image_bright(){int level;int i,j;printf("\n please enter the level of brightness[-255 to 255] :");fflush(stdin);scanf("%d",&level);for (i=0;i<bmp.biHeight;i++){for (j=0;j<line_byte;j++){if (level>=0){if ((imagedata[i*line_byte+j]+level)>255)imagedata[i*line_byte+j]=255;elseimagedata[i*line_byte+j]+=level;}else{if ((imagedata[i*line_byte+j]-abs(level))<0)imagedata[i*line_byte+j]=0;elseimagedata[i*line_byte+j]+=level;}}}}

4.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。