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);//相应该点值用中值代替 } }