Wilson WindowWare Tech Support

WinBatch WinBatch+Compiler WebBatch
Home | Tech Database | Tech BBS | White Papers | Purchase


Image Sizer

Keywords: 	  image sizer jpg gif GIF JPG

M_SOF0 =     192; #define M_SOF0  0xC0		/* Start Of Frame N */
M_SOF1 =     193; #define M_SOF1  0xC1		/* N indicates which compression process */
M_SOF2 =     194; #define M_SOF2  0xC2		/* Only SOF0-SOF2 are now in common use */
M_SOF3 =     195; #define M_SOF3  0xC3
M_SOF5 =     197; #define M_SOF5  0xC5		/* NB: codes C4 and CC are NOT SOF markers */
M_SOF6 =     198; #define M_SOF6  0xC6
M_SOF7 =     199; #define M_SOF7  0xC7
M_SOF9 =     201; #define M_SOF9  0xC9
M_SOF10=     202; #define M_SOF10 0xCA
M_SOF11=     203; #define M_SOF11 0xCB
M_SOF13=     205; #define M_SOF13 0xCD
M_SOF14=     206; #define M_SOF14 0xCE
M_SOF15=     207; #define M_SOF15 0xCF
M_SOI  =     216; #define M_SOI   0xD8		/* Start Of Image (beginning of datastream) */
M_EOI  =     217; #define M_EOI   0xD9		/* End Of Image (end of datastream) */
M_SOS  =     218; #define M_SOS   0xDA		/* Start Of Scan (begins compressed data) */
M_APP0 =     224; #define M_APP0	0xE0		/* Application-specific marker, type N */
M_APP12=     236; #define M_APP12	0xEC		/* (we don't bother to list all 16 APPn's) */
M_COM  =     254; #define M_COM   0xFE		/* COMment */



thisfile=AskFilename("Select Image file","","GIF or JPG|*.gif;*.jpg;*.jpeg","*.*",1)

bb=BinaryAlloc(FileSize(thisfile))


   thisExt=strlower(FileExtension(thisfile))
   thisroot=FileRoot(thisfile)
   BinaryEODSet(bb,0)
   BinaryRead(bb,thisfile)
   if thisExt=="gif"
      width=BinaryPeek2(bb,6)
      height=BinaryPeek2(bb,8)
   else     ; JPEG
                   off=0
                  
                  ;Get and check first marker
                  c1=BinaryPeek(bb,off)
                  Terminate(c1!=255,thisfile,"Not jpeg.  First byte not FF")
                  off=off+1
                  
                  c2=BinaryPeek(bb,off)
                  Terminate(c2!=M_SOI,thisfile,"Not jpeg.  SOI marker missing")
                  off=off+1
                  marker=c2
                  
                  ;We just past SOI marker.  Get next marker
                  
                  while 1
                  gosub getnextmarker
                  
                  switch marker
                      case M_SOF0;		/* Baseline */
                      case M_SOF1;		/* Extended sequential, Huffman */
                      case M_SOF2;		/* Progressive, Huffman */
                      case M_SOF3;		/* Lossless, Huffman */
                      case M_SOF5;		/* Differential sequential, Huffman */
                      case M_SOF6;		/* Differential progressive, Huffman */
                      case M_SOF7;		/* Differential lossless, Huffman */
                      case M_SOF9;		/* Extended sequential, arithmetic */
                      case M_SOF10;		/* Progressive, arithmetic */
                      case M_SOF11;		/* Lossless, arithmetic */
                      case M_SOF13;		/* Differential sequential, arithmetic */
                      case M_SOF14;		/* Differential progressive, arithmetic */
                      case M_SOF15;		/* Differential lossless, arithmetic */
                           len=BinaryPeek(bb,off)*256+BinaryPeek(bb,off+1)
                           datapres=BinaryPeek(bb,off+2)
                           height=BinaryPeek(bb,off+3)*256+BinaryPeek(bb,off+4)
                           width=BinaryPeek(bb,off+5)*256+BinaryPeek(bb,off+6)
                           comp=BinaryPeek(bb,off+7)
                           ;Message(off,"H=%height% W=%width%")
                           gosub skipblock
                         break
                  
                  
                      case marker;			/* Anything else just gets skipped */
                        ;Message(off,marker) 
                        gosub skipblock;		/* we assume it has a parameter count... */
                        break;
                  
                  
                  endswitch
                  if marker==M_SOS then break
                  continue
                  endwhile
                  
                  ;Message("All","Doned")


   endif



BinaryFree(bb)
Message(thisfile,strcat("Width=",width,@crlf,"Height=",height))

exit

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

:skipblock
   len=BinaryPeek(bb,off)*256+BinaryPeek(bb,off+1)
   off=off+len
   return

:getnextmarker
;Discard bytes till be get a FF byte

while (BinaryPeek(bb,off)!=255)
      off=off+1
endwhile

;Now discard FF bytes till be get a databyte

while BinaryPeek(bb,off)==255
    off=off+1
endwhile

marker=BinaryPeek(bb,off)
off=off+1
return






Article ID:   W14954