/*
filter.c
*/
#include
#include
/*
定义头文件型
*/
typedef struct
{
unsigned char id1,id2;//图片文件类型;
unsigned int filesize;//文件总大小;
unsigned int reserved;//保留,置零;
unsigned int bitmapdataoffset;//
unsigned int bitmapheadersize;//头文件数据大小;
unsigned int width;//图片宽度;
unsigned int height;//图片高度;
unsigned short planes;//图片位面数;
unsigned short bitperpixel;//每像素比特数;
unsigned int compression;//是否压缩;
unsigned int bitmapdatasize;//图片数据大小;
unsigned int hresolution;//水平分辨率;
unsigned int vresolution;//垂直分辨率;
unsigned int colors;//颜色数;
unsigned int importantcolors;//重要颜色数:
unsigned char palette[256][4];//调色板;
unsigned char bitmapdata[256][256];//图片数据;
}BMPheaderfile;
/*
用于获取文件长度的函数
*/
long getfilesize(FILE* f)
{
long pos,len;
pos=ftell(f);
fseek(f,0,SEEK_END);
len=ftell(f);
fseek(f,pos,SEEK_SET);
return len;
}
/*
主函数
*/
void main()
{
FILE* fpr;//读文件指针;
FILE* fpw;//写文件指针;
BMPheaderfile BMPheader;//头文件型变量;
unsigned char* data;//读取到的数据;
unsigned char* buffer;//数据缓存;
int i,j;
int h,w;
unsigned char num[5];
unsigned char t;
long length;//文件长度;
long position;//用于察看指针所在位置;
/*
打开文件
*/
if((fpr=fopen("girl2.bmp","rb"))==NULL)
{
printf("cannot read this file\n");
exit(0);
}
if((fpw=fopen("ogirl2.bmp","wb"))==NULL)
{
printf("cannot write this file\n");
exit(0);
}
/*
获取文件数据的总大小;
*/
length=getfilesize(fpr);
printf("\nfilesize %ld\n",length);
data=(unsigned char*)malloc((length-1078)*sizeof(char));//为数据分配内存空间;
/*
获取取头文件信息
*/
fread(data,1,length,fpr);
buffer=data;
BMPheader.id1=*buffer++;
BMPheader.id2=*buffer++;
printf("\nfile ID %c %c\n",BMPheader.id1,BMPheader.id2);
BMPheader.filesize=*(int*)buffer;
printf("filesize %d\n",BMPheader.filesize);
buffer+=4;
BMPheader.reserved=*(int*)buffer;
printf("reserved %d\n",BMPheader.reserved);
buffer+=4;
BMPheader.bitmapdataoffset=*(int*)buffer;
printf("bitmapdataoffset %d\n",BMPheader.bitmapdataoffset);
buffer+=4;
BMPheader.bitmapheadersize=*(int*)buffer;
printf("bitmapheadersize %d\n",BMPheader.bitmapheadersize);
buffer+=4;
BMPheader.width=*(int*)buffer;
printf("width %d\n",BMPheader.width);
buffer+=4;
BMPheader.height=*(int*)buffer;
printf("height %d\n",BMPheader.height);
buffer+=4;
BMPheader.planes=*(short*)buffer;
printf("planes %hd\n",BMPheader.planes);
buffer+=2;
BMPheader.bitperpixel=*(short*)buffer;
printf("bitperpixel %hd\n",BMPheader.bitperpixel);
buffer+=2;
pression=*(int*)buffer;
printf("compression %d\n",pression);
buffer+=4;
BMPheader.bitmapdatasize=*(int*)buffer;
printf("bitmapdatasize %d\n",BMPheader.bitmapdatasize);
buffer+=4;
BMPheader.hresolution=*(int*)buffer;
printf("hresolution %d\n",BMPheader.hresolution);
buffer+=4;
BMPheader.vresolution=*(int*)buffer;
printf("vresolution %d\n",BMPheader.vresolution);
buffer+=4;
BMPheader.colors=*(int*)buffer;
printf("colors %d\n",BMPheader.colors);
buffer+=4;
BMPheader.importantcolors=*(int*)buffer;
printf("importantcolors %d\n",BMPheader.importantcolors);
buffer+=4;
for(i=0;i<256;i++)
{
for(j=0;j<4;j++)
{
BMPheader.palette[i][j]=*buffer++;//获取调色板数据;
}
}
position=ftell(fpr);
printf("position of fpr %d\n",position);
for(i=0;i<256;i++)
{
for(j=0;j<256;j++)
{
BMPheader.bitmapdata[i][j]=*buffer++;//获取图片数据;
}
}
/*
N=3的中值滤波
*/
/*for(h=0;h<256;h++)
{
for(w=0;w<256;w++)
{
num[0]=BMPheader.bitmapdata[h][w-1];
num[1]=BMPheader.bitmapdata[h][w];
num[2]=BMPheader.bitmapdata[h][w+1];
for(i=0;i<3;i++)
{
for(j=i;j<3;j++)
{
if(num[i]>num[j])
{
t=num[j];
num[j]=num[i];
num[i]=t;
}
}
}
BMPheader.bitmapdata[h][w]=num[1];
}
}*/
/*
N=5的中值滤波
*/
for(h=0;h<256;h++)
{
for(w=0;w<256;w++)
{
num[0]=BMPheader.bitmapdata[h][w-2];
num[1]=BMPheader.bitmapdata[h][w-1];
num[2]=BMPheader.bitmapdata[h][w];
num[3]=BMPheader.bitmapdata[h][w+1];
num[4]=BMPheader.bitmapdata[h][w+2];
for(i=0;i<5;i++)
{
for(j=i;j<5;j++)
{
if(num[i]>num[j])
{
t=num[j];
num[j]=num[i];
num[i]=t;
}
}
}
BMPheader.bitmapdata[h][w]=num[2];
}
}
/*
将滤波后的数据写入文件
*/
fseek(fpw,0,0);
fwrite(data,1,1078,fpw);//写入头文件信息;
position=ftell(fpw);
printf("position of fpw %d\n",position);
fwrite(BMPheader.bitmapdata,1,length-1078,fpw);//写入图片数据;
position=ftell(fpw);
printf("position of fpw %d\n",position);
system("pause");
fclose(fpr);
fclose(fpw);
}