www.pudn.com > 1050310722.rar > image.cpp


#include  
#include  
#include  
#include  
 
 
int biDataOffset;  
int biWidth, biHeight; 
int biBitsCount; 
long biSize; 
long biColorUsed; 
int  biFileSize;  
 
 
#pragma pack(2) 
/*位图文件头*/ 
typedef struct 
{ 
 short fileType;             //位图标志 
 long  fileSize;            //位图文件总字节数 
 short reverse1; 
 short reverse2;             //保留字节,用来存储文件大小的数据 
 long  dataOffset;          //位图列阵的起始位置 
}BmpFileHeader; 
 
/*位图信息头格式定义*/ 
typedef struct 
{ 
 long size;                //位图信息头占用字节数 
 long width,height;        //位图图像宽度,高度(以像数为单位) 
 short planes;             //位图设计级别(恒为1) 
 short bitsCount;          //位图级别的设定,每个像数所需要的位数,必须是1(双色),4(16色) 
                           //8(256色),24(真彩色)之一 
 long comp;                //压缩类型 
 long sizeImage;           //为图阵列表字节数 
 long xpps,ypps;           //水平和垂直分辨率 
 long colorUsed;           //为图实际使用的颜色表中的颜色变址数 
 long important;           //为图显示过程中被认为重要颜色的颜色变址数 
}BmpInfoHeader; 
 
#pragma pack() 
/*位图阵列格式的定义*/ 
typedef struct 
{ 
 unsigned char blue;       //定义的蓝、绿、红 
 unsigned char green; 
 unsigned char red; 
 unsigned char reverse;    //构成一个三字节的reverse 
}RGBQuad; 
 
BmpFileHeader *fileHeader;               //位图文件文件头 
BmpInfoHeader *infoHeader;               //位图文件信息头 
 
 
void  readBMPimage(char *file );        //读位图文件 
int   saveBMPFilehead(char *file, RGBQuad* palette);//把处理后的文件保存到file中去 
int   FineTheColorNumber();            //查看图像的是1位,16位,24位.... 
void  ReadBMPfile(char *file);         //读取BMP文件的头 
void  Medaian(int flag);   //中值滤波 
unsigned char MedValues(unsigned char  *buf , int n, int m);//求中值函数 
 
unsigned char *sc;  //用以存放像数灰度级 
unsigned char * msc; 
using namespace std; 
 
 
int main() 
{ 
	FILE* fp ; 
	int Number = 3; 
	char objectfile[64]; 
	char flag = 'Y'; 
	cout << sizeof(BmpFileHeader)<> Number; 
		if(Number % 2 == 0) 
			continue; 
		cout << "输入要存放的文件名称"<> objectfile; 
		Medaian(Number); 
		saveBMPFilehead(objectfile, palette); 
		cout << "是否继续,是Y/y,否则其他。"<> flag; 
		if(flag != 'Y'&& flag != 'y') 
			break; 
	} 
	 
	 
	 
	fclose(fp); 
	free(palette); 
	free(sc); 
	return 0; 
} 
 
/* 
函数名: ReadBMPfile()  
参数   :文件名    
功能:读取一个BMP文件,并把读取到的关键字赋给全局变量 
*/ 
void ReadBMPfile(char *file) 
{ 
	FILE* fp; 
	fp  = fopen(file , "rb+");                //打开文件 
	if(fp == NULL) 
	{ 
	   cout << "文件不存在,或是格式不对!"<width, infoHeader->height);  
	//读取文件头信息,并存储为全局变量 
	 
	biDataOffset =  fileHeader->dataOffset;            //像素数据偏于头文件的位置 
	biBitsCount  =  infoHeader->bitsCount ;            //每像素的字节数 
	biWidth      =  infoHeader->width ;                //位图文件的宽 
	biHeight     =  infoHeader->height;                //位图文件的高 
	biSize       =  infoHeader->size;                  //位图信息头占用字节数 
	biColorUsed  =  infoHeader->colorUsed ;            //位图文件所使用的颜色数 
	biFileSize   =  fileHeader->fileSize; 
	 
	fclose(fp); 
} 
 
 
//*****************************************************************************************// 
//读取BMP文件的像素数据 
void readBMPimage(char *file) 
{ 
	FILE * fp; 
 
    int max = fileHeader->fileSize - fileHeader->dataOffset; 
	int BytesPerLine = (biWidth*biBitsCount+31)/32*4;  //每行的字节数 
	int Higthlen = max / BytesPerLine; 
	cout << "每行字节数:"<< BytesPerLine<< endl;  
	fp = fopen(file , "rb");                            //打开文件进行读操作 
	if(fp == NULL) 
	{ 
		cout << "文件不存在,或是格式不对!"<fileSize - fileHeader->dataOffset; 
	fp = fopen(file , "w+b"); 
	fp2 = fopen("lena.bmp" , "r+b"); 
	unsigned char* imageHeader; 
	imageHeader = (unsigned char*)malloc(fileHeader->dataOffset); 
	fread(imageHeader ,fileHeader->dataOffset, 1, fp2); 
	fwrite(imageHeader,fileHeader->dataOffset, 1,fp); 
	fseek(fp, fileHeader->dataOffset, SEEK_SET); 
    fwrite(sc, max,1 ,fp); 
     
	fclose(fp); 
	fclose(fp2); 
 
	return 0; 
	 
} 
 
//位图级别的设定,每个像数所需要的位数,必须是1(双色),4(16色) 
 
int FineTheColorNumber() 
{ 
	int numColors; 
	 
	if(biColorUsed != 0) 
		numColors = biColorUsed; 
	else  
	{ 
		switch ( biBitsCount) 
		{ 
		case 1: 
			numColors = 2; 
			break; 
		case 4: 
			numColors = 16; 
			break; 
		case 8: 
			numColors = 256; 
			break; 
		case 24: 
			numColors = 0; 
			break; 
		default: 
			break; 
		} 
		 
	} 
	return numColors; 
} 
/*=========================================================================================* 
   进行m X m 邻域中值滤波处理  
   中值平滑处理 
   排序取中值 
*/ 
unsigned char MedValues(unsigned char  *buf , int n, int m) 
{ 
	int i, j, k , f; 
	for(i = 1; i < n ; i++) 
	{ 
		for(j = n -1 , f = 0; j >= i; j--) 
		{ 
			if(buf[j] > buf[j+1]) 
			{ 
				k = buf[j]; 
				buf[j] = buf[j+1]; 
				buf[j+1] = k ;  
				f = 1; 
			} 
			 
		} 
		 
       	if(f == 0 ) break; 
	} 
	return (buf[m]); 
} 
//进行m X m 邻域中值滤波处理 ,  
//参数: 图像数值数组 sc, 图像的宽、高, 进行多少乘多少的处理  
//处理时忽略边界。 
//返回值,void 
void Medaian(int flag) 
{   
    unsigned char *buf; 
	buf = ( unsigned char *)malloc(flag*flag); 
	int index , orindex ;  
	index = flag / 2; 
	orindex = -index; 
	int i, j , k; 
	memcpy(sc, msc, biHeight*biWidth); 
	for(i = index; i < biHeight ; i++) 
		for(j = index; j < biWidth ; j++) 
		{    
			k = 0;  
			/*把sc[i , j]窗口中的值赋给数组buf*/ 
			for(int jj = orindex; jj <= index; jj++ ) 
				for(int ii = orindex; ii <= index; ii++ ) 
				{ 
					buf[k] = sc[(i+jj)*biWidth +(j+ii)]; 
					k++; 
				} 
				sc[i*biWidth + j] = MedValues(buf , flag*flag, flag*flag/2);//相应该点值用中值代替 
		} 
        
		 
}