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

📄 jpegmath.cpp

📁 无线图象监控系统(用VC++编程)用数据库ACCESS存储图象
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					    dct[point+k1]=0;
						point=point+k1+1;
					}
				  }
					else
					{ r1=*(jpegcode);
                      r1=r1<<8;
	                  r2=r1|(WORD)(*(jpegcode+1));
					  r2=r2>>(16-k2);
					  dct[point]=nchange(k2,r2);
					  point=point+1;
                       shiftnumber+=k2;
                      byteshift(jpegc,jpegcode,shiftnumber);
                      
					 
					}
				}
		      else
				{
				 for(int n=point;n<64;n++)
				 {dct[n]=0;
				 point=64;
				 }
				}
		  }
	 j++;
	  if(j==37 )
      aclg=true;
	}
      if(j==37 && jjj!=36)
	  {  //xiabupanduan
		r2=(WORD)*(jpegcode);
		r2=r2<<8;
		r2=r2|(WORD)(*(jpegcode+1));
		if(r2>=0xff82 && r2<=0xfffe)
		{  k1=hub[r2-0xff82];
		   k1=k1>>4;
		   k2=hub[r2-0xff82]&0x0f;
		   shiftnumber+=16;
           byteshift(jpegc,jpegcode,shiftnumber);
		  
           if(k1)
					{ int n;
		              for( n=point;n<point+k1;n++)
					  {dct[n]=0;
					  }
                      r1=*(jpegcode);
                      r1=r1<<8;
	                  r2=r1|(WORD)(*(jpegcode+1));
					  r2=r2>>(16-k2);
					  dct[point+k1]=nchange(k2,r2);
					  point=point+k1+1;
					  shiftnumber+=k2;
                      byteshift(jpegc,jpegcode,shiftnumber);
                   
					}
		            else
					{ r1=*(jpegcode);
                      r1=r1<<8;
	                  r2=r1|(WORD)(*(jpegcode+1));
					  r2=r2>>(16-k2);
					  dct[point]=nchange(k2,r2);
					  point=point+1;
                      shiftnumber+=k2;
                      byteshift(jpegc,jpegcode,shiftnumber);
					
					}
           
		 }
        else
		{     CString str;
		        str.Format("r2=%x",r2);
               AfxMessageBox(str);
			AfxMessageBox("jiemachuchuo");
		}
	  }//xiabupanduan
	  }//mcuac系数解码结束
	
      //dctfile.Write(dct,sizeof(dct));
 for(int r=0; r<64;r++)
	  {
		  dct[r]=(int)(dct[r]*qutable[r]);
	  }
 
	  int col=(int)(block/rowblock);
	  int row=block%rowblock;
	

	  double* dctinverse=ziginverse(dct);
 
      fidct_2D(dctinverse,3,3);
 for(int x=0;x<8;x++)
	 {
		 for(int y=0;y<8;y++)
		 {
           pdc->SetPixel(x+8*row,y+col*8,RGB(byteadd(dctinverse[8*y+x]),byteadd(dctinverse[8*y+x]),byteadd(dctinverse[8*y+x])));
		 }
		}

      for(int m0=0;m0<8;m0++)
	  {
		  for(int n0=0;n0<8;n0++)
		  {dctcoffdecode[(height-1-m0-8*col)*widthbyte+n0+8*row]=byteadd(dctinverse[8*m0+n0]);
		  }
	  }

 
	  block++;
	  CString str;
 str.Format("第%d快解码",block);
 pdc->TextOut(60,60,str);
	
      }//总循环
	 
 CString ddd;
ddd.Format("shiftnumber=%d ",shiftnumber/8);
AfxMessageBox(ddd);
delete jpegcode;
delete jpeg;
	return dctcoffdecode;
}

BOOL graydctdecode(int width,int height,int widthbyte,CByteArray* jpeg,double quality,BYTE* dcc,BYTE* acc)
{
int quta[64]={ 0x10,0x0B,0x0C,0x0E,0x0C,0x0A,0x10,0x0E,0x0D,0x0E,0x12,0x11,0x10,0x13,0x18,0x28,
                  0x1A,0x18,0x16,0x16,0x18,0x31,0x23,0x25,0x1D,0x28,0x3A,0x33,0x3D,0x3C,0x39,0x33,
                  0x38,0x37,0x40,0x48,0x5C,0x4E,0x40,0x44,0x57,0x45,0x37,0x38,0x50,0x6D,0x51,0x57,
                  0x5F,0x62,0x67,0x68,0x67,0x3E,0x4D,0x71,0x79,0x70,0x64,0x78,0x5C,0x65,0x67,0x63};
int qutable[64];
for(int t=0;t<64;t++)
{
qutable[t]=(int)(quta[t]*quality);
}
	//CFile dctfile;
  //dctfile.Open("d:\\解码系数.txt",CFile::modeCreate|CFile::modeWrite);
//  int coffcnt; //dct系数计数 以64为周期
  int shiftnumber;//移位计数
  int dccoff; //存储dc差分系数
  int dc;//dc系数
  int block; //解码块计数
  int rowblock=width/8;//行块数
  int colblock=height/8;//列块数
  //int decodebit;//解码bit数
  
  int dct[64];//存储dct系数
  CByteArray aclen; //存储ac行程编码
  aclen.RemoveAll();
  LONG jpeglenth=jpeg->GetSize();
 
	  int ln=0;
	while(ln<jpeg->GetSize())
  {if(jpeg->GetAt(ln)==0xff && jpeg->GetAt(ln+1)==0x00)
     jpeg->RemoveAt(ln+1);
	 ln++;
  }
  BYTE* jpegc=jpeg->GetData();
  BYTE* jpegcode=new BYTE[5];
  memcpy(jpegcode,jpegc,5);
  block=0;
  shiftnumber=0;
  LONG codelen;
  codelen=0;
  WORD r1;
  WORD r2;
  WORD r3;
  BYTE k1;//行程长
  BYTE k2;//非零系数位长
    WORD dchuffbef[12]={0x0000,0x4000,0x6000,0x8000,0xa000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00};
    WORD andbuf[12]={0xc000,0xe000,0xe000,0xe000,0xe000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00,0xff80};
    BYTE dccode[12]={2,3,3,3,3,3,4,5,6,7,8,9};
    BYTE accodelen[37]={2,2,3,4,4,4,5,5,
		                5,6,6,7,7,7,7,8,
						8,8,9,9,9,9,9,10,
						10,10,10,10,11,11,11,11,
						12,12,12,12,15};
    WORD acandbuf[37]={ 0xc000,0xc000,0xe000,0xf000,0xf000,0xf000,0xf800,0xf800,
						0xf800,0xfc00,0xfc00,0xfe00,0xfe00,0xfe00,0xfe00,0xff00,
						0xff00,0xff00,0xff80,0xff80,0xff80,0xff80,0xff80,0xffc0,
						0xffc0,0xffc0,0xffc0,0xffc0,0xffe0,0xffe0,0xffe0,0xffe0,
						0xfff0,0xfff0,0xfff0,0xfff0,0xfffe};
	WORD achuff[37]={0x0000,0x4000,0x8000,0xa000,0xb000,0xc000,0xd000,0xd800,
		             0xe000,0xe800,0xec00,0xf000,0xf200,0xf400,0xf600,0xf800,
					 0xf900,0xfa00,0xfb00,0xfb80,0xfc00,0xfc80,0xfd00,0xfd80,
					 0xfdc0,0xfe00,0xfe40,0xfe80,0xfec0,0xfee0,0xff00,0xff20,
					 0xff40,0xff50,0xff60,0xff70,0xff80};
    BYTE  dd[37] =
    { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
      0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
      0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
      0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
      0x24, 0x33, 0x62, 0x72, 0x82};
  BYTE hub[125]={0x09, 0x0a, 0x16,
      0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
      0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
      0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
      0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
      0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
      0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
      0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
      0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
      0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
      0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
      0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
      0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
      0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
      0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
      0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
      0xf9, 0xfa};
     int blocknum;
	 blocknum=(width/8)*(height/8);
  //WORD r2;//前缀哈夫曼码
   int point;
   while(block<blocknum)
   {     //AfxMessageBox("jiemakaishi");   //总循环
     point=0;   
     BYTE i=0;
    
	bool juge;
	juge=false;
  int shiftsum;
	while(!juge) //dc 系数解码
	{ if(i==12)
	{AfxMessageBox("DC解码出错");
	   return FALSE;
	}
	 r2=*(jpegcode);
      r2=r2<<8;
	  r2=r2|(WORD)(*(jpegcode+1));
	  r3=r2&andbuf[i];
      juge=(r3==dchuffbef[i]);
        if(juge)
			{    shiftnumber+=dccode[i];
			  byteshift(jpegc,jpegcode,shiftnumber);//if1
			  shiftsum=dccode[i];
			       r1=*(jpegcode);
                   r1=r1<<8;
	               r2=r1|(WORD)(*(jpegcode+1));
				   r2=r2>>(16-i);
				  dccoff=nchange(i,r2);
				  if(block==0)
				  {
				  dct[0]=dccoff;
				  dc=dccoff;
				  }
				  else
				  {dct[0]=dccoff+dc;
				   dc=dct[0];
				  }
                  shiftnumber+=i;
				  byteshift(jpegc,jpegcode,shiftnumber);
				
             point++;
		}
	
		i++;
	}
	//CString dct0;
	//dct0.Format("%d",dct[0]);
	//AfxMessageBox(dct0);


		while(point<64)
	{           //mcu ac系数解码开始
     //ac 系数解码
     
	 
    bool aclg=false;
    int j;
     j=0;
    int jjj=0;
     while(!aclg)
	{    
	  r2=*(jpegcode);
      r2=r2<<8;
	  r2=r2|(WORD)(*(jpegcode+1));
	  r3=r2&acandbuf[j];
	  aclg=(r3==achuff[j]);
	 
	  //AfxMessageBox("acjiemakaishi");
		  if(aclg)
		  { //AfxMessageBox("acjiemakaishi"); 
			  jjj=j;
		   k1=dd[j];
		   k1=k1>>4;
		   k2=dd[j]&0x0f;
		   shiftnumber+=accodelen[j];
           byteshift(jpegc,jpegcode,shiftnumber);
          
             
		   if(j!=3)//否则为eob
				{int n;
			      if(k1!=0 )
					{ if(dd[j]!=0xf0)
						{
		              for(n=point;n<point+k1;n++)
					  {dct[n]=0;
					  }
                      r1=*(jpegcode);
                      r1=r1<<8;
	                  r2=r1|(WORD)(*(jpegcode+1));
					  r2=r2>>(16-k2);
					  dct[point+k1]=nchange(k2,r2);
					  point=point+k1+1;
					  shiftnumber+=k2;
                      byteshift(jpegc,jpegcode, shiftnumber);
                      
					  
					}
		            else 
					{   
						for(n=point;n<point+k1;n++)
					  {dct[n]=0;
					  }
					    dct[point+k1]=0;
						point=point+k1+1;
					}
				  }
					else
					{ r1=*(jpegcode);
                      r1=r1<<8;
	                  r2=r1|(WORD)(*(jpegcode+1));
					  r2=r2>>(16-k2);
					  dct[point]=nchange(k2,r2);
					  point=point+1;
                      shiftnumber+=k2;
                      byteshift(jpegc,jpegcode,shiftnumber);
                      
					 
					}
				}
		      else
				{
				 for(int n=point;n<64;n++)
				 {dct[n]=0;
				 point=64;
				 }
				}
		  }
	 j++;
	  if(j==37 )
      aclg=true;
	}
      if(j==37 && jjj!=36)
	  {  //xiabupanduan
		r2=(WORD)*(jpegcode);
		r2=r2<<8;
		r2=r2|(WORD)(*(jpegcode+1));
		if(r2>=0xff82 && r2<=0xfffe)
		{  k1=hub[r2-0xff82];
		   k1=k1>>4;
		   k2=hub[r2-0xff82]&0x0f;
		   shiftnumber+=16;
           byteshift(jpegc,jpegcode,shiftnumber);
		  
           if(k1)
					{ int n;
		              for( n=point;n<point+k1;n++)
					  {dct[n]=0;
					  }
                      r1=*(jpegcode);
                      r1=r1<<8;
	                  r2=r1|(WORD)(*(jpegcode+1));
					  r2=r2>>(16-k2);
					  dct[point+k1]=nchange(k2,r2);
					  point=point+k1+1;
					  shiftnumber+=k2;
                      byteshift(jpegc,jpegcode,shiftnumber);
                   
					}
		            else
					{ r1=*(jpegcode);
                      r1=r1<<8;
	                  r2=r1|(WORD)(*(jpegcode+1));
					  r2=r2>>(16-k2);
					  dct[point]=nchange(k2,r2);
					  point=point+1;
                      shiftnumber+=k2;
                      byteshift(jpegc,jpegcode,shiftnumber);
					
					}
           
		 }
        else
		{    // CString str;
		        //str.Format("r2=%x",r2);
               //AfxMessageBox(str);
			//AfxMessageBox("jiemachuchuo");
             aclen.RemoveAll();
            delete jpegcode;
			return FALSE;
		}
	  }//xiabupanduan
	  }//mcuac系数解码结束
	
      //dctfile.Write(dct,sizeof(dct));
 for(int r=0; r<64;r++)
	  {
		  dct[r]=(int)(dct[r]*qutable[r]);
	  }
 
	  int col=(int)(block/rowblock);
	  int row=block%rowblock;
	dcc[block]=dct[0]/8;
	int averac;
    int sum=0;
	for(int p=1;p<9;p++);
	{sum=sum+dct[p];}
     averac=sum/8;
	 sum=0;
	 for(p=1;p<9;p++)
	 {int temp=dct[p]-averac;
	   sum=sum+temp*temp;
	 }
	 int ss=sqrt(sum/8);
	 acc[block]=ss;
	  block++;
	 // CString str;
 //str.Format("第%d快解码",block);
 //pdc->TextOut(60,60,str);
	
      }//总循环
aclen.RemoveAll();
delete jpegcode;
//delete jpeg;

	return TRUE;
}



BOOL Colordctdecode(int width,int height,int widthbyte,CByteArray* jpeg,double quality,BYTE* dcc,BYTE* acc)
{	int quta[64]={ 0x10,0x0B,0x0C,0x0E,0x0C,0x0A,0x10,0x0E,0x0D,0x0E,0x12,0x11,0x10,0x13,0x18,0x28,
                  0x1A,0x18,0x16,0x16,0x18,0x31,0x23,0x25,0x1D,0x28,0x3A,0x33,0x3D,0x3C,0x39,0x33,
                  0x38,0x37,0x40,0x48,0x5C,0x4E,0x40,0x44,0x57,0x45,0x37,0x38,0x50,0x6D,0x51,0x57,
                  0x5F,0x62,0x67,0x68,0x67,0x3E,0x4D,0x71,0x79,0x70,0x64,0x78,0x5C,0x65,0x67,0x63};

	int qutauv[64]={ 0x11,0x12,0x12,0x18,0x15,0x18,0x2F,0x1A,0x1A,0x2F,0x63,0x42,0x38,0x42,0x63,0x63, 
                     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 
                     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 
                     0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63};
int qutable[64];
int qutableuv[64];
for(int t=0;t<64;t++)
{
qutable[t]=(int)(quta[t]*quality);
qutableuv[t]=(int)(qutauv[t]*quality);
}

  ;//移位计数
  int dccoff=0; //存储dc差分系数

  int uvblock=0;
	  int ln=0;
while(ln<jpeg->GetSize())
  {if(jpeg->GetAt(ln)==0xff && jpeg->GetAt(ln+1)==0x00)
     jpeg->RemoveAt(ln+1);
	 ln++;
  }
 
  int dct[64];//存储dct系数
  CByteArray aclen; //存储ac行程编码
  aclen.RemoveAll();
  LONG jpeglenth=jpeg->GetSize();
  BYTE* jpegc=jpeg->GetData();
  BYTE* jpegcode=new BYTE[5];
  memcpy(jpegcode,jpegc,5);
  int shiftnumber=0;
  LONG codelen;
  codelen=0;
    int ublock=0;;
    int vblock=0;
    int udc=0;
    int vdc=0;
    int udccoff=0;
    int vdccoff=0;
    
    int rowblock=width/16;//行块数
    int colblock=height/16;//列块数
	int blocknum=rowblock*colblock;
 	int dc=0;

    //int	blocknum4=4;
    int rowblock4=2;
    int height4=16;
    int widthbyte4=16;
   

	WORD dchuffbef[12];
    WORD andbuf[12];
    BYTE dccode[12];
    BYTE accodelen[37];
    WORD acandbuf[37];
	WORD achuff[37];
    BYTE  dd[37];
    BYTE hub[125];
	WORD dchuffbef1[12];
	WORD andbuf1[12];
	BYTE dccode1[12];
	BYTE accodelen1[43];
	WORD acandbuf1[43];
	WORD achuff1[43];
	BYTE  dd1[43];
	BYTE hub1[119];


 int mcublock=0;

//CString ddd;
//ddd.Format("shiftnumber=%d ",shiftnumber/8);
//AfxMessageBox(ddd);
  while(mcublock<blocknum)
	{   	int block4=0;
   //AfxMessageBox("jiemakaishi"); 
      ytableinit(dchuffbef,andbuf,dccode,accodelen,acandbuf,achuff,dd,hub);
		
	
//CString dddd="";
//for(int uo=0;uo<5;uo++)
//{CString ddd;
//ddd.Format("%x ",jpegcode[uo]);
//dddd=dddd+ddd;
//}
//AfxMessageBox(dddd);
		whil

⌨️ 快捷键说明

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