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

📄 fdctdlg.cpp

📁 这是一个可执行的基于DCT的压缩编码程序,希望对大家有所帮助!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				this->m_bHaveProcess=true;
				}
				
			}
			else
			{
				if(this->m_bHaveProcess)
				{
					this->m_status="另一进程正在运行中,请稍等!";
					UpdateData(false);
				}
				else
				{ this->m_status="进行快速DCT变换.......";
				UpdateData(false);
				info.col=m_col;
				info.row=m_row;
				info.m_bfinished=false;
				info.data=(double *)m_buffer;
				info.m_start=0;
				info.m_end=0;
				SetTimer(3,TIMEFREQ,NULL);
				AfxBeginThread(ThreadProcfastDct,&info);
				this->m_bHaveProcess=true;
				}
				
				
			}
		}
	}
}

void CFDCTDlg::OnIdct() 
{    
	// TODO: Add your control notification handler code here
	UpdateData(true);
	if(!this->m_loaded)
	{
		MessageBox("请先读入图像数据!");
		return;
		
	}
	else if(!this->m_bDCTed)
	{
		MessageBox("请先进行DCT变换!");
		return;
	}
	else
	{
		if(this->m_bIDCTed)
		{
			this->m_status="已经进行过IDCT变换!";
			UpdateData(false);
		}
		else{
			if(this->m_radio.GetCheck())
			{
				if(this->m_bHaveProcess)
				{
					this->m_status="另一进程正在运行中,请稍等!";
					UpdateData(false);
				}
				else
				{ this->m_status="进行普通IDCT变换.......";
				UpdateData(false);
				info.col=m_col;
				info.row=m_row;
				info.m_bfinished=false;
				info.data=(double *)m_buffer;
				info.m_start=0;
				info.m_end=0;
				SetTimer(4,TIMEFREQ,NULL);
				AfxBeginThread(ThreadProcOldIDct,&info);
				this->m_bHaveProcess=true;
				}
				
			}
			else
			{
				if(this->m_bHaveProcess)
				{
					this->m_status="另一进程正在运行中,请稍等!";
					UpdateData(false);
				}
				else
				{ this->m_status="进行快速IDCT变换.......";
				UpdateData(false);
				info.col=m_col;
				info.row=m_row;
				info.m_bfinished=false;
				info.data=(double *)m_buffer;
				info.m_start=0;
				info.m_end=0;
				SetTimer(5,TIMEFREQ,NULL);
				AfxBeginThread(ThreadProcfastIDct,&info);
				this->m_bHaveProcess=true;
				}
				
			}
		}
	}
}

void 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)));	
	
}

/* void fdct1(double *src,double *dst,int dg,int *deg)
{
if(*deg==1)
{
*dst=*src+*(src+1);
*(dst+1)=(*src-*(src+1))*cos(PI/4);
return;
}
else
{   
int len=1<<(*deg-dg);
for(int i=0;i<1<<(dg-1);i++)
*(dst+len*i)=*(dst+len*i)+*(dst+len*(1<<dg-i*len));
fdct1(src,dst,dg-1,deg);
for(i=0;i<1<<(dg-1);i++)
{
*(dst+len*i+1<<(deg-dg))=*(src+len*i+1<<(deg-dg))+*(src+len*(1<<dg-i*len)+1<<(deg-dg));
}
fdct1(src+1<<(deg-dg),dst+1<<(deg-dg),dg-1,deg);

  
	}
	
      
		}
		
*/
/* void oldDCT1(double *src,double *dst,int deg)
{

  int total=1<<deg;
  memset(dst,0,total*sizeof(double));
  for(int i=0;i<total;i++)
	 for(int j=0;j<total;j++)
	 {dst[i]+=src[j]*cos(PI/(2*total)*i*(2*j+1));}
	 // if(i==0)
	 //	 dst[i]=1/sqrt(2)*dst[i];
	 
	   
		 
}*/
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;	
}
void fbitrev(double *f,int deg)
{    
	if(deg==1) return;
	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++;
	}
}

void swap(double &a,double &b)
{
	double temp;
	temp=a;
	a=b;
	b=temp;
}
void 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));	
	
}
void 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];
			}
		}
	}
}
void 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;
				}
				
			}
		}
	}
	
}
void 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];
				}	
			}
		}
	}
}
void 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];
				}
				
			}
		}
		
	}
	
} 
void 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);
	
}

void 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];
}
void 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);
}
void 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];
}

void init2D_Param(int rows,int cols)
{
	if(temp_2D!=NULL) delete[] temp_2D;
	temp_2D=(double *) new double[rows];
}
void 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;
		}
		
	}
	
}
void 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;
		}
		
	}
	
}
void oldDCT(double *f,int row_deg,int col_deg)
{
	int u,v,x,y,cols,rows;
	
	
	cols=1<<col_deg;
	rows=1<<row_deg;
	double one_div_sqrtcolrow=1.0/sqrt((double)(cols*rows));
	double sqrt_two_colrow=sqrt(2.0/(cols*rows));
	double  two_div_sqrtcolrow=2.0/(sqrt((double)cols*rows));
	
	double *temp=(double *)malloc(cols*rows*sizeof(double));
	if(temp==NULL)
	{
		return;
	}
	memcpy(temp,f,cols*rows*sizeof(double));
	memset(f,0,cols*rows*sizeof(double));
	for( u=0;u<rows;u++)
		for( v=0;v<cols;v++)
		{      for( x=0;x<rows;x++)
		for( y=0;y<cols;y++)
		{
			f[u*cols+v]+=temp[x*cols+y]*cos((2*x+1)*u*PI/(2*cols))*cos((2*y+1)*v*PI/(2*rows));
		}
		
		if(u==0 && v==0)
			f[u*cols+v]=one_div_sqrtcolrow*f[u*cols+v];
		else if(v!=0 || u!=0)
			f[u*cols+v]=sqrt_two_colrow*f[u*cols+v];
		else 
			f[u*cols+v]=two_div_sqrtcolrow*f[u*cols+v];
		//f[u*cols+v]=four_div_colrow*f[u*cols+v];
		}
		delete temp;
}
void oldIDCT(double *F,int row_deg, int col_deg)
{
	int u,v,x,y,rows,cols;
	rows=1<<row_deg;
	cols=1<<col_deg;
	double one_div_sqrtcolrow=1.0/sqrt((double)cols*rows);
	double sqrt_two_colrow=sqrt(2.0/(cols*rows));
	double  two_div_sqrtcolrow=2.0/(sqrt((double)cols*rows));
	double *temp=(double *)malloc(cols*rows*sizeof(double));
	if(temp==NULL)
	{
		return;
	}
	memcpy(temp,F,cols*rows*sizeof(double));
	memset(F,0,cols*rows*sizeof(double));
	for( x=0;x<cols;x++)
		for( y=0;y<rows;y++)
			for( u=0;u<cols;u++)
				for( v=0;v<rows;v++)
				{ 
					if(u==0 && v==0)
						F[x*rows+y]+=one_div_sqrtcolrow*temp[u*rows+v]*cos((2*x+1)*u*PI/(2*cols))*cos((2*y+1)*v*PI/(2*rows));
                    else if(u==0 || v==0)
						F[x*rows+y]+=sqrt_two_colrow*temp[u*rows+v]*cos((2*x+1)*u*PI/(2*cols))*cos((2*y+1)*v*PI/(2*rows));
					else F[x*rows+y]+=two_div_sqrtcolrow*temp[u*rows+v]*cos((2*x+1)*u*PI/(2*cols))*cos((2*y+1)*v*PI/(2*rows));
				}
}
int GetTwoIndex(int num)
{
	int temp=0;
	if(num<=0) return -1;
	while(1<<temp<num)
		temp++;
	return temp;
	
	
}
UINT ThreadProcOldDct(LPVOID pParam)
{
	RUNINFO *pinfo=(RUNINFO*)pParam;
	pinfo->m_start=::GetTickCount();
	oldDCT((double *)pinfo->data,GetTwoIndex(pinfo->row),GetTwoIndex(pinfo->col));
	pinfo->m_end=::GetTickCount();
	WriteFile("普通DCT变换后的数据.txt",pinfo->row,pinfo->col,(double *)pinfo->data);
	pinfo->m_bfinished=true;
	return 1;
	
}
UINT ThreadProcfastDct(LPVOID pParam)
{
	RUNINFO *pinfo=(RUNINFO*)pParam;
	
	pinfo->m_start=::GetTickCount();
	fdct_2D((double *)pinfo->data,GetTwoIndex(pinfo->row),GetTwoIndex(pinfo->col));
	pinfo->m_end=::GetTickCount();
	WriteFile("快速DCT变换后的数据.txt",pinfo->row,pinfo->col,(double *)pinfo->data);
	pinfo->m_bfinished=true;
	return 1;
}
UINT ThreadProcOldIDct(LPVOID pParam)
{
	RUNINFO *pinfo=(RUNINFO*)pParam;
	pinfo->m_start=::GetTickCount();
	oldIDCT((double *)pinfo->data,GetTwoIndex(pinfo->row),GetTwoIndex(pinfo->col));
	pinfo->m_end=::GetTickCount();
	WriteFile("普通IDCT变换后的数据.txt",pinfo->row,pinfo->col,(double *)pinfo->data);
	pinfo->m_bfinished=true;
	return 1;
	
}
UINT ThreadProcfastIDct(LPVOID pParam)
{
	
	RUNINFO *pinfo=(RUNINFO*)pParam;
	pinfo->m_start=::GetTickCount();
	fidct_2D((double *)pinfo->data,GetTwoIndex(pinfo->row),GetTwoIndex(pinfo->col));
	pinfo->m_end=::GetTickCount();
	WriteFile("快速IDCT变换后的数据.txt",pinfo->row,pinfo->col,(double *)pinfo->data);
	pinfo->m_bfinished=true;
	return 1;
}






⌨️ 快捷键说明

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