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

📄 jpegmath.cpp

📁 无线图象监控系统(用VC++编程)用数据库ACCESS存储图象
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  AfxMessageBox(str);	
return TRUE;
}

BYTE codelen(int x)
{ BYTE rlen=0;
    if(x==0)
	rlen=0;
	else
	{ int absx=abs(x);
	  while(absx!=1)
	  { absx=absx>>1;
	    rlen++;
	  }
	  rlen++;
	}
	return rlen;
}
CByteArray* zerolencode(int qdct[64])
{
CByteArray lencode;
	 lencode.RemoveAll();
	 	 BYTE zerocnt=0;
		 int u;
	   for( u=1;u<64;u++)
	   { if(qdct[u]==0)
	      {	    
		   zerocnt++;
			if(zerocnt==16)
			{   int eobtest=0;
				for(int lu=u+1;lu<64;lu++)
				{
					if(qdct[lu]==0)
					 eobtest++;
				}
                      if(eobtest==63-u)
					  { BYTE b=0x00;
					     lencode.Add(b);
						 u=64;
					  }
					  else
					  {
			          BYTE b=0xf0;
           	          lencode.Add(b);
			          zerocnt=0;
					  }
			 zerocnt=0;
			}
			else
			{if(u==63)
			{
			  BYTE b=0x00;
           	  lencode.Add(b);
			  zerocnt=0;
			}
			}

	      }
	      else
		  { 
			BYTE rlen=codelen(qdct[u]);
		    BYTE sym1=(zerocnt<<4)|rlen;
			lencode.Add(sym1);
			BYTE qq=(char)qdct[u];
			lencode.Add(qq);
			zerocnt=0;
		  }
	     }
CByteArray* lencodeptr=new CByteArray;
lencodeptr->Copy(lencode);
	   return lencodeptr;
}
BOOL jpegadd(BYTE r1,CByteArray* jpegcode)
{//if(r1==0xff)
//{
//jpegcode->Add(r1);
//jpegcode->Add(0x00);
//}
//else
jpegcode->Add(r1);
return TRUE;
}
CByteArray* grayjpegencode(int width,int height,int widthbyte,BYTE* pdibbit, double quality)
{
/*int qutable[64]={16,11,12,14,12,10,16,14,
	           13,14,18,17,16,19,24,40,
			   26,24,22,22,24,19,35,37,
			   29,40,58,51,61,60,57,51,
			   56,55,64,72,92,78,64,68,
			   87,69,55,56,80,109,81,87,
			   95,98,103,104,103,62,77,113,
			   121,112,100,120,92,101,103,99};*/
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);
}
int linecnt=widthbyte;
BYTE* pdibbitc=new BYTE[linecnt*height];
for(int l=0;l<height;l++)
{
	for(int lrm=0;lrm<linecnt;lrm++)
   {
	   pdibbitc[linecnt*l+lrm]=pdibbit[(height-l-1)*linecnt+lrm];
   }
}
     
BYTE* lpdibbit;
BYTE dccodelen[12];
WORD dchuff[12];
BYTE accodelen[251];
WORD achuff[251];
tableinit(dccodelen,dchuff,accodelen,achuff);
double pixsub[64];
CByteArray jpegdatecode;
jpegdatecode.RemoveAll();
   int i,j;
   i=0,j=0;
   BYTE r1;
   BYTE* r2;
   WORD r3;
   DWORD codeadd;//前缀加数值
   int  cnl; //总长度
   int vlccnt;
   int dcdiff=0;
for(j=0;j<height;j=j+8)
{   //最外层循环

 for(i=0;i<width;i=i+8)
{ //第二层循环 
	   for(int n=0;n<8;n++) //n wei hang
	  {//for1
        for(int m=0;m<8;m++) //m wei lei
		 { 
		   long i0=m+i;
           long j0=n+j;
		   //lpdibbit=(BYTE*)(pdibbit+linecnt*(height-1-j0)+i0);//mcu 单元抽取   
		    lpdibbit=(BYTE*)(pdibbitc+linecnt*j0+i0);
           pixsub[n*8+m]=double((int)*lpdibbit-128);
           
		}
   }

fdct_2D(pixsub,3,3);//dct变换
double* zigdct;
zigdct=zigscan(pixsub);//zscan;
int qdct[64];
 for(int u=0;u<64;u++)
 { 	    if(zigdct[u]>0) 
	  qdct[u]=(int)((zigdct[u]/qutable[u])+0.5);
       else
      qdct[u]=(int)((zigdct[u]/qutable[u])-0.5);
	   }

 
CByteArray* lencode;
lencode=zerolencode(qdct);
 

//开始熵编码

     
 
        
        int vlclen;
       

        int sw;
 if((i==0) &(j==0))
	   { //if1
	       
       short dccoff;
       dccoff=qdct[0]-dcdiff;
       int dcdifflen;
	   dcdifflen=codelen(dccoff);
       if(dccoff<0)
	   {
	   dccoff=dcdiff-qdct[0];
	   dccoff=~dccoff;
	   dccoff=dccoff<<(16-dcdifflen);
	   dccoff=dccoff>>(16-dcdifflen);
	   } 
	   dcdiff=qdct[0];
	     vlclen=dccodelen[dcdifflen];
	  	 cnl=dcdifflen+vlclen;
	     r3=dchuff[dcdifflen];
		 r3=r3>>(16-vlclen);
		 codeadd=(DWORD)r3;
		 codeadd=codeadd<<dcdifflen;
		 codeadd=codeadd|(DWORD)dccoff;
		 
          sw=(int)(cnl/8);
		  switch(sw)
		  {
		  case 2:	  
	   {	DWORD uu=codeadd;
		    uu=uu<<(24-cnl);
			r2=(BYTE*)(&uu);
			r1=*(r2+2);
		    jpegadd(r1,&jpegdatecode);
			r1=*(r2+1);
            jpegadd(r1,&jpegdatecode);
			r1=*r2;
			vlccnt=cnl-16; 
			break;
	   }
		  case 1: 		  
	   {  DWORD uu=codeadd;
	       uu=uu<<(16-cnl);
		   r2=(BYTE*)(&uu);
		    r1=*(r2+1);
             jpegadd(r1,&jpegdatecode);
			 r1=*r2;
			 vlccnt=cnl-8;
			 break;
	   }
		  case 0:{DWORD uu=codeadd;
		         uu=uu<<(8-cnl);
		         r2=(BYTE*)(&uu);
		        r1=*r2;
		        vlccnt=cnl;
		        break;
				 }

	   }
 }//if1
   else
   {         
       short dccoff;
       dccoff=qdct[0]-dcdiff;
       int dcdifflen;
	   dcdifflen=codelen(dccoff);
       if(dccoff<0)
	   {
	   dccoff=dcdiff-qdct[0];
	   dccoff=~dccoff;
	   dccoff=dccoff<<(16-dcdifflen);
	   dccoff=dccoff>>(16-dcdifflen);
	   } 
	   dcdiff=qdct[0];
	     vlclen=dccodelen[dcdifflen];
	   	 cnl=dcdifflen+vlclen+vlccnt;
	     r3=dchuff[dcdifflen];
		 r3=r3>>(16-vlclen);
		 codeadd=(DWORD)r1;
		 codeadd=codeadd>>(8-vlccnt);
		 codeadd=codeadd<<vlclen;
		 codeadd=codeadd|(DWORD)r3;
		 codeadd=codeadd<<dcdifflen;
		 codeadd=codeadd|(DWORD)dccoff;
		 sw=(int)(cnl/8);
	     switch (sw)
		 {
		 case 3:  {DWORD uu=(DWORD)codeadd;
		    uu=uu<<(32-cnl);
			r2=(BYTE*)(&uu);
			r1=*(r2+3);
		    jpegadd(r1,&jpegdatecode);
			r1=*(r2+2);
            jpegadd(r1,&jpegdatecode);
			r1=*(r2+1);
            jpegadd(r1,&jpegdatecode);
			r1=*r2;
			vlccnt=cnl-24;  
			break;
				  }
		 case 2: {DWORD uu=(DWORD)codeadd;
		          uu=uu<<(24-cnl);
			      r2=(BYTE*)(&uu);
			      r1=*(r2+2);
		          jpegadd(r1,&jpegdatecode);
			      r1=*(r2+1);
                  jpegadd(r1,&jpegdatecode);
			      r1=*r2;
			     vlccnt=cnl-16; 
				 break;
				 }
		 case 1:{DWORD uu=(DWORD)codeadd;
	             uu=uu<<(16-cnl);
		         r2=(BYTE*)(&uu);
		         r1=*(r2+1);
                 jpegadd(r1,&jpegdatecode);
			     r1=*r2;
			     vlccnt=cnl-8;
				 break;
				}
		 case 0:{DWORD uu=(DWORD)codeadd;
		         uu=uu<<(8-cnl);
		         r2=(BYTE*)(&uu);
		         r1=*r2;
		         vlccnt=cnl;
				 break;
				}
		 }
                  
   }
  //kaisi ac xishu
   int lencodesize=lencode->GetSize();
   //int y16=0;
   int y=0;
while(y<lencodesize)
{         
	      int reg=lencode->GetAt(y);
		  if(reg==240)
		  {
          vlclen=accodelen[reg];
          r3=achuff[reg];
           cnl=11+vlccnt;
		  r3=r3>>(16-vlclen);
		 codeadd=(DWORD)r1;
		 codeadd=codeadd>>(8-vlccnt);
		 codeadd=codeadd<<vlclen;
		 codeadd=codeadd|(DWORD)r3;
		 //y16=1;
          //AfxMessageBox("连续16个0");
		  
		  y++;

		  
		  }
		  else
	{//foesle
		  int acmcl=reg&0x0f;//acmshuzichangdu
	      vlclen=accodelen[reg];
		  r3=achuff[reg];
           cnl=vlclen+vlccnt+acmcl;
		  r3=r3>>(16-vlclen);
		 codeadd=(DWORD)r1;
		 codeadd=codeadd>>(8-vlccnt);
		 codeadd=codeadd<<vlclen;
		 codeadd=codeadd|(DWORD)r3;
          if(reg!=0)
		  {
		 codeadd=codeadd<<acmcl;
		BYTE sign=lencode->GetAt(y+1);
		 BYTE lenbuf;
		  if(sign>=128)
		  {lenbuf=(BYTE)255-lencode->GetAt(y+1)+1;
		   lenbuf=(~lenbuf)&(0xff>>(8-acmcl));//可能有错
		  }
		  else
			lenbuf=sign;
	     codeadd=codeadd|(DWORD)lenbuf;
		  }
         y+=2;
		  }//foelse
         sw=(int)(cnl/8);
	     switch (sw)
		 {
		 case 3:  {DWORD uu=(DWORD)codeadd;
		    uu=uu<<(32-cnl);
			r2=(BYTE*)(&uu);
			r1=*(r2+3);
		    jpegadd(r1,&jpegdatecode);
			r1=*(r2+2);
            jpegadd(r1,&jpegdatecode);
			r1=*(r2+1);
            jpegadd(r1,&jpegdatecode);
			r1=*r2;
			vlccnt=cnl-24;  
			break;
				  }
		 case 2: {DWORD uu=(DWORD)codeadd;
		          uu=uu<<(24-cnl);
			      r2=(BYTE*)(&uu);
			      r1=*(r2+2);
		          jpegadd(r1,&jpegdatecode);
			      r1=*(r2+1);
                  jpegadd(r1,&jpegdatecode);
			      r1=*r2;
			     vlccnt=cnl-16; 
				 break;
				 }
		 case 1:{DWORD uu=(DWORD)codeadd;
	             uu=uu<<(16-cnl);
		         r2=(BYTE*)(&uu);
		         r1=*(r2+1);
                 jpegadd(r1,&jpegdatecode);
			     r1=*r2;
			     vlccnt=cnl-8;
				 break;
				}
		 case 0:{DWORD uu=(DWORD)codeadd;
		         uu=uu<<(8-cnl);
		         r2=(BYTE*)(&uu);
		         r1=*r2;
		         vlccnt=cnl;
				 break;
				}
           
		 }
                  
   }
/*if(y16==1)
{

	CString hu;
hu.Format("y=%d,lencodesize=%d",y,lencodesize);
		   
  AfxMessageBox(hu);
	
		
}*/
}//第二层循环 

} //最外层循环
jpegadd(r1,&jpegdatecode);
CByteArray*  jpegout=new CByteArray;
jpegout->Copy(jpegdatecode);
delete pdibbitc;
//delete lencode;
AfxMessageBox("编码结束");
return jpegout;
}


CByteArray* grayjpegencode(int width,int height,int widthbyte,int* pdibbit,double quality)
{
  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);
}
int linecnt=widthbyte;
//int* pdibbitc=new int[linecnt*height];
//for(int l=0;l<height;l++)
//{
//	for(int lrm=0;lrm<linecnt;lrm++)
   //{
	  // pdibbitc[linecnt*l+lrm]=pdibbit[(height-l-1)*linecnt+lrm];
   //}
//}
     
int* lpdibbit;
BYTE dccodelen[12];
WORD dchuff[12];
BYTE accodelen[251];
WORD achuff[251];
tableinit(dccodelen,dchuff,accodelen,achuff);
double pixsub[64];
CByteArray jpegdatecode;
jpegdatecode.RemoveAll();
   int i,j;
   i=0,j=0;
   BYTE r1;
   BYTE* r2;
   WORD r3;
   DWORD codeadd;//前缀加数值
   int  cnl; //总长度
   int vlccnt;
   int dcdiff=0;
for(j=0;j<height;j=j+8)
{   //最外层循环

 for(i=0;i<width;i=i+8)
{ //第二层循环 
	   for(int n=0;n<8;n++) //n wei hang
	  {//for1
        for(int m=0;m<8;m++) //m wei lei
		 { 
		   long i0=m+i;
           long j0=n+j;
		   lpdibbit=(int*)(pdibbit+linecnt*(height-1-j0)+i0);//mcu 单元抽取   
		    //lpdibbit=(int*)(pdibbitc+linecnt*j0+i0);
           pixsub[n*8+m]=(double)(*lpdibbit);
           
		}
   }

fdct_2D(pixsub,3,3);//dct变换
double* zigdct;
zigdct=zigscan(pixsub);//zscan;
int qdct[64];
 for(int u=0;u<64;u++)
 { 	    if(zigdct[u]>0) 
	  qdct[u]=(int)((zigdct[u]/qutable[u])+0.5);
       else
      qdct[u]=(int)((zigdct[u]/qutable[u])-0.5);
	   }

 
CByteArray* lencode;
lencode=zerolencode(qdct);
 

//开始熵编码

     
 
        
        int vlclen;
       

        int sw;
 if((i==0) &(j==0))
	   { //if1
	       
       short dccoff;
       dccoff=qdct[0]-dcdiff;
       int dcdifflen;
	   dcdifflen=codelen(dccoff);
       if(dccoff<0)
	   {
	   dccoff=dcdiff-qdct[0];
	   dccoff=~dccoff;
	   dccoff=dccoff<<(16-dcdifflen);
	   dccoff=dccoff>>(16-dcdifflen);
	   } 
	   dcdiff=qdct[0];
	     vlclen=dccodelen[dcdifflen];
	  	 cnl=dcdifflen+vlclen;
	     r3=dchuff[dcdifflen];
		 r3=r3>>(16-vlclen);
		 codeadd=(DWORD)r3;
		 codeadd=codeadd<<dcdifflen;
		 codeadd=codeadd|(DWORD)dccoff;
		 
          sw=(int)(cnl/8);
		  switch(sw)

⌨️ 快捷键说明

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