⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpeg.lst

📁 用51单片机解码JPEG文件
💻 LST
📖 第 1 页 / 共 4 页
字号:
 447   2                      {                                                                                                                                                                           
 448   3                              for(j=0;j<SampRate_Y_H*8;j++)
 449   3                              {
 450   4                                      if((sizej+j)<ImgWidth)
 451   4                                      {
 452   5                                              y=Y[i*8*SampRate_Y_H+j];
 453   5                                              u=U[(i/V_YtoU)*8*SampRate_Y_H+j/H_YtoU];
 454   5                                              v=V[(i/V_YtoV)*8*SampRate_Y_H+j/H_YtoV];
 455   5                                              rr=((y<<8)+18*u+367*v)>>8;
 456   5                                              gg=((y<<8)-159*u-220*v)>>8;
 457   5                                              bb=((y<<8)+411*u-29*v)>>8;
 458   5                                              R=(unsigned char)rr;
 459   5                                              G=(unsigned char)gg;
 460   5                                              B=(unsigned char)bb;
 461   5                                              if (rr&0xffffff00) if (rr>255) R=255; else if (rr<0) R=0;
 462   5                                              if (gg&0xffffff00) if (gg>255) G=255; else if (gg<0) G=0;
 463   5                                              if (bb&0xffffff00) if (bb>255) B=255; else if (bb<0) B=0;  
 464   5                                          color=R>>3;
 465   5                                              color=color<<6;
 466   5                                              color |=(G>>2);
 467   5                                              color=color<<5;
 468   5                                              color |=(B>>3);
 469   5                                              //UART_Put_Inf("X:",/*sizej+j*/CurX);
 470   5                                              //UART_Put_Inf("Y:",/*sizei+i*/CurY);
 471   5                                              //UART_Send_Enter();
 472   5                                              TFT_Draw_Point(sizej+j,sizei+i,color);
 473   5                                              //在这里送给LCD显示
 474   5                                              //POlong_COLOR=color;   
 475   5                                              //TFT_DrawPolong(sizej+j+CurX,sizej+j+CurX);//显示图片
 476   5                                              //pDC->SetPixel(sizej+j+CurX,sizei+i+CurY,B*65536+G*256+R);
 477   5                                              //if((sizej+j+CurX)==0 &&       (sizei+i+CurY)==0)
 478   5                                              
 479   5                                              //UART_Put_Inf("counter:",counter++);
 480   5                                              //UART_Put_Inf("color:",color);
 481   5                                              //UART_Put_Inf("R:",R);
 482   5                                              //UART_Put_Inf("G:",G);
 483   5                                              //UART_Put_Inf("B:",B);
 484   5                                              //UART_Send_Enter();
 485   5                                              
 486   5                                              //colorH|=(R>>3);colorH<<=3;
 487   5                                              //colorH|=(G>>5);
 488   5                                              //colorL|=(G<<3);
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 9   

 489   5                                              //colorL|=B>>3;
 490   5                                              //TFT_Write_Dat(colorH);
 491   5                                              //TFT_Write_Dat(colorL);
 492   5                                              {
 493   6                                               //P1=~R;
 494   6                                           //CString temp;
 495   6                                               //temp.Format("%d,%d,%d",R,G,B);
 496   6                                               //AfxMessageBox(temp);
 497   6                                              }
 498   5                                      }
 499   4                                      else  break;
 500   4                              }           
 501   3                      }
 502   2                      else break;
 503   2              }
 504   1      }
 505          //Huffman Decode   MCU 出口 MCUBuffer  入口Blockbuffer[  ] 
 506          long DecodeMCUBlock()
 507          {
 508   1              long *lpMCUBuffer;
 509   1              long xdata i,j;
 510   1              long xdata funcret;
 511   1      
 512   1              if (longervalFlag)//差值复位 
 513   1              {
 514   2                      lp+=2;
 515   2                      ycoef=ucoef=vcoef=0;
 516   2                      BitPos=0;
 517   2                      CurByte=0;
 518   2              }
 519   1              switch(comp_num)
 520   1              {
 521   2                      case 3:  //comp_num 指图的类型(彩色图、灰度图) 
 522   2                              lpMCUBuffer=MCUBuffer;
 523   2                              for (i=0;i<SampRate_Y_H*SampRate_Y_V;i++)  //Y
 524   2                              {
 525   3                                      funcret=HufBlock(YDcIndex,YAcIndex);//解码4 * (8*8) 
 526   3                                      if (funcret!=FUNC_OK)
 527   3                                              return funcret;
 528   3                                      BlockBuffer[0]=BlockBuffer[0]+ycoef;//直流分量是差值,所以要累加。
 529   3                                      ycoef=BlockBuffer[0];
 530   3                                      for (j=0;j<64;j++)
 531   3                                              *lpMCUBuffer++=BlockBuffer[j];
 532   3                              }
 533   2                              for (i=0;i<SampRate_U_H*SampRate_U_V;i++)  //U
 534   2                              {
 535   3                                      funcret=HufBlock(UVDcIndex,UVAcIndex);
 536   3                                      if (funcret!=FUNC_OK)
 537   3                                              return funcret;
 538   3                                      BlockBuffer[0]=BlockBuffer[0]+ucoef;
 539   3                                      ucoef=BlockBuffer[0];
 540   3                                      for (j=0;j<64;j++)
 541   3                                              *lpMCUBuffer++=BlockBuffer[j];
 542   3                              }
 543   2                              for (i=0;i<SampRate_V_H*SampRate_V_V;i++)  //V
 544   2                              {
 545   3                                      funcret=HufBlock(UVDcIndex,UVAcIndex);
 546   3                                      if (funcret!=FUNC_OK)
 547   3                                              return funcret;
 548   3                                      BlockBuffer[0]=BlockBuffer[0]+vcoef;
 549   3                                      vcoef=BlockBuffer[0];
 550   3                                      for (j=0;j<64;j++)
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 10  

 551   3                                              *lpMCUBuffer++=BlockBuffer[j];
 552   3                              }
 553   2                              break;
 554   2                      case 1: //Gray Picture 
 555   2                              lpMCUBuffer=MCUBuffer;
 556   2                              funcret=HufBlock(YDcIndex,YAcIndex);
 557   2                              if (funcret!=FUNC_OK)
 558   2                                      return funcret;
 559   2                              BlockBuffer[0]=BlockBuffer[0]+ycoef;
 560   2                              ycoef=BlockBuffer[0];
 561   2                              for (j=0;j<64;j++)
 562   2                                      *lpMCUBuffer++=BlockBuffer[j];
 563   2                              for (i=0;i<128;i++)
 564   2                                      *lpMCUBuffer++=0;
 565   2                              break;
 566   2                      default:
 567   2                              return FUNC_FORMAT_ERROR;
 568   2              }
 569   1              return FUNC_OK;
 570   1      }
 571          
 572          long HufBlock(unsigned char dchufindex,unsigned char achufindex)
 573          {
 574   1              long xdata count=0;
 575   1              long xdata i;
 576   1              long xdata funcret;
 577   1      
 578   1              //dc
 579   1              HufTabIndex=dchufindex;
 580   1              funcret=DecodeElement();
 581   1              if(funcret!=FUNC_OK)
 582   1                      return funcret;
 583   1      
 584   1              BlockBuffer[count++]=vvalue;//解出的直流系数 
 585   1              //ac
 586   1              HufTabIndex=achufindex;
 587   1              while (count<64)
 588   1              {
 589   2                      funcret=DecodeElement();
 590   2                      if(funcret!=FUNC_OK)
 591   2                              return funcret;
 592   2                      if ((rrun==0)&&(vvalue==0))
 593   2                      {
 594   3                              for (i=count;i<64;i++)
 595   3                                      BlockBuffer[i]=0;
 596   3                              count=64;
 597   3                      }
 598   2                      else
 599   2                      {                                                   
 600   3                              for (i=0;i<rrun;i++)            //前面的零
 601   3                                      BlockBuffer[count++]=0;
 602   3                              BlockBuffer[count++]=vvalue;//解出的值 
 603   3                      }
 604   2              }
 605   1              return FUNC_OK;
 606   1      }
 607          //Huffman 解码  每个元素   出口 vvalue 入口 读文件ReadByte 
 608          long DecodeElement()
 609          {
 610   1              long xdata thiscode,tempcode;
 611   1              unsigned long xdata temp,valueex;
 612   1              long xdata codelen;
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 11  

 613   1              unsigned char xdata hufexbyte,runsize,tempsize,sign;
 614   1              unsigned char xdata newbyte,lastbyte;
 615   1      
 616   1              if(BitPos>=1) //BitPos指示当前比特位置 
 617   1              {
 618   2                      BitPos--;
 619   2                      thiscode=(unsigned char)CurByte>>BitPos;//取一个比特
 620   2                      CurByte=CurByte&And[BitPos];   //清除取走的比特位 
 621   2              }
 622   1              else                                                       //取出的一个字节已用完
 623   1              {                                                                  //新取
 624   2                      lastbyte=ReadByte();               //读出一个字节
 625   2                      BitPos--;                                          //and[]:=0x0,0x1,0x3,0x7,0xf,0x1f,0x2f,0x3f,0x4f 
 626   2                      newbyte=CurByte&And[BitPos];
 627   2                      thiscode=lastbyte>>7;
 628   2                      CurByte=newbyte;
 629   2              }
 630   1              codelen=1;
 631   1              //与Huffman表中的码字匹配,直自找到为止 
 632   1              while ((thiscode<huf_min_value[HufTabIndex][codelen-1])||
 633   1                        (code_len_table[HufTabIndex][codelen-1]==0)||
 634   1                        (thiscode>huf_max_value[HufTabIndex][codelen-1]))
 635   1              {
 636   2                      if(BitPos>=1)//取出的一个字节还有
 637   2                      {
 638   3                              BitPos--;
 639   3                              tempcode=(unsigned char)CurByte>>BitPos;
 640   3                              CurByte=CurByte&And[BitPos];
 641   3                      }
 642   2                      else
 643   2                      {
 644   3                              lastbyte=ReadByte();
 645   3                              BitPos--;
 646   3                              newbyte=CurByte&And[BitPos];
 647   3                              tempcode=(unsigned char)lastbyte>>7;
 648   3                              CurByte=newbyte;
 649   3                      }
 650   2                      thiscode=(thiscode<<1)+tempcode;
 651   2                      codelen++;
 652   2                      if(codelen>16)return FUNC_FORMAT_ERROR;    
 653   2              }  //while
 654   1              temp=thiscode-huf_min_value[HufTabIndex][codelen-1]+code_pos_table[HufTabIndex][codelen-1];
 655   1              hufexbyte=(unsigned char)code_value_table[HufTabIndex][temp];
 656   1              rrun=(long)(hufexbyte>>4);       //一个字节中,高四位是其前面的零的个数。
 657   1              runsize=hufexbyte&0x0f;          //后四位为后面字的尺寸
 658   1              if(runsize==0)
 659   1              {
 660   2                      vvalue=0;
 661   2                      return FUNC_OK;
 662   2              }
 663   1              tempsize=runsize;
 664   1              if(BitPos>=runsize)
 665   1              {
 666   2                      BitPos-=runsize;
 667   2                      valueex=(unsigned char)CurByte>>BitPos;
 668   2                      CurByte=CurByte&And[BitPos];
 669   2              }
 670   1              else
 671   1              {
 672   2                      valueex=CurByte;
 673   2                      tempsize-=BitPos;
 674   2                      while(tempsize>8)
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 12  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -