为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

c语言jpeg解码源代码

2019-11-22 5页 doc 70KB 44阅读

用户头像 个人认证

来生缘分

暂无简介

举报
c语言jpeg解码源代码#ifndef__JPEGDEC_H__#define__JPEGDEC_H__#include<stdio.h>#include<stdlib.h>#include<string.h>#defineBYTEunsignedchar#defineWORDunsignedshortint#defineDWORDunsignedint#defineSDWORDsignedint#defineSBYTEsignedchar#defineSWORDsignedshortintintload_JPEG...
c语言jpeg解码源代码
#ifndef__JPEGDEC_H__#define__JPEGDEC_H__#include<stdio.h>#include<stdlib.h>#include<string.h>#defineBYTEunsignedchar#defineWORDunsignedshortint#defineDWORDunsignedint#defineSDWORDsignedint#defineSBYTEsignedchar#defineSWORDsignedshortintintload_JPEG_header(FILE*fp,DWORD*X_image,DWORD*Y_image);voiddecode_JPEG_image();intget_JPEG_buffer(WORDX_image,WORDY_image,BYTE**address_dest_buffer);#endif#include<conio.h>#include<time.h>char*FileName="image.jpg";externcharerror_string[90];typedefstructs_BM_header{WORDBMP_id;//'B''M'DWORDsize;//sizeinbytesoftheBMPfileDWORDzero_res;//0DWORDoffbits;//54DWORDbiSize;//0x28DWORDWidth;//XDWORDHeight;//YWORDbiPlanes;//1WORDbiBitCount;//24DWORDbiCompression;//0=BI_RGBDWORDbiSizeImage;//0DWORDbiXPelsPerMeter;//0xB40DWORDbiYPelsPerMeter;//0xB40DWORDbiClrUsed;//0DWORDbiClrImportant;//0}BM_header;typedefstructs_RGB{BYTEB;BYTEG;BYTER;}RGB;voidexitmessage(char*message){printf("%s\n",message);exit(0);}voidwrite_buf_to_BMP(BYTE*im_buffer,WORDX_bitmap,WORDY_bitmap,char*BMPname){SWORDx,y;RGB*pixel;BM_headerBH;FILE*fp_bitmap;DWORDim_loc_bytes;BYTEnr_fillingbytes,i;BYTEzero_byte=0;fp_bitmap=fopen(BMPname,"wb");if(fp_bitmap==NULL)exitmessage("Filecannotbecreated");if(X_bitmap%4!=0)nr_fillingbytes=4-((X_bitmap*3L)%4);elsenr_fillingbytes=0;BH.BMP_id='M'*256+'B';fwrite(&BH.BMP_id,2,1,fp_bitmap);BH.size=54+Y_bitmap*(X_bitmap*3+nr_fillingbytes);fwrite(&BH.size,4,1,fp_bitmap);BH.zero_res=0;fwrite(&BH.zero_res,4,1,fp_bitmap);BH.offbits=54;fwrite(&BH.offbits,4,1,fp_bitmap);BH.biSize=0x28;fwrite(&BH.biSize,4,1,fp_bitmap);BH.Width=X_bitmap;fwrite(&BH.Width,4,1,fp_bitmap);BH.Height=Y_bitmap;fwrite(&BH.Height,4,1,fp_bitmap);BH.biPlanes=1;fwrite(&BH.biPlanes,2,1,fp_bitmap);BH.biBitCount=24;fwrite(&BH.biBitCount,2,1,fp_bitmap);BH.biCompression=0;fwrite(&BH.biCompression,4,1,fp_bitmap);BH.biSizeImage=0;fwrite(&BH.biSizeImage,4,1,fp_bitmap);BH.biXPelsPerMeter=0xB40;fwrite(&BH.biXPelsPerMeter,4,1,fp_bitmap);BH.biYPelsPerMeter=0xB40;fwrite(&BH.biYPelsPerMeter,4,1,fp_bitmap);BH.biClrUsed=0;fwrite(&BH.biClrUsed,4,1,fp_bitmap);BH.biClrImportant=0;fwrite(&BH.biClrImportant,4,1,fp_bitmap);printf("Writingbitmap...\n");im_loc_bytes=(DWORD)im_buffer+((DWORD)Y_bitmap-1)*X_bitmap*4;for(y=0;y<Y_bitmap;y++){for(x=0;x<X_bitmap;x++){pixel=(RGB*)im_loc_bytes;fwrite(pixel,3,1,fp_bitmap);im_loc_bytes+=4;}for(i=0;i<nr_fillingbytes;i++)fwrite(&zero_byte,1,1,fp_bitmap);im_loc_bytes-=2L*X_bitmap*4;}printf("Done.\n");fclose(fp_bitmap);}//Usedmarkers:#defineSOI0xD8#defineEOI0xD9#defineAPP00xE0#defineSOF0xC0#defineDQT0xDB#defineDHT0xC4#defineSOS0xDA#defineDRI0xDD#defineCOM0xFEcharerror_string[90];#defineexit_func(err){strcpy(error_string,err);return0;}staticBYTE*buf;//thebufferweuseforstoringtheentireJPGfilestaticBYTEbp;//currentbytestaticWORDwp;//currentwordstaticDWORDbyte_pos;//currentbyteposition#defineBYTE_p(i)bp=buf[(i)++]#defineWORD_p(i)wp=(((WORD)(buf[(i)]))<<8)+buf[(i)+1];(i)+=2//WORDX_image_size,Y_image_size;//X,YsizesoftheimagestaticWORDX_round,Y_round;//ThedimensionsroundedtomultipleofHmax*8(X_round)//andYmax*8(Y_round)staticBYTE*im_buffer;//RGBAimagebufferstaticDWORDX_image_bytes;//sizeinbytesof1lineoftheimage=X_round*4staticDWORDy_inc_value;//32*X_round;//usedbydecode_MCU_1x2,2x1,2x2BYTEYH,YV,CbH,CbV,CrH,CrV;//samplingfactors(horizontalandvertical)forY,Cb,CrstaticWORDHmax,Vmax;staticBYTEzigzag[64]={0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63};typedefstruct{BYTELength[17];//k=1-16;L[k]indicatesthenumberofHuffmancodesoflengthkWORDminor_code[17];//indicatesthevalueofthesmallestHuffmancodeoflengthkWORDmajor_code[17];//similar,butthehighestcodeBYTEV[65536];//V[k][j]=Valueassociatedtothej-thHuffmancodeoflengthk//Highnibble=nrofprevious0coefficients//Lownibble=size(inbits)ofthecoefficientwhichwillbetakenfromthedatastream}Huffman_table;staticfloat*QT[4];//quantizationtables,nomorethan4quantizationtables(QT[0..3])staticHuffman_tableHTDC[4];//DChuffmantables,nomorethan4(0..3)staticHuffman_tableHTAC[4];//AChuffmantables(0..3)staticBYTEYQ_nr,CbQ_nr,CrQ_nr;//quantizationtablenumberforY,Cb,CrstaticBYTEYDC_nr,CbDC_nr,CrDC_nr;//DCHuffmantablenumberforY,Cb,CrstaticBYTEYAC_nr,CbAC_nr,CrAC_nr;//ACHuffmantablenumberforY,Cb,CrstaticBYTERestart_markers;//if1=>Restartmarkerson,0=>norestartmarkersstaticWORDMCU_restart;//RestartmarkersappearseveryMCU_restartMCUblockstypedefvoid(*decode_MCU_func)(DWORD);staticSWORDDCY,DCCb,DCCr;//CoeficientiiDCpentruY,Cb,CrstaticSWORDDCT_coeff[64];//CurrentDCT_coefficientsstaticBYTEY[64],Cb[64],Cr[64];//Y,Cb,Crofthecurrent8x8blockforthe1x1casestaticBYTEY_1[64],Y_2[64],Y_3[64],Y_4[64];staticBYTEtab_1[64],tab_2[64],tab_3[64],tab_4[64];//tabeleledesupraesantionareptcele4blocuristaticSWORDCr_tab[256],Cb_tab[256];//PrecalculatedCr,CbtablesstaticSWORDCr_Cb_green_tab[65536];//Initialconditions://byte_pos=startpositionintheHuffmancodedsegment//WORD_get(w1);WORD_get(w2);wordval=w1;staticBYTEd_k=0;//Bitdisplacementinmemory,relativetotheoffsetofw1//it'salways<16staticWORDw1,w2;//w1=Firstwordinmemory;w2=SecondwordstaticDWORDwordval;//theactualusedvalueinHuffmandecoding.staticDWORDmask[17];staticSWORDneg_pow2[17]={0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};staticDWORDstart_neg_pow2=(DWORD)neg_pow2;staticintshift_temp;#defineRIGHT_SHIFT(x,shft)\((shift_temp=(x))<0?\(shift_temp>>(shft))|((~(0L))<<(32-(shft))):\(shift_temp>>(shft)))#defineDESCALE(x,n)RIGHT_SHIFT((x)+(1L<<((n)-1)),n)#defineRANGE_MASK1023LstaticBYTE*rlimit_table;voidprepare_range_limit_table()/*Allocateandfillinthesample_range_limittable*/{intj;rlimit_table=(BYTE*)malloc(5*256L+128);/*Firstsegmentof"simple"table:limit[x]=0forx<0*/memset((void*)rlimit_table,0,256);rlimit_table+=256;/*allownegativesubscriptsofsimpletable*//*Mainpartof"simple"table:limit[x]=x*/for(j=0;j<256;j++)rlimit_table[j]=j;/*Endofsimpletable,restoffirsthalfofpost-IDCTtable*/for(j=256;j<640;j++)rlimit_table[j]=255;/*Secondhalfofpost-IDCTtable*/memset((void*)(rlimit_table+640),0,384);for(j=0;j<128;j++)rlimit_table[j+1024]=j;}#ifdef_MSC_VERWORDlookKbits(BYTEk){_asm{movdl,kmovcl,16subcl,dlmoveax,[wordval]shreax,cl}}WORDWORD_hi_lo(BYTEbyte_high,BYTEbyte_low){_asm{movah,byte_highmoval,byte_low}}SWORDget_svalue(BYTEk)//k>0always//TakeskbitsoutoftheBITstream(wordval),andmakesthemasignedvalue{_asm{xorecx,ecxmovcl,kmoveax,[wordval]shleax,clshreax,16decclbteax,ecxjcend_macrosigned_value:incclmovebx,[start_neg_pow2]addax,wordptr[ebx+ecx*2]end_macro:}}#endif#ifdef__WATCOMC__WORDlookKbits(BYTEk);#pragmaauxlookKbits=\"moveax,[wordval]"\"movcl,16"\"subcl,dl"\"shreax,cl"\parm[dl]\value[ax]\modify[eaxcl];WORDWORD_hi_lo(BYTEbyte_high,BYTEBYTE_low);#pragmaauxWORD_hi_lo=\parm[ah][al]\value[ax]\modify[ax];SWORDget_svalue(BYTEk);//k>0always//TakeskbitsoutoftheBITstream(wordval),andmakesthemasignedvalue#pragmaauxget_svalue=\"xorecx,ecx"\"movcl,al"\"moveax,[wordval]"\"shleax,cl"\"shreax,16"\"deccl"\"bteax,ecx"\"jcend_macro"\"signed_value:inccl"\"movebx,[start_neg_pow2]"\"addax,wordptr[ebx+ecx*2]"\"end_macro:"\parm[al]\modify[eaxebxecx]\value[ax];#endifvoidskipKbits(BYTEk){BYTEb_high,b_low;d_k+=k;if(d_k>=16){d_k-=16;w1=w2;//Getthenextwordinw2BYTE_p(byte_pos);if(bp!=0xFF)b_high=bp;else{if(buf[byte_pos]==0)byte_pos++;//skip00elsebyte_pos--;//stopbyte_posperestartmarkerb_high=0xFF;}BYTE_p(byte_pos);if(bp!=0xFF)b_low=bp;else{if(buf[byte_pos]==0)byte_pos++;//skip00elsebyte_pos--;//stopbyte_posperestartmarkerb_low=0xFF;}w2=WORD_hi_lo(b_high,b_low);}wordval=((DWORD)(w1)<<16)+w2;wordval<<=d_k;wordval>>=16;}SWORDgetKbits(BYTEk){SWORDsigned_wordvalue;signed_wordvalue=get_svalue(k);skipKbits(k);returnsigned_wordvalue;}voidcalculate_mask(){BYTEk;DWORDtmpdv;for(k=0;k<=16;k++){tmpdv=0x10000;mask[k]=(tmpdv>>k)-1;}//precalculatedbitmask}voidinit_QT(){BYTEi;for(i=0;i<=3;i++)QT[i]=(float*)malloc(sizeof(float)*64);}voidload_quant_table(float*quant_table){floatscalefactor[8]={1.0f,1.387039845f,1.306562965f,1.175875602f,1.0f,0.785694958f,0.541196100f,0.275899379f};BYTEj,row,col;//LoadquantizationcoefficientsfromJPGfile,scalethemforDCTandreorder//fromzig-zagorderfor(j=0;j<=63;j++)quant_table[j]=buf[byte_pos+zigzag[j]];j=0;for(row=0;row<=7;row++)for(col=0;col<=7;col++){quant_table[j]*=scalefactor[row]*scalefactor[col];j++;}byte_pos+=64;}voidload_Huffman_table(Huffman_table*HT){BYTEk,j;DWORDcode;for(j=1;j<=16;j++){BYTE_p(byte_pos);HT->Length[j]=bp;}for(k=1;k<=16;k++)for(j=0;j<HT->Length[k];j++){BYTE_p(byte_pos);HT->V[WORD_hi_lo(k,j)]=bp;}code=0;for(k=1;k<=16;k++){HT->minor_code[k]=(WORD)code;for(j=1;j<=HT->Length[k];j++)code++;HT->major_code[k]=(WORD)(code-1);code*=2;if(HT->Length[k]==0){HT->minor_code[k]=0xFFFF;HT->major_code[k]=0;}}}voidprocess_Huffman_data_unit(BYTEDC_nr,BYTEAC_nr,SWORD*previous_DC){//Processonedataunit.Adataunit=64DCTcoefficients//DataisdecompressedbyHuffmandecoding,thenthearrayisdezigzag-ed//Theresultisa64DCTcoefficientsarray:DCT_coeffBYTEnr,k,j,EOB_found;registerWORDtmp_Hcode;BYTEsize_val,count_0;WORD*min_code,*maj_code;//min_code[k]=minimumcodeoflengthk,maj_code[k]=similarbutmaximumWORD*max_val,*min_val;BYTE*huff_values;SWORDDCT_tcoeff[64];BYTEbyte_temp;//StartHuffmandecoding//FirsttheDCcoefficientdecodingmin_code=HTDC[DC_nr].minor_code;maj_code=HTDC[DC_nr].major_code;huff_values=HTDC[DC_nr].V;for(nr=0;nr<64;nr++)DCT_tcoeff[nr]=0;//InitializeDCT_tcoeffnr=0;//DCcoefficientmin_val=&min_code[1];max_val=&maj_code[1];for(k=1;k<=16;k++){tmp_Hcode=lookKbits(k);//max_val=&maj_code[k];min_val=&min_code[k];if((tmp_Hcode<=*max_val)&&(tmp_Hcode>=*min_val)){//FoundavalidHuffmancodeskipKbits(k);size_val=huff_values[WORD_hi_lo(k,(BYTE)(tmp_Hcode-*min_val))];if(size_val==0)DCT_tcoeff[0]=*previous_DC;else{DCT_tcoeff[0]=*previous_DC+getKbits(size_val);*previous_DC=DCT_tcoeff[0];}break;}min_val++;max_val++;}//Second,ACcoefficientdecodingmin_code=HTAC[AC_nr].minor_code;maj_code=HTAC[AC_nr].major_code;huff_values=HTAC[AC_nr].V;nr=1;//ACcoefficientEOB_found=0;while((nr<=63)&&(!EOB_found)){max_val=&maj_code[1];min_val=&min_code[1];for(k=1;k<=16;k++){tmp_Hcode=lookKbits(k);//max_val=&maj_code[k];&min_val=min_code[k];if((tmp_Hcode<=*max_val)&&(tmp_Hcode>=*min_val)){skipKbits(k);byte_temp=huff_values[WORD_hi_lo(k,(BYTE)(tmp_Hcode-*min_val))];size_val=byte_temp&0xF;count_0=byte_temp>>4;if(size_val==0){if(count_0==0)EOB_found=1;elseif(count_0==0xF)nr+=16;//skip16zeroes}else{nr+=count_0;//skipcount_0zeroesDCT_tcoeff[nr++]=getKbits(size_val);}break;}min_val++;max_val++;}if(k>16)nr++;//Thisshouldnotoccur}for(j=0;j<=63;j++)DCT_coeff[j]=DCT_tcoeff[zigzag[j]];//Et,voila...DCT_coeff}voidIDCT_transform(SWORD*incoeff,BYTE*outcoeff,BYTEQ_nr)//FastfloatIDCTtransform{BYTEx;SBYTEy;SWORD*inptr;BYTE*outptr;floatworkspace[64];float*wsptr;//Workspacepointerfloat*quantptr;//Quantizationtablepointerfloatdcval;floattmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7;floattmp10,tmp11,tmp12,tmp13;floatz5,z10,z11,z12,z13;BYTE*range_limit=rlimit_table+128;//Pass1:processCOLUMNSfrominputandstoreintoworkarray.wsptr=workspace;inptr=incoeff;quantptr=QT[Q_nr];for(y=0;y<=7;y++){if((inptr[8]|inptr[16]|inptr[24]|inptr[32]|inptr[40]|inptr[48]|inptr[56])==0){//ACtermsallzero(inacolumn)dcval=inptr[0]*quantptr[0];wsptr[0]=dcval;wsptr[8]=dcval;wsptr[16]=dcval;wsptr[24]=dcval;wsptr[32]=dcval;wsptr[40]=dcval;wsptr[48]=dcval;wsptr[56]=dcval;inptr++;quantptr++;wsptr++;//advancepointerstonextcolumncontinue;}//Evenparttmp0=inptr[0]*quantptr[0];tmp1=inptr[16]*quantptr[16];tmp2=inptr[32]*quantptr[32];tmp3=inptr[48]*quantptr[48];tmp10=tmp0+tmp2;//phase3tmp11=tmp0-tmp2;tmp13=tmp1+tmp3;//phases5-3tmp12=(tmp1-tmp3)*1.414213562f-tmp13;//2*c4tmp0=tmp10+tmp13;//phase2tmp3=tmp10-tmp13;tmp1=tmp11+tmp12;tmp2=tmp11-tmp12;//Oddparttmp4=inptr[8]*quantptr[8];tmp5=inptr[24]*quantptr[24];tmp6=inptr[40]*quantptr[40];tmp7=inptr[56]*quantptr[56];z13=tmp6+tmp5;//phase6z10=tmp6-tmp5;z11=tmp4+tmp7;z12=tmp4-tmp7;tmp7=z11+z13;//phase5tmp11=(z11-z13)*1.414213562f;//2*c4z5=(z10+z12)*1.847759065f;//2*c2tmp10=1.082392200f*z12-z5;//2*(c2-c6)tmp12=-2.613125930f*z10+z5;//-2*(c2+c6)tmp6=tmp12-tmp7;//phase2tmp5=tmp11-tmp6;tmp4=tmp10+tmp5;wsptr[0]=tmp0+tmp7;wsptr[56]=tmp0-tmp7;wsptr[8]=tmp1+tmp6;wsptr[48]=tmp1-tmp6;wsptr[16]=tmp2+tmp5;wsptr[40]=tmp2-tmp5;wsptr[32]=tmp3+tmp4;wsptr[24]=tmp3-tmp4;inptr++;quantptr++;wsptr++;//advancepointerstothenextcolumn}//Pass2:processROWSfromworkarray,storeintooutputarray.//Notethatwemustdescaletheresultsbyafactorof8=2^3outptr=outcoeff;wsptr=workspace;for(x=0;x<=7;x++){//Evenparttmp10=wsptr[0]+wsptr[4];tmp11=wsptr[0]-wsptr[4];tmp13=wsptr[2]+wsptr[6];tmp12=(wsptr[2]-wsptr[6])*1.414213562f-tmp13;tmp0=tmp10+tmp13;tmp3=tmp10-tmp13;tmp1=tmp11+tmp12;tmp2=tmp11-tmp12;//Oddpartz13=wsptr[5]+wsptr[3];z10=wsptr[5]-wsptr[3];z11=wsptr[1]+wsptr[7];z12=wsptr[1]-wsptr[7];tmp7=z11+z13;tmp11=(z11-z13)*1.414213562f;z5=(z10+z12)*1.847759065f;//2*c2tmp10=1.082392200f*z12-z5;//2*(c2-c6)tmp12=-2.613125930f*z10+z5;//-2*(c2+c6)tmp6=tmp12-tmp7;tmp5=tmp11-tmp6;tmp4=tmp10+tmp5;//Finaloutputstage:scaledownbyafactorof8outptr[0]=range_limit[(DESCALE((int)(tmp0+tmp7),3))&1023L];outptr[7]=range_limit[(DESCALE((int)(tmp0-tmp7),3))&1023L];outptr[1]=range_limit[(DESCALE((int)(tmp1+tmp6),3))&1023L];outptr[6]=range_limit[(DESCALE((int)(tmp1-tmp6),3))&1023L];outptr[2]=range_limit[(DESCALE((int)(tmp2+tmp5),3))&1023L];outptr[5]=range_limit[(DESCALE((int)(tmp2-tmp5),3))&1023L];outptr[4]=range_limit[(DESCALE((int)(tmp3+tmp4),3))&1023L];outptr[3]=range_limit[(DESCALE((int)(tmp3-tmp4),3))&1023L];wsptr+=8;//advancepointertothenextrowoutptr+=8;}}voidprecalculate_Cr_Cb_tables(){WORDk;WORDCr_v,Cb_v;for(k=0;k<=255;k++)Cr_tab[k]=(SWORD)((k-128.0)*1.402);for(k=0;k<=255;k++)Cb_tab[k]=(SWORD)((k-128.0)*1.772);for(Cr_v=0;Cr_v<=255;Cr_v++)for(Cb_v=0;Cb_v<=255;Cb_v++)Cr_Cb_green_tab[((WORD)(Cr_v)<<8)+Cb_v]=(int)(-0.34414*(Cb_v-128.0)-0.71414*(Cr_v-128.0));}voidconvert_8x8_YCbCr_to_RGB(BYTE*Y,BYTE*Cb,BYTE*Cr,DWORDim_loc,DWORDX_image_bytes,BYTE*im_buffer)//Functia(caoptimizare)poatefiapelatasifaraparametriiY,Cb,Cr//Stimcavafiapelatadoarincazul1x1{DWORDx,y;BYTEim_nr;BYTE*Y_val=Y,*Cb_val=Cb,*Cr_val=Cr;BYTE*ibuffer=im_buffer+im_loc;for(y=0;y<8;y++){im_nr=0;for(x=0;x<8;x++){ibuffer[im_nr++]=rlimit_table[*Y_val+Cb_tab[*Cb_val]];//Bibuffer[im_nr++]=rlimit_table[*Y_val+Cr_Cb_green_tab[WORD_hi_lo(*Cr_val,*Cb_val)]];//Gibuffer[im_nr++]=rlimit_table[*Y_val+Cr_tab[*Cr_val]];//R/*//Monochromedisplayim_buffer[im_nr++]=*Y_val;im_buffer[im_nr++]=*Y_val;im_buffer[im_nr++]=*Y_val;*/Y_val++;Cb_val++;Cr_val++;im_nr++;}ibuffer+=X_image_bytes;}}voidconvert_8x8_YCbCr_to_RGB_tab(BYTE*Y,BYTE*Cb,BYTE*Cr,BYTE*tab,DWORDim_loc,DWORDX_image_bytes,BYTE*im_buffer)//Functia(caoptimizare)poatefiapelatasifaraparametriiCb,Cr{DWORDx,y;BYTEnr,im_nr;BYTEY_val,Cb_val,Cr_val;BYTE*ibuffer=im_buffer+im_loc;nr=0;for(y=0;y<8;y++){im_nr=0;for(x=0;x<8;x++){Y_val=Y[nr];Cb_val=Cb[tab[nr]];Cr_val=Cr[tab[nr]];//reindexarefolosindtabelul//desupraesantionareprecalculatibuffer[im_nr++]=rlimit_table[Y_val+Cb_tab[Cb_val]];//Bibuffer[im_nr++]=rlimit_table[Y_val+Cr_Cb_green_tab[WORD_hi_lo(Cr_val,Cb_val)]];//Gibuffer[im_nr++]=rlimit_table[Y_val+Cr_tab[Cr_val]];//Rnr++;im_nr++;}ibuffer+=X_image_bytes;}}voidcalculate_tabs(){BYTEtab_temp[256];BYTEx,y;//Tabeluldesupraesantionare16x16for(y=0;y<16;y++)for(x=0;x<16;x++)tab_temp[y*16+x]=(y/YV)*8+x/YH;//Dinelderivamtabelelecorespunzatoarecelor4blocuride8x8pixelifor(y=0;y<8;y++){for(x=0;x<8;x++)tab_1[y*8+x]=tab_temp[y*16+x];for(x=8;x<16;x++)tab_2[y*8+(x-8)]=tab_temp[y*16+x];}for(y=8;y<16;y++){for(x=0;x<8;x++)tab_3[(y-8)*8+x]=tab_temp[y*16+x];for(x=8;x<16;x++)tab_4[(y-8)*8+(x-8)]=tab_temp[y*16+x];}}intinit_JPG_decoding(){byte_pos=0;init_QT();calculate_mask();prepare_range_limit_table();precalculate_Cr_Cb_tables();return1;//forfutureerrorcheck}DWORDfilesize(FILE*fp){DWORDpos;DWORDpos_cur;pos_cur=ftell(fp);fseek(fp,0,SEEK_END);pos=ftell(fp);fseek(fp,pos_cur,SEEK_SET);returnpos;}intload_JPEG_header(FILE*fp,DWORD*X_image,DWORD*Y_image){DWORDlength_of_file;BYTEvers,units;WORDXdensity,Ydensity,Xthumbnail,Ythumbnail;WORDlength;float*qtable;DWORDold_byte_pos;Huffman_table*htable;DWORDj;BYTEprecision,comp_id,nr_components;BYTEQT_info,HT_info;BYTESOS_found,SOF_found;length_of_file=filesize(fp);buf=(BYTE*)malloc(length_of_file+4);if(buf==NULL)exit_func("Notenoughmemoryforloadingfile");fread(buf,length_of_file,1,fp);if((buf[0]!=0xFF)||(buf[1]!=SOI))exit_func("NotaJPGfile?\n");if((buf[2]!=0xFF)||(buf[3]!=APP0))exit_func("InvalidJPGfile.");if((buf[6]!='J')||(buf[7]!='F')||(buf[8]!='I')||(buf[9]!='F')||(buf[10]!=0))exit_func("InvalidJPGfile.");init_JPG_decoding();byte_pos=11;BYTE_p(byte_pos);vers=bp;if(vers!=1)exit_func("JFIFversionnotsupported");BYTE_p(byte_pos);//vers_lo=bp;BYTE_p(byte_pos);units=bp;if(units!=0)//exit_func("JPGformatnotsupported");;//printf("units=%d\n",units);WORD_p(byte_pos);Xdensity=wp;WORD_p(byte_pos);Ydensity=wp;if((Xdensity!=1)||(Ydensity!=1))//exit_func("JPGformatnotsupported");;//{printf("Xdensity=%d\n",Xdensity);printf("Ydensity=%d\n",Ydensity);}BYTE_p(byte_pos);Xthumbnail=bp;BYTE_p(byte_pos);Ythumbnail=bp;if((Xthumbnail!=0)||(Ythumbnail!=0))exit_func("CannotprocessJFIFthumbnailedfiles\n");//StartdecodingprocessSOS_found=0;SOF_found=0;Restart_markers=0;while((byte_pos<length_of_file)&&!SOS_found){BYTE_p(byte_pos);if(bp!=0xFF)continue;//AmarkerwasfoundBYTE_p(byte_pos);switch(bp){caseDQT:WORD_p(byte_pos);length=wp;//lengthoftheDQTmarkerfor(j=0;j<wp-2;){old_byte_pos=byte_pos;BYTE_p(byte_pos);QT_info=bp;if((QT_info>>4)!=0)exit_func("16bitquantizationtablenotsupported");qtable=QT[QT_info&0xF];load_quant_table(qtable);j+=byte_pos-old_byte_pos;}break;caseDHT:WORD_p(byte_pos);length=wp;for(j=0;j<wp-2;){old_byte_pos=byte_pos;BYTE_p(byte_pos);HT_info=bp;if((HT_info&0x10)!=0)htable=&HTAC[HT_info&0xF];elsehtable=&HTDC[HT_info&0xF];load_Huffman_table(htable);j+=byte_pos-old_byte_pos;}break;caseCOM:WORD_p(byte_pos);length=wp;byte_pos+=wp-2;break;caseDRI:Restart_markers=1;WORD_p(byte_pos);length=wp;//shouldbe=4WORD_p(byte_pos);MCU_restart=wp;if(MCU_restart==0)Restart_markers=0;break;caseSOF:WORD_p(byte_pos);length=wp;//shouldbe=8+3*3=17BYTE_p(byte_pos);precision=bp;if(precision!=8)exit_func("Only8bitprecisionsupported");WORD_p(byte_pos);*Y_image=wp;WORD_p(byte_pos);*X_image=wp;BYTE_p(byte_pos);nr_components=bp;if(nr_components!=3)exit_func("OnlytruecolorJPGSsupported");for(j=1;j<=3;j++){BYTE_p(byte_pos);comp_id=bp;if((comp_id==0)||(comp_id>3))exit_func("OnlyYCbCrformatsupported");switch(comp_id){case1://YBYTE_p(byte_pos);YH=bp>>4;YV=bp&0xF;BYTE_p(byte_pos);YQ_nr=bp;break;case2://CbBYTE_p(byte_pos);CbH=bp>>4;CbV=bp&0xF;BYTE_p(byte_pos);CbQ_nr=bp;break;case3://CrBYTE_p(byte_pos);CrH=bp>>4;CrV=bp&0xF;BYTE_p(byte_pos);CrQ_nr=bp;break;}}SOF_found=1;break;caseSOS:WORD_p(byte_pos);length=wp;//shouldbe=6+3*2=12BYTE_p(byte_pos);nr_components=bp;if(nr_components!=3)exit_func("InvalidSOSmarker");for(j=1;j<=3;j++){BYTE_p(byte_pos);comp_id=bp;if((comp_id==0)||(comp_id>3))exit_func("OnlyYCbCrformatsupported");switch(comp_id){case1://YBYTE_p(byte_pos)
/
本文档为【c语言jpeg解码源代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索