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);
}
}
}