if(shangciyou-1 == (i/width)){ shangciyou--; }else{ you[youcnt++] = (unsigned int)(i/width); shangciyou = (unsigned int)(i/width); //zuozhizhen++; } } } } } zuocnt = 0; youcnt = 0; putchar(0x0a); for(i=0;i<100;i++){ printf(\ \ } putchar(0x0a); for(i=0;i<100;i++){ printf(\ \ } //showBmpInforHead(&bitInfoHead); fclose(pfile); fclose(put); if (bitInfoHead.biBitCount<24) { free(pRgb); } free(dataOfBmp); free(pColorData); printf(\}
unsigned char findone(){ unsigned int i,j; for(i=0;i<19;i++){ for(j=0;j<100;j++){ if(zuoshuzu[i][j]!=0){ break; } } if(j == 100){ //break; return i; } } if(i == 19){ return 0xFF; } }
unsigned char findlast(){ unsigned int i,j; for(i=0;i<19;i++){ for(j=0;j<100;j++){ if(youshuzu[i][j]!=0){ break; } }
24
if(j == 100){ //break; return i; } } if(i == 19){ return 0xFF; } }
unsigned char cmp(unsigned char a,unsigned char b){ unsigned int i,j; unsigned int cmpcnt=0,pipeicnt=0; for(i=0;i<100;i++){ if(youshuzu[a][i]==0){ printf(\ return (unsigned char)(((double)pipeicnt/(double)cmpcnt) * 100); }else{ cmpcnt++; } for(j=0;j<100;j++){ if(fabs(youshuzu[a][i] - zuoshuzu[b][j]) <=1){ pipeicnt++; break; } } } printf(\ return (unsigned char)(((double)pipeicnt/(double)cmpcnt) * 100); }
void main(){ unsigned int i,j; unsigned char temp=0,temp1=0,zuiyou=0; strcpy(strFile,\ initfile(zuoshuzu[0],youshuzu[0]); strcpy(strFile,\ initfile(zuoshuzu[1],youshuzu[1]); strcpy(strFile,\ initfile(zuoshuzu[2],youshuzu[2]); strcpy(strFile,\ initfile(zuoshuzu[3],youshuzu[3]); strcpy(strFile,\ initfile(zuoshuzu[4],youshuzu[4]); strcpy(strFile,\ initfile(zuoshuzu[5],youshuzu[5]); strcpy(strFile,\ initfile(zuoshuzu[6],youshuzu[6]); strcpy(strFile,\ initfile(zuoshuzu[7],youshuzu[7]); strcpy(strFile,\ initfile(zuoshuzu[8],youshuzu[8]); strcpy(strFile,\ initfile(zuoshuzu[9],youshuzu[9]); strcpy(strFile,\ initfile(zuoshuzu[10],youshuzu[10]); strcpy(strFile,\ initfile(zuoshuzu[11],youshuzu[11]); strcpy(strFile,\
25
initfile(zuoshuzu[12],youshuzu[12]); strcpy(strFile,\ initfile(zuoshuzu[13],youshuzu[13]); strcpy(strFile,\ initfile(zuoshuzu[14],youshuzu[14]); strcpy(strFile,\ initfile(zuoshuzu[15],youshuzu[15]); strcpy(strFile,\ initfile(zuoshuzu[16],youshuzu[16]); strcpy(strFile,\ initfile(zuoshuzu[17],youshuzu[17]); strcpy(strFile,\ initfile(zuoshuzu[18],youshuzu[18]); printf(\第一张图片:%d \ printf(\最后第一张图片:%d\ putchar(0x0a); for(i=0;i<19;i++){ temp = temp1 = zuiyou = 0; for(j=0;j<19;j++){ temp = cmp(i,j); if(temp > temp1){ temp1 = temp; zuiyou = j; } } printf(\最优:%%%d,%d\ putchar(0x0a); } }
附录2: //ReadBitMap //
#include
#define WIDTHBYTES(bits) (((bits)+31)/32*4) typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; typedef long LONG;
unsigned int zuoshuzu[19][100]; unsigned int youshuzu[19][100]; unsigned int shangcizuo; unsigned int shangciyou; unsigned int * zuozhizhen; unsigned int * youzhizhen; unsigned int zuocnt; unsigned int youcnt; FILE * put; FILE * outzuo; FILE * outyou;
//位图文件头信息结构定义
//其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息) typedef struct tagBITMAPFILEHEADER {
26
DWORD bfSize; //文件大小
WORD bfReserved1; //保留字,不考虑 WORD bfReserved2; //保留字,同上
DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 } BITMAPFILEHEADER;
//信息头BITMAPINFOHEADER,也是一个结构,其定义如下: typedef struct tagBITMAPINFOHEADER{ //public:
DWORD biSize; //指定此结构体的长度,为40 LONG biWidth; //位图宽 LONG biHeight; //位图高
WORD biPlanes; //平面数,为1
WORD biBitCount; //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32 DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩 DWORD biSizeImage; //实际位图数据占用的字节数 LONG biXPelsPerMeter; //X方向分辨率 LONG biYPelsPerMeter; //Y方向分辨率
DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数) DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的 } BITMAPINFOHEADER;
//调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。
//(似乎是调色板结构体个数等于使用的颜色数。) typedef struct tagRGBQUAD { //public: BYTE rgbBlue; //该颜色的蓝色分量 BYTE rgbGreen; //该颜色的绿色分量 BYTE rgbRed; //该颜色的红色分量 BYTE rgbReserved; //保留值 } RGBQUAD;
BITMAPFILEHEADER bitHead; BITMAPINFOHEADER bitInfoHead; FILE* pfile; char strFile[50];
void initfile(unsigned int * zuo,unsigned int * you){ printf(\ //scanf(\ pfile = fopen(strFile,\打开文件 put = fopen(\ outzuo = fopen(\ outyou = fopen(\ if(pfile!=NULL){ printf(\//读取位图文件头信息 WORD fileType; fread(&fileType,1,sizeof(WORD),pfile); if(fileType != 0x4d42){ printf(\ getchar(); return; } fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile); fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile);
27
} else{ printf(\ getchar(); return; } tagRGBQUAD *pRgb ; if(bitInfoHead.biBitCount < 24){ long nPlantNum = long(pow(2,double(bitInfoHead.biBitCount))); // Mix color Plant Number; pRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD)); memset(pRgb,0,nPlantNum*sizeof(tagRGBQUAD)); int num = fread(pRgb,4,nPlantNum,pfile); } int width = bitInfoHead.biWidth; int height = bitInfoHead.biHeight;//分配内存空间把源图存入内存 int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为32的倍数 BYTE *pColorData=(BYTE *)malloc(height*l_width); memset(pColorData,0,height*l_width); long nData = height*l_width;//把位图数据信息读到数组里 fread(pColorData,1,nData,pfile);//将位图数据转化为RGB数据 tagRGBQUAD* dataOfBmp; dataOfBmp = (tagRGBQUAD *)malloc(width*height*sizeof(tagRGBQUAD));//用于保存各像素对应的RGB数据 memset(dataOfBmp,0,width*height*sizeof(tagRGBQUAD)); if(bitInfoHead.biBitCount<24){ int k; int index = 0; if (bitInfoHead.biBitCount == 1){ for(int i=0;i
28