/************************************************************/ /* */ /* Program Name: */ /* */ /* Author : Takashi Nakajima */ /* */ /* Function : BINARY FILE OPEN */ /* */ /* History : 2010.07.31 11:48 New Create Ver0.001 */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /************************************************************/ //#ifndef _STDLIB_H_ //#define _STDLIB_H_ #include #include #include #include typedef struct control_data { unsigned int sizex; unsigned int sizey; char InputFileName[128]; char OutputFileName[128]; } CNTL; int hsize; int vsize; char inputfile[128]; char outputfile[128]; //#include "mediancut8.c" /***********************************************/ /* */ /* YUV空間でカットY方向を4倍にのばした空間 */ /* */ /* */ /* 分散最大の軸で大津法でカット */ /* */ /* 平均からの距離が最大のものがあるもの */ /* を分轄 */ /* */ /* */ /* */ /* */ /* */ /* 画素から最短距離にあるインデックス */ /* カラーを採用 */ /* */ /* インデックスカラーはボックスの重心 */ /* */ /* 画素数が0のボックスをカウントに */ /* 入れない */ /* */ /* IROSUU に減色する色の数を設定 */ /* */ /* */ /* */ /* */ /***********************************************/ //#ifndef _STDLIB_H_ //#define _STDLIB_H_ //#include //#include //#include //#include //#endif #define RD 0 #define GD 0 #define BD 0 #define IROSUU 256 #define YGAMMA 1.1 #define YMULT 4.0*255.0/pow(255.0,YGAMMA) #define RMULT 4.0 #define BMULT 3.0 #define EDGETH 25 struct palet//パレット構造体 { int U_R; int U_G; int U_B; int IG_R; int IG_G; int IG_B; int INDEXNUM; int INDEXNO; double MAXDISTANCE; double IGENMAX; }; struct palet PT[2][IROSUU]; struct palet *PTP; int Jacobi(int n, int ct, double eps, double **A, double **A1, double **A2, double **X1, double **X2) { double max, s, t, v, sn, cs; int i1, i2, k = 0, ind = 1, p = 0, q = 0; // 初期設定 for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < n; i2++) { A1[i1][i2] = A[i1][i2]; X1[i1][i2] = 0.0; } X1[i1][i1] = 1.0; } // 計算 while (ind > 0 && k < ct) { // 最大要素の探索 max = 0.0; for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < n; i2++) { if (i2 != i1) { if (fabs(A1[i1][i2]) > max) { max = fabs(A1[i1][i2]); p = i1; q = i2; } } } } // 収束判定 // 収束した if (max < eps) ind = 0; // 収束しない else { // 準備 s = -A1[p][q]; t = 0.5 * (A1[p][p] - A1[q][q]); v = fabs(t) / sqrt(s * s + t * t); sn = sqrt(0.5 * (1.0 - v)); if (s*t < 0.0) sn = -sn; cs = sqrt(1.0 - sn * sn); // Akの計算 for (i1 = 0; i1 < n; i1++) { if (i1 == p) { for (i2 = 0; i2 < n; i2++) { if (i2 == p) A2[p][p] = A1[p][p] * cs * cs + A1[q][q] * sn * sn - 2.0 * A1[p][q] * sn * cs; else if (i2 == q) A2[p][q] = 0.0; else A2[p][i2] = A1[p][i2] * cs - A1[q][i2] * sn; } } else if (i1 == q) { for (i2 = 0; i2 < n; i2++) { if (i2 == q) A2[q][q] = A1[p][p] * sn * sn + A1[q][q] * cs * cs + 2.0 * A1[p][q] * sn * cs; else if (i2 == p) A2[q][p] = 0.0; else A2[q][i2] = A1[q][i2] * cs + A1[p][i2] * sn; } } else { for (i2 = 0; i2 < n; i2++) { if (i2 == p) A2[i1][p] = A1[i1][p] * cs - A1[i1][q] * sn; else if (i2 == q) A2[i1][q] = A1[i1][q] * cs + A1[i1][p] * sn; else A2[i1][i2] = A1[i1][i2]; } } } // Xkの計算 for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < n; i2++) { if (i2 == p) X2[i1][p] = X1[i1][p] * cs - X1[i1][q] * sn; else if (i2 == q) X2[i1][q] = X1[i1][q] * cs + X1[i1][p] * sn; else X2[i1][i2] = X1[i1][i2]; } } // 次のステップへ k++; for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < n; i2++) { A1[i1][i2] = A2[i1][i2]; X1[i1][i2] = X2[i1][i2]; } } } } return ind; } int ohtsu (int NUM,int *X){ int i,j,k,l,m,n,o,p; //int SUM1; //int X[NUM] = {-10,-10,-10,-10,-10, // -10,-10,-10,-10,-10, // -3,-3,-3,-3,-3, // -1,-1,0,1,1, // 3,3,3,3,3, // 10,10,10,10,10, // 10,10,10,10,10}; int MAX = -10000; int MIN = 99999; for(i=0;i *(X+i)){ MIN = *(X+i); } if(MAX < *(X+i)){ MAX = *(X+i); } } int NODEHANI; NODEHANI = MAX - MIN + 1; int *HIST; HIST = (int *)malloc(sizeof(int)*NODEHANI); //ND //0- -11 //1- -10 //11- 0 //22- 11 for(i=0;i(hsize-1)){k=2*(hsize-1)-k;} if(l<0){l=-l;} if(l>(hsize-1)){l=2*(hsize-1)-l;} if((abs(IRIN[k*vsize+i]-IRIN[l*vsize+i]))>=EDGETH){ EDGER[j*vsize+i]=1; } else { EDGER[j*vsize+i]=0; } if((abs(IGIN[k*vsize+i]-IGIN[l*vsize+i]))>=EDGETH){ EDGEG[j*vsize+i]=1; } else { EDGEG[j*vsize+i]=0; } if((abs(IBIN[k*vsize+i]-IBIN[l*vsize+i]))>=EDGETH){ EDGEB[j*vsize+i]=1; } else { EDGEB[j*vsize+i]=0; } } } for(i=0;i(vsize-1)){ l=2*(vsize-1)-l; } if(abs(IRIN[i*vsize+l]-IRIN[i*vsize+k])>=EDGETH){ VEDGER[i*vsize+j] = 1; } else { VEDGER[i*vsize+j] = 0; } if(labs(IGIN[i*vsize+l]-IGIN[i*vsize+k])>=EDGETH){ VEDGEG[i*vsize+j] = 1; } else { VEDGEG[i*vsize+j] = 0; } if(labs(IBIN[i*vsize+l]-IBIN[i*vsize+k])>=EDGETH){ VEDGEB[i*vsize+j] = 1; } else { VEDGEB[i*vsize+j] = 0; } } } int *index3; index3 = (int*)malloc(sizeof(int)*hsize*vsize); for(i=0,k=0;i>RDIV); //U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); //U_R,U_G,U_Bは平均 ct = 1000; eps = 1.0e-10; n = 3; A = new double * [n]; A1 = new double * [n]; A2 = new double * [n]; X1 = new double * [n]; X2 = new double * [n]; for (i1 = 0; i1 < n; i1++) { A[i1] = new double [n]; A1[i1] = new double [n]; A2[i1] = new double [n]; X1[i1] = new double [n]; X2[i1] = new double [n]; } //A[0][0],A[0][1],A[0][2],A[1][0],A[1][1],A[1][2],A[2][0],A[2][1],A[2][2]に分散共分散を入れる TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start // for(i=0;i<3;i++){ // for(j=0;j<3;j++){ // fprintf(stderr,"%f ",A1[i][j]); // } // fprintf(stderr,"\n"); // } //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } //debug start // fprintf(stderr,"Y=%d\n",Y); // fprintf(stderr,"IGENVEC=%f %f %f\n",X1[0][Y],X1[1][Y],X1[2][Y]); // while(1); //debug end //Yは最大固有値の番号 //(X1[0][Y],X1[1][Y],X1[2][Y]) 最大分散の固有ベクトル //ohtsu tuika start double *RR; double *GG; double *BB; double *RRR; double *GGG; double *BBB; double V[3]; double *XXX; double *YYY; double *ZZZ; int THRESH; double DTHRESH; RR = (double *)malloc(sizeof(double)*hsize*vsize); GG = (double *)malloc(sizeof(double)*hsize*vsize); BB = (double *)malloc(sizeof(double)*hsize*vsize); XXX = (double *)malloc(sizeof(double)); YYY = (double *)malloc(sizeof(double)); ZZZ = (double *)malloc(sizeof(double)); RRR = (double *)malloc(sizeof(double)*hsize*vsize); GGG = (double *)malloc(sizeof(double)*hsize*vsize); BBB = (double *)malloc(sizeof(double)*hsize*vsize); for(i=0;i=0.0){ if((double)(*(RRR+i))>=DTHRESH){ *(INDEX+i) = PT[MEN][0].INDEXNO; k++; } else { *(INDEX+i) = PT[MEN][1].INDEXNO; l++; } } } PT[MEN][0].INDEXNUM = k; PT[MEN][1].INDEXNUM = l; //maxdistance tuika start U_R=0.0; U_G=0.0; U_B=0.0; //0側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); MAXD = 0.0; for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); MAXD = 0.0; for(i=0;i= PT[MEN][1].INDEXNUM){ if(PT[MEN][0].MAXDISTANCE*PT[MEN][0].INDEXNUM >= PT[MEN][1].MAXDISTANCE*PT[MEN][1].INDEXNUM){//maxdistance div tuika j=0;//INDEXNO } else { j=1; } U_R=0.0; U_G=0.0; U_B=0.0; for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); //debug start // fprintf(stderr,"2kaimeheikin %d %d %d\n",U_R,U_G,U_B); //debug end TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start // for(i=0;i<3;i++){ // for(m=0;m<3;m++){ // fprintf(stderr,"%f ",A1[i][m]); // } // fprintf(stderr,"\n"); // } //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } DIVIDENUM = 3; //ohtsu tuika start for(i=0;i=0.0){ if(*(RRR33+i)>=DTHRESH){ *(INDEX+i) = DIVIDENUM-1; k++; } else { ; l++; } } } PT[MEN][0].INDEXNO = j; PT[MEN][1].INDEXNO = DIVIDENUM - 1; PT[MEN][0].INDEXNUM = l; PT[MEN][1].INDEXNUM = k; //max distance div tuika //maxdistance tuika start U_R=0.0; U_G=0.0; U_B=0.0; //0側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); MAXD = 0.0; // int TEMP; for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); MAXD = 0.0; for(i=0;i= 1) && (j <=(DIVIDENUM-3))){ for(i=2;i<=j+1;i++){ //// i i-2 PT[MEN][i].INDEXNO =PT[NMEN][i-2].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-2].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-2].MAXDISTANCE;//max distance div tuika } for(i=j+2;i<=DIVIDENUM-1;i++){ //// i i-1 PT[MEN][i].INDEXNO =PT[NMEN][i-1].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-1].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-1].MAXDISTANCE;//max distance div tuika } } if(j == (DIVIDENUM-2)){ for(i=2;i<=j+1;i++){ //// i i-2 PT[MEN][i].INDEXNO =PT[NMEN][i-2].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-2].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-2].MAXDISTANCE;//max distance div tuika } } //debug start // for(i=0;i<3;i++){ // fprintf(stderr,"%d %d %d\n",i,PT[MEN][i].INDEXNO,PT[MEN][i].INDEXNUM); // } //debug end double MAXBUNSAN = 100.0; //9/9 kokokara while(DIVIDENUM < 256){ //最大画素数のブロックをさがし、そのINDEXNOを調べる。 MAXINDEXNUM = -1; for(i=0;i MAXINDEXNUM){ // MAXINDEXNUM = PT[MEN][i].INDEXNUM; if(PT[MEN][i].MAXDISTANCE*PT[MEN][i].INDEXNUM > MAXINDEXNUM){ MAXINDEXNUM = (int)PT[MEN][i].MAXDISTANCE*PT[MEN][i].INDEXNUM;//max distance tuika NUM = i; } } FLAG = 0; label: //debug start if(DIVIDENUM == 41){ fprintf(stderr,"NUM= %d\n",NUM); fprintf(stderr,"PT[MEN][%d].INDEXNO=%d\n",NUM,PT[MEN][NUM].INDEXNO); } //debug end //次に分轄するブロックNO----- NUM //次に分轄するINDEXNO-------- PT[MEN][NUM].INDEXNO U_R=0.0; U_G=0.0; U_B=0.0; for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); //debug start // if(DIVIDENUM == 41){ // fprintf(stderr,"AVE= %d %d %d\n",U_R,U_G,U_B); // fprintf(stderr,"NUM= %d\n",NUM); // } //debug end TMP_RR=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(RIN+i))>>RDIV)-U_R); TMP_GG=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(GIN+i))>>GDIV)-U_G); TMP_BB=0.0;//(((*(BIN+i))>>BDIV)-U_B)*(((*(BIN+i))>>BDIV)-U_B); TMP_RG=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(GIN+i))>>GDIV)-U_G); TMP_RB=0.0;//(((*(RIN+i))>>RDIV)-U_R)*(((*(BIN+i))>>BDIV)-U_B); TMP_GB=0.0;//(((*(GIN+i))>>GDIV)-U_G)*(((*(BIN+i))>>BDIV)-U_B); for(i=0;i 0){ fprintf(stderr,"Jacobi syuusoku simasen!!\n"); exit(0); } // if((A1[0][0] == A1[1][1]) || (A1[1][1] == A1[2][2]) || (A1[0][0] == A1[2][2]) ){ // fprintf(stderr,"Igen Value duplication!!\n"); // exit(0); // } //debug start //if(DIVIDENUM == 4){ // for(i=0;i<3;i++){ // for(m=0;m<3;m++){ // fprintf(stderr,"%f ",A1[i][m]); // } // fprintf(stderr,"\n"); // } //} //debug end IGENMAX = -999999999999999999.9; for(i=0;i<3;i++){ if(A1[i][i] > IGENMAX ){ IGENMAX = A1[i][i]; Y = i; } } DIVIDENUM++; //ohtsu tuika start for(i=0;i=0.0){ if(*(RRR33+i)>=DTHRESH){ *(INDEX+i) = DIVIDENUM-1; k++; } else { ; l++; } } } if(MEN == 1){ MEN = 0; NMEN = 1; } else { MEN = 1; NMEN = 0; } PT[MEN][0].INDEXNO = PT[NMEN][NUM].INDEXNO; PT[MEN][1].INDEXNO = DIVIDENUM - 1; PT[MEN][0].INDEXNUM = l; PT[MEN][1].INDEXNUM = k; //debug start if(DIVIDENUM == 5 || DIVIDENUM == 6){ fprintf(stderr,"INDEXNO%d %d\n",PT[MEN][0].INDEXNO,l); fprintf(stderr,"INDEXNO%d %d\n",PT[MEN][1].INDEXNO,k); } //while(1); //debug end //max distance divide tuika //maxdistance tuika start U_R=0.0; U_G=0.0; U_B=0.0; //0側のmaxdistanceを求める for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); MAXD = 0.0; // int TEMP; for(i=0;i>RDIV); // U_G = (U_G>>GDIV); // U_B = (U_B>>BDIV); MAXD = 0.0; for(i=0;i= 1) && (NUM <=(DIVIDENUM-3))){ for(i=2;i<=NUM+1;i++){ // i i-2 PT[MEN][i].INDEXNO =PT[NMEN][i-2].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-2].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-2].MAXDISTANCE; } for(i=NUM+2;i<=DIVIDENUM-1;i++){ // i i-1 PT[MEN][i].INDEXNO =PT[NMEN][i-1].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-1].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-1].MAXDISTANCE; } } if(NUM == (DIVIDENUM-2)){ for(i=2;i<=NUM+1;i++){ // i i-2 PT[MEN][i].INDEXNO =PT[NMEN][i-2].INDEXNO; PT[MEN][i].INDEXNUM =PT[NMEN][i-2].INDEXNUM; PT[MEN][i].MAXDISTANCE = PT[NMEN][i-2].MAXDISTANCE; } } //debug start if(DIVIDENUM == 256 ){ for(i=0;i 255){ REDUCE_R[i] = 255; } else if(IREDUCE_R[i] < 0){ REDUCE_R[i] = 0; } else { REDUCE_R[i] = (unsigned char)(IREDUCE_R[i]); } if(IREDUCE_G[i] > 255){ REDUCE_G[i] = 255; } else if(IREDUCE_G[i] < 0){ REDUCE_G[i] = 0; } else { REDUCE_G[i] = (unsigned char)(IREDUCE_G[i]); } if(IREDUCE_B[i] > 255){ REDUCE_B[i] = 255; } else if(IREDUCE_B[i] < 0){ REDUCE_B[i] = 0; } else { REDUCE_B[i] = (unsigned char)(IREDUCE_B[i]); } } //debug start // for(i=0;iInputFileName,argv[++i]); } else if(!strcmp(&argv[i][1],"o")){ strcpy(ptr->OutputFileName,argv[++i]); } else if(!strcmp(&argv[i][1],"x")){ ptr->sizex = atoi(argv[++i]); } else if(!strcmp(&argv[i][1],"y")){ ptr->sizey = atoi(argv[++i]); } else { ; } } } int main (int argc, char* argv[]) { CNTL *cnt; char inputfile[128]; char outputfile[128]; FILE *fpr; FILE *fpw; int hsize; int vsize; int filesizebyte; unsigned char *vin; unsigned char *B; unsigned char *G; unsigned char *R; int i,j,k,l,m,n,o,p; unsigned char *BIN; unsigned char *GIN; unsigned char *RIN; // unsigned char *BOUT; // unsigned char *GOUT; // unsigned char *ROUT; unsigned char *PALETGAZOU; unsigned char REDUCE_R[256]; unsigned char REDUCE_G[256]; unsigned char REDUCE_B[256]; int filesize; unsigned char temp; if(argc < 2){; exit(0); } /*******************************************/ /* */ /* MAIN KANSUU NO HIKISUU NO SYORI */ /* */ /*******************************************/ cnt = (CNTL *)malloc(sizeof(CNTL)*sizeof(unsigned char)); option_set(argc, argv, cnt); strcpy(inputfile,cnt->InputFileName); strcpy(outputfile,cnt->OutputFileName); /*******************************************/ /* */ /* BITMAP FILE OPEN */ /* */ /*******************************************/ if((fpr = fopen(inputfile,"rb"))==NULL){ exit(0); } fseek(fpr,18,SEEK_SET); fread(&hsize,sizeof(int),1,fpr);//hsize syutoku fread(&vsize,sizeof(int),1,fpr);//vsize syutoku fseek(fpr,2,SEEK_SET); fread(&filesizebyte,sizeof(int),1,fpr); /*******************************************/ /* */ /* PICTURE GET */ /* */ /*******************************************/ vin = (unsigned char *)malloc(sizeof(unsigned char)*(filesizebyte-54)); B = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); G = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); R = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize); fseek(fpr,54,SEEK_SET); if(fread(vin,sizeof(unsigned char),filesizebyte - 54,fpr) != filesizebyte - 54){ fprintf(stderr,"InputFileSizeError!!!\n"); exit(0); } fclose(fpr); /*******************************************/ /* */ /* SET B,G,R ARRAYS WITH RGB PIXEL DATAS */ /* */ /*******************************************/ for(i=0,k=0;isizex, cnt->sizey, RIN, ROUT); // resize(hsize, vsize, cnt->sizex, cnt->sizey, GIN, GOUT); // resize(hsize, vsize, cnt->sizex, cnt->sizey, BIN, BOUT); MedianCut(hsize, vsize, RIN, GIN, BIN, PALETGAZOU,REDUCE_R,REDUCE_G,REDUCE_B);//ROUT, GOUT, BOUT); //debug start // for(;;); //debug end sprintf(cnt->OutputFileName,"%s.bmp",outputfile); fpw = fopen(cnt->OutputFileName,"wb"); //hsize = cnt->sizex; //vsize = cnt->sizey; /*******************************************/ /* */ /* BITMAP HEADER 54BYTES WRITE */ /* */ /*******************************************/ if((hsize%4) == 0){ filesize = 0x36 + 0x400 + hsize * vsize; } else { filesize = 0x36 + 0x400 + hsize + vsize + (4-hsize%4)*vsize; } temp = 0x42;//B fwrite(&temp,sizeof(unsigned char),1,fpw); temp = 0x4D;//M fwrite(&temp,sizeof(unsigned char),1,fpw); fwrite(&filesize,sizeof(int),1,fpw); filesize = 0; fwrite(&filesize,sizeof(int),1,fpw); // fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x00000436; fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x28; fwrite(&filesize,sizeof(int),1,fpw); fwrite(&hsize,sizeof(int),1,fpw); fwrite(&vsize,sizeof(int),1,fpw); filesize = 0x00080001; fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x0; fwrite(&filesize,sizeof(int),1,fpw); if((hsize%4) == 0 ){ filesize = hsize*vsize; } else { filesize = hsize*vsize+(4-hsize%4)*vsize; } fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x0; fwrite(&filesize,sizeof(int),1,fpw); fwrite(&filesize,sizeof(int),1,fpw); filesize = 0x100; fwrite(&filesize,sizeof(int),1,fpw); fwrite(&filesize,sizeof(int),1,fpw); temp = 0; for(i=0;i<256;i++){ fwrite(REDUCE_B+i,sizeof(unsigned char),1,fpw); fwrite(REDUCE_G+i,sizeof(unsigned char),1,fpw); fwrite(REDUCE_R+i,sizeof(unsigned char),1,fpw); fwrite(&temp,sizeof(unsigned char),1,fpw); } for(i=0;i