【正文】
rd()。writeword()。writebyte()。writebyte()。writebyte()。writebyte()。writebyte()。}void write_DQTinfo(){BYTE i。writeword()。for(i=0。i++)writebyte([i])。for(i=0。i++) writebyte([i])。long temp。i64。/*limit the values to the valid range */if(temp=0L)temp=1L。/*limit to baseline range if requested */ newtable[zigzag[i]]=(WORD)temp。// scalefactor controls the visual quality of the image// the smaller is, the better image we39。ll achieve=0xFFB。=0。set_quant_table(std_luminance_qt,scalefactor,)。}void write_DHTinfo(){BYTE i。writeword()。for(i=0。i++) writebyte([i])。i=11。writebyte()。i16。for(i=0。i++) writebyte([i])。for(i=0。i++) writebyte([i])。i=11。writebyte()。i16。for(i=0。i++) writebyte([i])。=0xFFC4。=0。i16。for(i=0。i++) [i]=std_dc_luminance_values[i]。for(i=0。i++) [i]=std_ac_luminance_nrcodes[i+1]。i=161。=1。i16。for(i=0。i++) [i]=std_dc_chrominance_values[i]。for(i=0。i++) [i]=std_ac_chrominance_nrcodes[i+1]。i=161。}void write_SOSinfo()//Nothing to overwrite for SOSinfo{writeword()。writebyte()。writebyte()。writebyte()。writebyte()。writebyte()。}void writement(BYTE *ment){WORD i,length。//The COM markerlength=strlen((const char *)ment)。for(i=0。i++) writebyte(ment[i])。 it should be done in assembler{WORD value。//bit position in the bitstring we read, should be/=15 and =0 value=。while(posval=0){if(value amp。posval。if(bytepos0){if(bytenew==0xFF) {writebyte(0xFF)。}else{writebyte(bytenew)。bytenew=0。BYTE pos_in_table。codevalue=0。for(k=1。k++){for(j=1。j++){HT[std_table[pos_in_table]].value=codevalue。pos_in_table++。}codevalue*=2。pute_Huffman_table(std_dc_chrominance_nrcodes,std_dc_chrominance_values,CbDC_HT)。pute_Huffman_table(std_ac_chrominance_nrcodes,std_ac_chrominance_values,CbAC_HT)。exit(EXIT_FAILURE)。SDWORD nrlower,nrupper。category_alloc=(BYTE*)malloc(65535*sizeof(BYTE))。category=category_alloc+32767。if(bitcode_alloc==NULL) exitmessage(Not enough memory.)。nrlower=1。for(cat=1。cat++){//Positive numbersfor(nr=nrlower。nr++){category[nr]=cat。bitcode[nr].value=(WORD)nr。nr=nrlower。bitcode[nr].length=cat。}nrlower=1。}}void precalculate_YCbCr_tables(){WORD R,G,B。R=255。CbRtab[R]=(SDWORD)(65536*+)*R。}for(G=0。G++) {YGtab[G]=(SDWORD)(65536*+)*G。CrGtab[G]=(SDWORD)(65536*+)*G。B=255。CbBtab[B]=(SDWORD)(32768)*B。}}// Using a bit modified form of the FDCT routine from I JG39。 s C source for// JPEG encoders/decoders/* For float AAamp。s actually stored is I/divisor so that the inner loop can use a multiplication rather than a division. */void prepare_quant_tables(){double aanscalefactor[8]={,}。BYTE i=0。row8。col8。fdtbl_Cb[i]=(float)(((double)[zigzag[i]]*aanscalefactor[row]*aanscalefactor[col]*))。}}}void fdct_and_quantization(SBYTE *data, float *fdtbl,SWORD *outdata){float tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7。float z1,z2,z3,z4,z5,z11,z13。float datafloat[64]。SBYTE ctr。for(i=0。i++) datafloat[i]=data[i]。for(ctr=7。ctr){tmp0=dataptr[0]+dataptr[7]。tmp1=dataptr[1]+dataptr[6]。tmp2=dataptr[2]+dataptr[5]。tmp3=dataptr[3]+dataptr[4]。/* Even part */tmp10=tmp0+tmp3。tmp11=tmp1+tmp2。dataptr[0]=tmp10+tmp11。z1=(tmp12tmp13)*((float))。/* phase 5 */ dataptr[6]=tmp13z1。 /* phase 2 */ tmp11=tmp5+tmp6。/* The rotator is modified from fig 48 to avoid extra negations. */z5=(tmp10tmp12)*((float))。/* c2~c6 */z4=((float))*tmp12+z5。/* c4 */z11=tmp7+z3。dataptr[5]=z13+z2。dataptr[1]=z11+z4。dataptr+=8。for(ctr=7。ctr){tmp0=dataptr[0]+dataptr[56]。tmp1=dataptr[8]+dataptr[48]。tmp2=dataptr[16]+dataptr[40]。tmp3=dataptr[24]+dataptr[32]。/* Even part */tmp10=tmp0+tmp3。tmp11=tmp1+tmp2。dataptr[0]=tmp10+tmp11。z1=(tmp12tmp13)*((float))。/*phase 5*/dataptr[48]=tmp13z1。/* phase 2 */ tmp11=tmp5+tmp6。/*The rotator is modified from fig 48 to avoid extra negations. */ z5=(tmp10tmp12)*((float))。/* c2c6 */ z4=((float))*tmp12+z5。/* c4 */z11=tmp7+z3。dataptr[40]=z13+z2。dataptr[8]=z11+z4。dataptr++。i64。/* Round to nearest integer.Since C does not specify the direction of rounding for negativequotients, we have to force the dividend positive for portability. The maximum coefficient size is +16K (for 12bit data), so this code should work for either 16bit or 32bit ints.*/outdata[i]=(SWORD)((SWORD)(temp+)16384)。bitstring M16zeroes=HTAC[0xF0]。BYTE startpos。BYTE nrzeroes。SWORD Diff。//zigzag reorderfor(i=0。i++) DU[zigzag[i]]=DU_DCT[i]。*DC=DU[0]。//Diff might be 0else{writebits(HTDC[category[Diff]])。}//Encode ACsfor(endOpos=63。amp。endOpos)。return。while(i=endOpos){startpos=i。(DU[i]==0)amp。(i=endOpos)。nrzeroes=istartpos。nrmarker=nrzeroes/16。nrzeroes=nrzeroes%16。writebits(bitcode[DU[i]])。}void load_data_units_from_RGB_buffer(WORD xpos,WORD ypos){BYTE x,y。DWORD location。location=ypos*Ximage+xpos。y8。x8。G=RGB_buffer[location].G。YDU[pos]=Y(R,G,B)。CrDU[pos]=Cr(R,G,B)。pos++。}}void main_encoder(){SWORD DCY=0,DCCb=0,DCCr=0。for(ypos=0。ypos+=8)for(xpos=0。xpos+=8){load_data_units_from_RGB_buffer(xpos,ypos)。DCY,YDC_HT,YAC_HT)。DCCb,CbDC_HT,CbAC_HT)。DCCr,CbDC_HT,CbAC_HT)。BYTE nr_fillingbytes。 WORD column。WORD nrline_up,nrline_dn,nrline。colorRGB *tmpline。if(fp_bitmap==NULL) exitmessage(Cannot open bitmap file. File not found ?)。if ((TMPBUF[0]!=39。)|(TMPBUF[1]!=39。 || (TMPBUF[28]!=24)))exitmessage(Need a truecolor BMP to encode.)。Yimage=(WORD)TMPBUF[23]*256+TMPBUF[22]。*Yimage_original=Yimage。else Xdiv8=Ximage。else Ydiv8=Yimage。 if(RGB_buffer=NULL) exitmessage(Not enough memory for the bitmap image.)。 else nr_fillingbytes=0。nrlineYimage。fread(TMPBUF,1,nr_fillingbytes,fp_bitmap)。lastcolor,RGB_buffer+nrline*Xdiv8+Ximage1,3)。columnXdiv8。lastcolor,3)。dimline=Ximage*3。if(tmpline==NULL)exitmessage(Not enough memory.)。nrline_upnrline_dn。memcpy(RGB_buffernrline_up*