www.pudn.com > jpeg1.zip > MENU.C


/* JPEG System MENU & Main Functions */ 
/* Written in TURBO C V2.0 6-13-1995 */ 
/* 灰度图象压缩 */ 
int  Image_Stacker() 
  {  unsigned long imagesize; 
     unsigned int segp1,segp2,code_size; 
     register int i,stat,handle1,handle2; 
     char huge *p,message[40]="Failed:Max Memory available is ",size[9]; 
 
     if((stat=allocmem(64*64,&segp2))!=-1) { 
       ultoa((long)stat/64,size,10); 
       strcat(message,size); 
       strcat(message,"K"); 
       ErrorProc(message); 
       return -1; } 
     while(1) { 
       fseek(ovlp,-12*32,SEEK_END); 
       Hide(); mbar(0,DIMY-29,640,DIMY,252); 
       title16(2,575,7,2,255); Show(); 
       if(mscanf(filenamein)==-1)  { 
	 Hide(); mbar(0,DIMY-29,640,DIMY,252);  Show(); 
	 mputs(25,36,"Return to MainMenu...",252,255); break; } 
       if(findfirst(filenamein,&f_blk,FA_ARCH)!=-1) { 
	 fnsplit(filenamein,drive,dir,name,ext); 
	 do { 
	   Set_Mouse(IDC_WAIT); 
	   strcpy(name,f_blk.ff_name); 
	   fnmerge(filenamein,drive,dir,name,""); 
	   get_base_name(name,filenameout,".JPG"); 
	   if((handle1=open(filenamein,O_RDWR|O_BINARY,S_IREAD))!=-1) { 
	     if((handle2=open(filenameout, 
	      O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE))!=-1) { 
	       read(handle1,size,8); 
	       if(strcmp(size,"JPEG R")==NULL) { 
		 read(handle1,&Width,2); 
		 read(handle1,&Height,2); 
		 imagesize=(unsigned long)Width*Height; 
		 if((stat=allocmem((long)imagesize/16+1,&segp1))==-1) { 
		   p=(char huge *)MK_FP(segp1,0); 
		   stat=imagesize/SIZE; 
		   imagesize%=SIZE; 
		   for(i=0;i=3?0:level+1; 
	   Hide(); bclose(SUB_box[prev]); 
	   select(SUB_box[level]); 
	   Show(); 
	  } 
	 } 
       prev=level; 
       use=0; 
       for(cn=0;cn<4;cn++) 
	 if(Mouse_in_Box(&SUB_B_box[cn][0])) use++; 
       if(use==0) Set_Mouse(IDC_CURSOR); 
	else Set_Mouse(IDC_HAND); 
       if(Left_Pressed()) { 
	 do { 
	   for(cn=0;cn<4;cn++) { 
	     switch(SUB_BOX[cn]) { 
	       case OFF: if(Mouse_in_Box(&SUB_B_box[cn][0])) { 
			   Set_Mouse(IDC_HAND); 
			   Hide(); box_down(SUB_box[cn]); 
			   bclose(SUB_box[prev]); 
			   select(SUB_box[cn]); Show(); 
			   SUB_BOX[cn]=ON; level=cn; prev=cn; key=CRKEY; } 
			   break; 
	       case  ON:   if(!Mouse_in_Box(&SUB_B_box[cn][0])) { 
                           Set_Mouse(IDC_CURSOR); 
			   Hide(); box_up(SUB_box[cn]); Show(); 
			   SUB_BOX[cn]=OFF; 
			   key=level==cn?0:key; } 
	      } 
	     } 
	   } while(Left_Pressed()); 
	  Hide(); 
	  box_up(SUB_box[level]); 
	  Show();  SUB_BOX[level]=OFF; 
	 } 
	} 
       key=0; 
       Set_Mouse(IDC_CURSOR); 
       switch(level) { 
	 case 0: FormatChange(OFF); break; 
	 case 1: FormatChange(ON);  break; 
	 case 2: FormatHelp();      break; 
	 case 3: Hide(); show("cls",1,0); Show(); return 1; 
	} 
      } 
   } 
 
/* 图象观看 */ 
int  Image_Viewer(char *fname) 
  {  char pal[768],flags=OFF; 
     int i,j,handle,flag=2,result; 
 
     if(strcmp(fname,"")==NULL) { 
       fseek(ovlp,-12*32,2); 
       Hide(); mbar(0,DIMY-29,640,DIMY,252); 
       title16(2,575,7,2,255); Show(); 
       if(mscanf(filenamein)==-1) { 
	 Hide(); mbar(0,DIMY-29,640,DIMY,252); 
	 Show(); return -1; } 
      } 
      else { 
       strcpy(filenamein,fname); 
       flags=ON; } 
     if(strrchr(filenamein,'.')==NULL) strcat(filenamein,".IMG"); 
     if(findfirst(filenamein,&f_blk,FA_ARCH)!=-1) { 
       Hide(); show("",1,0); Show(); 
       fnsplit(filenamein,drive,dir,name,ext); 
       do { 
	 Set_Mouse(IDC_WAIT); 
	 strcpy(name,f_blk.ff_name); 
	 fnmerge(filenamein,drive,dir,name,""); 
	 Hide(); mbar(0,DIMY-29,640,DIMY,252); 
	 get_base_name(filenamein,filenameout,".PAL"); 
	 if((handle=open(filenameout,O_RDWR|O_BINARY,S_IREAD))!=-1) { 
	   read(handle,pal,768); 
	   flag=0; 
	   outportb(0x3c8,0); 
	   for(i=0;i<240;i++) 
	     for(j=0;j<3;j++) 
	       outportb(0x3c9,pal[i*3+j]); 
	  } 
	 if((strstr(filenamein,".128")==NULL)&& 
	  (strstr(filenamein,".256")==NULL)) result=show(filenamein,0,flag); 
	  else result=dshow(filenamein,flag); 
         mbar(0,DIMY-29,640,DIMY,252); Show(); 
	 if(flags==ON) return 2; 
	 if(result==-1) strcat(filenamein," UnKnown Format"); 
	 mputs(25,36,filenamein,252,255); 
	 mputs(55,36,"Press Any Key to View next...",252,255); 
	 Set_Mouse(IDC_CURSOR); 
	 bioskey(0); 
	 flag=2; 
	 Hide(); show("",1,0); Show(); 
	 if(handle!=-1) { 
	   close(handle); 
	   outportb(0x3c8,0); 
	   for(i=0;i<64;i++) 
	     for(j=0;j<3;j++) outportb(0x3c9,i); 
	  } 
	} while(findnext(&f_blk)!=-1); 
       Hide(); mbar(0,DIMY-29,700,DIMY,252); Show(); 
       mputs(25,36,"All the Image are done,Return to MainMenu...",252,255); 
      } 
     else { 
      bell(800); 
      Hide(); mbar(0,DIMY-29,640,DIMY,252); Show(); 
      mputs(25,36,filenamein,252,255); 
      mputs(50,36,"File Not Found",252,251); } 
    } 
 
/* R G B ==> 亮度+色度 色空间转换 */ 
int  ColorChange(char *name) 
  {  float temp; 
     unsigned long len; 
     int hR,hG,hB,hY,i,j,ww,hh,step; 
     unsigned int segment,Seg_R,Seg_G,Seg_B,Seg_Y,Seg_Cr,Seg_Cb; 
 
     strcpy(fr,name); strcpy(fg,name); 
     strcpy(fb,name); strcpy(fy,name); 
     strcat(fr,".R"); strcat(fg,".G"); 
     strcat(fb,".B"); strcat(fy,".SWP"); 
     len=(unsigned long)(64*4+32)*64; 
     if((i=allocmem(len,&segment))!=-1) { 
       ErrorProc("Not Enough Memory!"); 
       return(-2); } 
     Seg_R=segment;      Seg_G=segment+4096; 
     Seg_B=Seg_G+4096;   Seg_Y=Seg_B+4096; 
     Seg_Cr=Seg_Y+4096;  Seg_Cb=Seg_Cr+1024; 
     if((hR=open(fr,O_RDONLY|O_BINARY,S_IREAD))==-1) { 
       ErrorProc("Open File Error!"); 
       freemem(segment); return(-1); } 
     read(hR,fr,8); 
     if(strcmp(fr,"JPEG R")!=NULL) { 
       close(hR); return -3; } 
     read(hR,&Width,2); 
     read(hR,&Height,2); 
     if((hG=open(fg,O_RDONLY|O_BINARY,S_IREAD))==-1) { 
       ErrorProc("Open File Error!"); 
       close(hR); freemem(segment); 
       return(-1); } 
     if((hB=open(fb,O_RDONLY|O_BINARY,S_IREAD))==-1) { 
       ErrorProc("Open File Error!"); 
       close(hG); close(hR); 
       freemem(segment); return(-1); } 
     if((hY=open(fy,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE))==-1) { 
       ErrorProc("Open File Error!"); 
       close(hR); close(hB); close(hG); 
       freemem(segment); return(-1); } 
     lseek(hG,12,SEEK_SET); 
     lseek(hB,12,SEEK_SET); 
     ww=Width&0xfff0; hh=Height&0xfff0; 
     write(hY,&ww,2); write(hY,&hh,2); 
     step=65536L/Width; step&=0xfff0; 
     while(hh>0) { 
       pR=MK_FP(Seg_R,0); pG=MK_FP(Seg_G,0); 
       pB=MK_FP(Seg_B,0); pY=MK_FP(Seg_Y,0); 
       step=(step>hh)?hh:step; 
       hh-=step; 
       for(i=0;i0); 
       len=(unsigned long)step*ww; 
       pCr=MK_FP(Seg_Cr,0); pCb=MK_FP(Seg_Cb,0); 
       pY=MK_FP(Seg_Y,0); pR=MK_FP(Seg_R,0); 
       pB=MK_FP(Seg_B,0); 
       len/=4; i=0; 
       do { 
	 temp=(*pR-*pY)/1.6+128; 
	 *pCr++=(char)temp; 
	 temp=(*pB-*pY)/2+128; 
	 *pCb++=(char)temp; 
	 pR+=2; pB+=2; pY+=2; 
	 len--; i++; 
	 if((i%(ww/2))==0) { 
	   pR+=ww; pB+=ww; pY+=ww; } 
	} while(len>0); 
       pY=MK_FP(Seg_Y,0); pCr=MK_FP(Seg_Cr,0); 
       pCb=MK_FP(Seg_Cb,0); 
       for(i=0;i0) { 
       step=(hcount R G B 色空间转换 */ 
int  ColorIChange(char *name) 
  {  float temp; 
     unsigned long len,count; 
     int hR,hG,hB,hY,i,j,step,he; 
     unsigned int segment,Seg_R,Seg_G,Seg_B,Seg_Y,Seg_Cr,Seg_Cb; 
 
     strcpy(fy,name); strcpy(fr,name); 
     strcpy(fg,name); strcpy(fb,name); 
     strcat(fr,".R$$"); strcat(fg,".G$$"); 
     strcat(fb,".B$$"); strcat(fy,".SWP"); 
     len=(unsigned long)(64*4+32)*64; 
     if((i=allocmem(len,&segment))!=-1) { 
       ErrorProc("Not Enough Memory!"); 
       return(-1); } 
     Seg_R=segment;     Seg_G=segment+4096; 
     Seg_B=Seg_G+4096;  Seg_Y=Seg_B+4096; 
     Seg_Cr=Seg_Y+4096; Seg_Cb=Seg_Cr+1024; 
     if((hY=open(fy,O_RDONLY|O_BINARY,S_IREAD))==-1) { 
       ErrorProc("Open File Error!"); 
       freemem(segment); 
       return(-1); } 
     if((hR=open(fr,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE))==-1) { 
       ErrorProc("Open File Error!"); 
       close(hY); freemem(segment); 
       return(-1); } 
     if((hG=open(fg,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE))==-1) { 
       ErrorProc("Open File Error!"); 
       close(hY); close(hR); 
       freemem(segment); return(-1); } 
     if((hB=open(fb,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE))==-1) { 
       ErrorProc("Open File Error!"); 
       close(hR); close(hG); close(hY); 
       freemem(segment); return(-1); } 
     read(hY,&Width,2); 
     read(hY,&Height,2); 
     step=65536L/Width; 
     step&=0xfff0; he=Height; 
     while(he>0) { 
       step=(he255) *pR=255; 
	 temp=(*pCb-128)*2+*pY; 
	 *pB=(unsigned char)(temp<0)?0:temp; 
	 if(temp>255) *pB=255; 
	 temp=((unsigned char)*pY-*pR*0.3-temp*0.1)/0.6; 
	 *pG++=(unsigned char)(temp<0)?0:temp; 
	 if(temp>255) *(pG-1)=255; 
	 pR++; pB++; pY++; count--; 
	 if((count%2)==0) { 
	   pCr++; pCb++; } 
	 if((count%Width)==0) { 
	   if((++i)%2) { 
	     pCr-=(Width/2); pCb-=(Width/2); } 
	  } 
	} while(count>0); 
       pR=MK_FP(Seg_R,0); pB=MK_FP(Seg_B,0); 
       pG=MK_FP(Seg_G,0); 
       for(i=0;i=6?0:level+1; 
	   Hide(); bclose(box_box[prev]); 
	   select(box_box[level]); 
	   mbar(0,DIMY-29,640,DIMY,252); 
	   Show(); 
	  } 
	 } 
       prev=level; 
       use=0; 
       for(cn=0;cn<7;cn++) 
	 if(Mouse_in_Box(&box_box[cn][0])) use++; 
       if(use==0) Set_Mouse(IDC_CURSOR); 
	else Set_Mouse(IDC_HAND); 
       if(Left_Pressed()) { 
	 do { 
	   for(cn=0;cn<7;cn++) { 
	     switch(BOX[cn]) { 
	       case OFF: if(Mouse_in_Box(&box_box[cn][0])) { 
			   Set_Mouse(IDC_HAND); 
			   Hide(); box_down(box_box[cn]); 
			   bclose(box_box[prev]); 
			   select(box_box[cn]); Show(); 
			   BOX[cn]=ON; level=cn; 
			   prev=cn; key=CRKEY; } 
			 break; 
	       case  ON:   if(!Mouse_in_Box(&box_box[cn][0])) { 
			   Set_Mouse(IDC_CURSOR); 
			   Hide(); box_up(box_box[cn]); Show(); 
			   BOX[cn]=OFF; 
			   key=level==cn?0:key; } 
	      } 
	     } 
	   } while(Left_Pressed()); 
	  Hide(); 
	  box_up(box_box[level]); 
	  mbar(0,DIMY-29,640,DIMY,252); 
	  Show(); BOX[level]=OFF; 
	 } 
	} 
       key=0; 
       Set_Mouse(IDC_CURSOR); 
       switch(level) { 
	 case 0: Image_Stacker();     break; 
	 case 1: Image_UnStacker();   break; 
	 case 2: ColorStacker();      break; 
	 case 3: ColorUnStacker();    break; 
	 case 4: Image_Viewer("");    break; 
	 case 5: Image_Manger();      break; 
	 case 6: Mouse_OFF(); 
		 fclose(ovlp); 
		 freemem(BitMap); 
		 return(1); 
	} 
      } 
   }