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

📄 jpegmath.cpp

📁 无线图象监控系统(用VC++编程)用数据库ACCESS存储图象
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 
#include "stdafx.h"
#include <string.h> 
#include <stdio.h> 
#include <math.h> 
#include "jpegmath.h"

#define PI 3.1415926
double *C=NULL;
double *temp_2D=NULL;
int bitrev(int bi,int deg)
{
	int j=1,temp=0,degnum,halfnum;
	degnum=deg;
	//if(deg<0) return 0;
	if(deg==0) return bi;
	halfnum=1<<(deg-1);
	while(halfnum)
	{
		if(halfnum&bi)
			temp+=j;
		j<<=1;
		halfnum>>=1;
	}
	return temp;	
}
BOOL fbitrev(double *f,int deg)
{    
	if(deg==1) return FALSE;
	int len=(1<<deg)-1;
	int i=1;
	int ii;
	double temp;
	while(i<len)
	{   ii=bitrev(i,deg); 
	if(ii>i)
	{  temp=f[ii];
		  f[ii]=f[i];
		  f[i]=temp;
	}
	i++;
	}
	return TRUE;
}

BOOL swap(double &a,double &b)
{
	double temp;
	temp=a;
	a=b;
	b=temp;
	return TRUE;
}
BOOL initDCTParam(int deg)
{
	int total,halftotal,i,group,endstart,factor;
	total=1<<deg;
	if(C!=NULL) delete []C;
	C=(double *)new double[total];
	halftotal=total>>1;
	for(i=0;i<halftotal;i++)
		C[total-i-1]=(double)(2*i+1);
	
	for(group=0;group<deg-1;group++)
	{ 
		endstart=1<<(deg-1-group);
		int len=endstart>>1;
		factor=1<<(group+1);
		for(int j=0;j<len;j++)
			C[endstart-j-1]=factor*C[total-j-1];
	}
	for(i=1;i<total;i++)
		C[i]=2.0*cos(C[i]*PI/(total<<1));	
	return TRUE;
}
BOOL dct_forward(double *f,int deg)
{
	int i_deg,i_halfwing,total,wing,wings,winglen,halfwing;
	double temp1,temp2;
	total=1<<deg;
	for(i_deg=0;i_deg<deg;i_deg++)
	{
		wings=1<<i_deg;
		winglen=total>>i_deg;
		halfwing=winglen>>1;
		for(wing=0;wing<wings;wing++)
		{
			for(i_halfwing=0;i_halfwing<halfwing;i_halfwing++)
			{
				temp1=f[wing*winglen+i_halfwing];
				temp2=f[(wing+1)*winglen-1-i_halfwing];
				if(wing%2)
					swap(temp1,temp2);
				f[wing*winglen+i_halfwing]=temp1+temp2;
				f[(wing+1)*winglen-1-i_halfwing]=(temp1-temp2)*C[winglen-1-i_halfwing];
			}
		}
	}
return TRUE;
}
BOOL idct_backward(double *F,int deg)
{
	int i_deg,i_halfwing,total,wing,wings,winglen,halfwing;
	double temp1,temp2;
	total=1<<deg;
	for(i_deg=deg-1;i_deg>=0;i_deg--)
	{
		wings=1<<i_deg;
		winglen=total>>i_deg;
		halfwing=winglen>>1;
		for(wing=0;wing<wings;wing++)
		{
			for(i_halfwing=0;i_halfwing<halfwing;i_halfwing++)
			{
				temp1=F[wing*winglen+i_halfwing];
				temp2=F[(wing+1)*winglen-1-i_halfwing]*C[winglen-1-i_halfwing];
                if(wing%2)
				{
					F[wing*winglen+i_halfwing]=(temp1-temp2)*0.5;
					F[(wing+1)*winglen-1-i_halfwing]=(temp1+temp2)*0.5;
				}
				else
				{
					F[wing*winglen+i_halfwing]=(temp1+temp2)*0.5;
					F[(wing+1)*winglen-1-i_halfwing]=(temp1-temp2)*0.5;
				}
				
			}
		}
	}
return TRUE;	
}
BOOL dct_backward(double *f,int deg)
{
	int total,i_deg,wing,wings,halfwing,winglen,i_halfwing,temp1,temp2;
    total=1<<deg;
	for(i_deg=deg-1;i_deg>=0;i_deg--)
	{
		wings=1<<i_deg;
		winglen=1<<(deg-i_deg);
		halfwing=winglen>>1;
		for(wing=0;wing<wings;wing++)
		{
			for(i_halfwing=0;i_halfwing<halfwing;i_halfwing++)
			{  //f[i_halfwing+wing*winglen]=f[i_halfwing+wing*winglen];
				if(i_halfwing==0)
					f[halfwing+wing*winglen+i_halfwing]=0.5*f[halfwing+wing*winglen+i_halfwing];
				else
				{
					temp1=bitrev(i_halfwing,deg-i_deg-1);
					temp2=bitrev(i_halfwing-1,deg-i_deg-1);
					f[halfwing+wing*winglen+temp1]=f[halfwing+wing*winglen+temp1]-f[halfwing+wing*winglen+temp2];
				}	
			}
		}
	}
return TRUE;
}
BOOL idct_forward(double *F,int deg)
{
	int total,i_deg,wing,wings,halfwing,winglen,i_halfwing,temp1,temp2;
    total=1<<deg;
	for(i_deg=0;i_deg<deg;i_deg++)
	{
		wings=1<<i_deg;
		winglen=1<<(deg-i_deg);
		halfwing=winglen>>1;
		for(wing=0;wing<wings;wing++)
		{
			for(i_halfwing=halfwing-1;i_halfwing>=0;i_halfwing--)
			{
				if(i_halfwing==0)
					F[halfwing+wing*winglen+i_halfwing]=2.0*F[halfwing+wing*winglen+i_halfwing];
				else
				{ 
					temp1=bitrev(i_halfwing,deg-i_deg-1);
					temp2=bitrev(i_halfwing-1,deg-i_deg-1);
					F[halfwing+wing*winglen+temp1]=F[halfwing+wing*winglen+temp1]+F[halfwing+wing*winglen+temp2];
				}
				
			}
		}
		
	}
return TRUE;	
} 
BOOL initIDCTParam(int deg)
{
	int total,halftotal,i,group,endstart,factor;
	total=1<<deg;
	if(C!=NULL) delete []C;
	C=(double *)new double[total];
	halftotal=total>>1;
	for(i=0;i<halftotal;i++)
		C[total-i-1]=(double)(2*i+1);
	
	for(group=0;group<deg-1;group++)
	{ 
		endstart=1<<(deg-1-group);
		int len=endstart>>1;
		factor=1<<(group+1);
		for(int j=0;j<len;j++)
			C[endstart-j-1]=factor*C[total-j-1];
	}
	for(i=1;i<total;i++)
		C[i]=1.0/(2.0*cos(C[i]*PI/(total<<1)));	
return TRUE;	
}
BOOL fidct_1D_no_param(double *F,int deg)
{
	initIDCTParam(deg);
	F[0]=F[0]*sqrt(2.0);
	fbitrev(F,deg);
	idct_forward(F,deg);
	idct_backward(F,deg);
return TRUE;	
}

BOOL fdct_1D_no_param(double *f,int deg)
{
	initDCTParam(deg);
	dct_forward(f,deg);
	dct_backward(f,deg);
	fbitrev(f,deg);
	f[0]=1/(sqrt(2.0))*f[0];
return TRUE;
}
BOOL fidct_1D(double *F,int deg)
{
	int total=1<<deg;
	double param=sqrt((double)total/2.0);
	for(int i=0;i<total;i++)
	{
		F[i]=param*F[i];
	}
	fidct_1D_no_param(F,deg);
return TRUE;
}
BOOL fdct_1D(double *f,int deg)
{
	fdct_1D_no_param(f,deg);
	int total=1<<deg;
	double param=sqrt(2.0/total);
	for(int i=0;i<total;i++)
		f[i]=param*f[i];
return TRUE;
}

BOOL init2D_Param(int rows,int cols)
{
	if(temp_2D!=NULL) delete[] temp_2D;
	temp_2D=(double *) new double[rows];
return TRUE;
}
BOOL fdct_2D(double *f,int deg_row,int deg_col)
{    
	
	int rows,cols,i_row,i_col;
	double	two_div_sqrtcolrow;
	rows=1<<deg_row;
	cols=1<<deg_col;
	init2D_Param(rows,cols);
	two_div_sqrtcolrow=2.0/(sqrt((double)(rows*cols)));
	
	for(i_row=0;i_row<rows;i_row++)
	{
		fdct_1D_no_param(f+i_row*cols,deg_col);
	}
	for(i_col=0;i_col<cols;i_col++)
	{
		for(i_row=0;i_row<rows;i_row++)
		{
			temp_2D[i_row]=f[i_row*cols+i_col];
		}
		fdct_1D_no_param(temp_2D,deg_row);
		for(i_row=0;i_row<rows;i_row++)
		{
			f[i_row*cols+i_col]=temp_2D[i_row]*two_div_sqrtcolrow;
		}
		
	}
return TRUE;	
}
BOOL fidct_2D(double *F,int deg_row,int deg_col)
{    
	
	int rows,cols,i_row,i_col;
	double	sqrtcolrow_div_two;
	rows=1<<deg_row;
	cols=1<<deg_col;
	init2D_Param(rows,cols);
	sqrtcolrow_div_two=(sqrt((double)(rows*cols)))/2.0;
	
	for(i_row=0;i_row<rows;i_row++)
	{
		fidct_1D_no_param(F+i_row*cols,deg_col);
	}
	for(i_col=0;i_col<cols;i_col++)
	{
		for(i_row=0;i_row<rows;i_row++)
		{
			temp_2D[i_row]=F[i_row*cols+i_col];
		}
		fidct_1D_no_param(temp_2D,deg_row);
		for(i_row=0;i_row<rows;i_row++)
		{
			F[i_row*cols+i_col]=temp_2D[i_row]*sqrtcolrow_div_two;
		}
		
	}
return TRUE;	
}
double* zigscan(double dctbit[64])
{
BOOL lc=TRUE;
int n,m;
double* zigdct=new double[64];
int zig;
zig=0;
int offset;
    for(int x=0;x<=7;x++)
	{
      if(lc)
      lc=FALSE;
       else
      lc=TRUE;

      if(lc)
	 {
	   for(n=0;n<=x;n++)
	   {  offset=8*n+x-n;//[n][x-n]
		   *(zigdct+zig)=*(dctbit+offset);
            zig=zig+1;
      
	   }  
   
	}
    else
	{ for(m=0;m<=x;m++)
	{ offset=8*(x-m)+m;
     *(zigdct+zig)=*(dctbit+offset);
     zig=zig+1;
     
	}
	}
	}
     int l=1;
   for( x=8;x<=14;x++)
   { 
	   
	   if(lc)
      lc=FALSE;
       else
      lc=TRUE;

	 if(lc)
	 {
	  for(n=l;n<=x-l;n++)
	  {offset=8*n+x-n;//[n][x-n]
		   *(zigdct+zig)=*(dctbit+offset);
	    zig=zig+1;
      
	  }
	 }
	 else
	 {
	  for(m=l;m<=x-l;m++)
	  { 
	  offset=8*(x-m)+m;
     *(zigdct+zig)=*(dctbit+offset);
	   zig=zig+1;
      
      }
	 }
	 l++;
    }

   //double* zigout;
	 //zigout=zigdct;
   return zigdct;
}

BOOL tableinit(BYTE dccodelen[12],WORD dchuff[12],BYTE accodelen[251],WORD achuff[251])
{
  
   BYTE dccode[12]={2,3,3,3,3,3,4,5,6,7,8,9};
	memcpy(dccodelen,dccode,12);
	WORD dchuffbef[12]={0x0000,0x4000,0x6000,0x8000,0xa000,0xc000,0xe000,0xf000,0xf800,0xfc00,0xfe00,0xff00};
	memcpy(dchuff,dchuffbef,10*sizeof(WORD));
	//accodelen[251];
	memset(accodelen,16,251);
    BYTE initial[9]={4,2,2,3,4,5,7,8,10};
    memcpy(accodelen,initial,9);
	accodelen[0x11]=4;
	accodelen[0x12]=5;
	accodelen[0x13]=7;
	accodelen[0x14]=9;
	accodelen[0x15]=11;
	accodelen[0x21]=5;
	accodelen[0x22]=8;
	accodelen[0x23]=10;
	accodelen[0x24]=12;
    //accodelen[0x25]=15;
	accodelen[0x31]=6;
	accodelen[0x32]=9;
	accodelen[0x33]=12;
	accodelen[0x41]=6;
	accodelen[0x42]=10;
	accodelen[0x51]=7;
	accodelen[0x52]=11;
	accodelen[0x61]=7;
	accodelen[0x62]=12;
	accodelen[0x71]=8;
	accodelen[0x72]=12;
	accodelen[0x81]=9;
    accodelen[0x82]=15;
	accodelen[0x91]=9;
	accodelen[0xa1]=9;
	accodelen[0xb1]=10;
    accodelen[0xc1]=10;
	accodelen[0xd1]=11;
    //accodelen[0xe1]=14;
	accodelen[0xf0]=11;
    //accodelen[0xf1]=15;
    //achuff[251];
	WORD achu[11]={0xa000,0x0000,0x4000,0x8000,0xb000,0xd000,0xf000,0xf800,0xfd80,0xff82,0xff83};
	memcpy(achuff,achu,11*sizeof(WORD));
    achuff[0x11]=0xc000;
	achuff[0x12]=0xd800;
	achuff[0x13]=0xf200;
	achuff[0x14]=0xfb00;
	achuff[0x15]=0xfec0;
	int add=0;
	int i;
	for(i=0x16;i<=0x1a;i++)
	{   add++;
		achuff[i]=0xff83+add;
	}
	achuff[0x21]=0xe000;
	achuff[0x22]=0xf900;
	achuff[0x23]=0xfdc0;
	achuff[0x24]=0xff40;
    //achuff[0x25]=0xff84;
	for(i=0x25;i<=0x2a;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0x31]=0xe800;
	achuff[0x32]=0xfb80;
	achuff[0x33]=0xff50;
	for(i=0x34;i<=0x3a;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0x41]=0xec00;
	achuff[0x42]=0xfe00;
	for(i=0x43;i<=0x4a;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0x51]=0xf400;
	achuff[0x52]=0xfee0;
    for(i=0x53;i<=0x5a;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
    achuff[0x61]=0xf600;
	achuff[0x62]=0xff60;
	for(i=0x63;i<=0x6a;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0x71]=0xfa00;
	achuff[0x72]=0xff70;
    for(i=0x73;i<=0x7a;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0x81]=0xfc00;
	achuff[0x82]=0xff80;
    for(i=0x83;i<=0x8a;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0x91]=0xfc80;
    for(i=0x92;i<=0x9a;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0xa1]=0xfd00;
    for(i=0xa2;i<=0xaa;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0xb1]=0xfe40;
    for(i=0xb2;i<=0xba;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
    achuff[0xc1]=0xfe80;
    for(i=0xc2;i<=0xca;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0xd1]=0xff00;
    for(i=0xd2;i<=0xda;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
      //achuff[0xe1]=0xff80;
    for(i=0xe1;i<=0xea;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
	achuff[0xf0]=0xff20;
	//achuff[0xf1]=0xff86;
     for(i=0xf1;i<=0xfa;i++)
	{add++;
		achuff[i]=0xff83+add;
	}
CString str;
   str="";
  for(int l=0; l<251;l++)
  {CString temp;
   temp.Format("%x ",achuff[l]);
   str=str+temp;
  }

⌨️ 快捷键说明

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