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

📄 infohidedoc.cpp

📁 基于混沌系统的图像加密算法
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	ih=var_i;jh=var_j;th=var_t;
	bh[(ih*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[((--ih)*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[(ih*m_size.cx+(++jh))*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[((++ih)*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];

	ih=var_i;jh=var_j;th=var_t;
	bh[(ih*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[((--ih)*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[(ih*m_size.cx+(++jh))*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[((++ih)*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	}
	else{
	fh1(step/2);
	ih--; fh2(step/2);
	jh++; fh2(step/2);
	ih++; fh4(step/2);
	}
}

void CInfoHideDoc::fh3(int step)//HILBERT逆变换方向三
{
	int var_i,var_j,var_t;
	var_i=ih;var_j=jh;var_t=th;
	if(step==2){
	bh[(ih*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[((++ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[(ih*m_size.cx+(--jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[((--ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];

	ih=var_i;jh=var_j;th=var_t;
	bh[(ih*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[((++ih)*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[(ih*m_size.cx+(--jh))*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[((--ih)*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];

	ih=var_i;jh=var_j;th=var_t;
	bh[(ih*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[((++ih)*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[(ih*m_size.cx+(--jh))*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[((--ih)*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	}
	else{
	fh4(step/2);
	ih++; fh3(step/2);
	jh--; fh3(step/2);
	ih--; fh1(step/2);
	}
}

void CInfoHideDoc::fh4(int step)//HILBERT逆变换方向四
{
	int var_i,var_j,var_t;
	var_i=ih;var_j=jh;var_t=th;
	if(step==2){
	bh[(ih*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[(ih*m_size.cx+(--jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[((++ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[(ih*m_size.cx+(++jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];

	ih=var_i;jh=var_j;th=var_t;
	bh[(ih*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[(ih*m_size.cx+(--jh))*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[((++ih)*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[(ih*m_size.cx+(++jh))*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];

	ih=var_i;jh=var_j;th=var_t;
	bh[(ih*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[(ih*m_size.cx+(--jh))*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[((++ih)*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[(ih*m_size.cx+(++jh))*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	}
	else{
	fh3(step/2);
	jh--; fh4(step/2);
	ih++; fh4(step/2);
	jh++; fh2(step/2);
	}
}
/***************************************************************
*ProcessName:余弦变换正变换
***************************************************************/
void CInfoHideDoc::OnDctZ() 
{
	// TODO: Add your command handler code here
	float *C;
	unsigned int *L;
	float *x; 
	int N,m,k1,k2;
	float max,min,scale;
	N=m_size.cy;
	max=0.0;
	min=1000;

	BiaoZh();
		
	m=(int)((log10(N))/(log10(2)));
	C=(float*)malloc((N-1)*sizeof(float));
	x=(float*)malloc(N*sizeof(float));
	L=(unsigned int*)malloc(N*sizeof(unsigned));
		
	bit_reversal(L,m,N);
	WTS(C,m,N);
		
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k1*N+k2)*3];
		}
		FCT(x,L,C,m,N);
			
		for(k2=0;k2<N;k2++)
		{
			Datas[(k1*N+k2)*3]=x[k2];
		}
	}
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k1*N+k2)*3+1];
		}
		FCT(x,L,C,m,N);
		
		for(k2=0;k2<N;k2++)
		{
			Datas[(k1*N+k2)*3+1]=x[k2];
		}
	}
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k1*N+k2)*3+2];
		}
		FCT(x,L,C,m,N);
		
		for(k2=0;k2<N;k2++)
		{
			Datas[(k1*N+k2)*3+2]=x[k2];
		}
	}
		
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k2*N+k1)*3];
		}
		FCT(x,L,C,m,N);
		for(k2=0;k2<N;k2++)
		{
			Datas[(k2*N+k1)*3]=x[k2];
		}	
	}
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k2*N+k1)*3+1];
		}
		FCT(x,L,C,m,N);
		for(k2=0;k2<N;k2++)
		{
			Datas[(k2*N+k1)*3+1]=x[k2];
		}	
	}
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k2*N+k1)*3+2];
		}
		FCT(x,L,C,m,N);
		for(k2=0;k2<N;k2++)
		{
			Datas[(k2*N+k1)*3+2]=x[k2];
		}	
	}
		
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			DataR[(k1*N+k2)*3]=(float)(log10(1+fabs(Datas[(k1*N+k2)*3])));
			float  temp=DataR[(k1*N+k2)*3];
			if( temp>max)
				max=temp;
			if(temp<min)
				min =temp;

			DataR[(k1*N+k2)*3+1]=(float)(log10(1+fabs(Datas[(k1*N+k2)*3+1])));
			temp=DataR[(k1*N+k2)*3+1];
			if( temp>max)
				max=temp;
			if(temp<min)
				min =temp;

			DataR[(k1*N+k2)*3+2]=(float)(log10(1+fabs(Datas[(k1*N+k2)*3+2])));
			temp=DataR[(k1*N+k2)*3+2];
			if( temp>max)
				max=temp;
			if(temp<min)
				min =temp;
		}
	}
	       
	scale=(float)(255.0/(max-min));
		   
	for(k1=0;k1<RNw;k1++)
	{		
		for(k2=0;k2<RNh;k2++)
		{
			SetXY(k1,k2,(BYTE)((DataR[(k1*RNw+k2)*3]-min)*scale),0);
			SetXY(k1,k2,(BYTE)((DataR[(k1*RNw+k2)*3+1]-min)*scale),1);
			SetXY(k1,k2,(BYTE)((DataR[(k1*RNw+k2)*3+2]-min)*scale),2);
		}
	}
	
	UpdateAllViews(NULL);
	SetModifiedFlag();
	free(x);
	free(C);	
	free(L);
}
/***************************************************************
*ProcessName:余弦变换逆变换
***************************************************************/
void CInfoHideDoc::OnDctN() 
{
	// TODO: Add your command handler code here
	float*C;
	float*x;
	unsigned int*L;
	int N,m,k1,k2;
	N=m_size.cy;
	m=(int)((log10(N))/(log10(2)));
	C=(float*)malloc((N-1)*sizeof(float));
	x=(float*)malloc(N*sizeof(float));
	L=(unsigned int*)malloc(N*sizeof(unsigned int));
	bit_reversal(L,m,N);
	WTSINV(C,m,N);
	
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k2*N+k1)*3];
		}
		IFCT(x,L,C,m,N);
		
		for(k2=0;k2<N;k2++)
		{
			Datas[(k2*N+k1)*3]=x[k2];
		}
	}
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k2*N+k1)*3+1];
		}
		IFCT(x,L,C,m,N);
		
		for(k2=0;k2<N;k2++)
		{
			Datas[(k2*N+k1)*3+1]=x[k2];
		}
	}
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k2*N+k1)*3+2];
		}
		IFCT(x,L,C,m,N);
		
		for(k2=0;k2<N;k2++)
		{
			Datas[(k2*N+k1)*3+2]=x[k2];
		}
	}
	
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k1*N+k2)*3];
		}
		IFCT(x,L,C,m,N);
		for(k2=0;k2<N;k2++)
		{
			Datas[(k1*N+k2)*3]=x[k2];
		}	
	}
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k1*N+k2)*3+1];
		}
		IFCT(x,L,C,m,N);
		for(k2=0;k2<N;k2++)
		{
			Datas[(k1*N+k2)*3+1]=x[k2];
		}	
	}
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
			x[k2]=Datas[(k1*N+k2)*3+2];
		}
		IFCT(x,L,C,m,N);
		for(k2=0;k2<N;k2++)
		{
			Datas[(k1*N+k2)*3+2]=x[k2];
		}	
	}
	
	for(k1=0;k1<N;k1++)
	{		
		for(k2=0;k2<N;k2++)
		{
			SetXY(k1,k2,(BYTE)(Datas[(k1*N+k2)*3]),0);
			SetXY(k1,k2,(BYTE)(Datas[(k1*N+k2)*3+1]),1);
			SetXY(k1,k2,(BYTE)(Datas[(k1*N+k2)*3+2]),2);
		}
	}
	
	UpdateAllViews(NULL);
	SetModifiedFlag();
	free(x);
	free(C);	
	free(L);
}

void CInfoHideDoc::BiaoZh()
{
	Datas=new float[m_size.cx*m_size.cy*3];
	DataR=new float[m_size.cx*m_size.cy*3];
	int temp,i,j;
	RNw=m_size.cx;
	RNh=m_size.cy;
	if(RNw>800||RNh>800)
		AfxMessageBox("图象范围超出800,不能处理!");
	
	temp=RNw%8;
	if(temp!=0)Nw=RNw+(8-temp);
	else Nw=RNw;

	temp=RNh%8;

    if(temp!=0)Nh=RNh+(8-temp);
	else Nh=RNh;
	
	for(i=0;i<RNw;i++)
		for(j=0;j<RNh;j++)
		{
			Datas[(i*RNw+j)*3]=(float)GetXY(i,j,0);
			Datas[(i*RNw+j)*3+1]=(float)GetXY(i,j,1);
			Datas[(i*RNw+j)*3+2]=(float)GetXY(i,j,2);
		}
		
	for(i=RNw;i<Nw;i++)
		for(j=0;j<Nh;j++)
		{
			Datas[(i*Nw+j)*3]=0;
			Datas[(i*Nw+j)*3+1]=0;
			Datas[(i*Nw+j)*3+2]=0;
		}
	for(i=0;i<Nw;i++)
		for(j=RNh;j<Nh;j++)
		{
			Datas[(i*Nw+j)*3]=0;
			Datas[(i*Nw+j)*3+1]=0;
			Datas[(i*Nw+j)*3+2]=0;
		}
}

BYTE CInfoHideDoc::GetXY(int x, int y,int space)
{
	y=m_size.cy-y-1;
	return lpbits[(y*m_size.cy+x)*3+space];
}

void CInfoHideDoc::bit_reversal(unsigned int *L, int m, int N)
{
	int MASK,C,A,i,j,k;
	for(k=0;k<N;k++)
	{
		MASK=1;
		C=0;
		for(i=0,j=m-1;i<m;i++,j--)
		{
			A=(k&MASK)>>i;
			A<<=j;
			C|=A;
			MASK<<=1;
			
		}
		L[k]=C;
	}
}

void CInfoHideDoc::WTS(float *C, int m, int N)
{
	int NK1,NK2,i,iter,k;
	double  PI;
	PI=3.14159;
	NK1=N>>1;
	NK2=N<<1;
	k=0;
	for(iter=0;iter<m;iter++)
	{
		for(i=0;i<NK1;i++)
		{
			C[k]=(float)(cos(  PI*(4*i+1) /(float)NK2 )  );
			k++;
		}
		NK1>>=1;
		NK2>>=1;
		
	}
	for(i=0;i<k-1;i++)
	{
		C[i]*=2.0;
	}
}

void CInfoHideDoc::FCT(float *x, unsigned int *L, float *C, int m, int N)
{
	int NK1,NK2,i,j,k,kk,ip,incr,L1,k1,k2,iter;
	float T;
	NK1=N>>1;
	T=x[2];
	x[2]=x[1];
	x[1]=T;
	k1=2;
	k2=4;
	for(i=1;i<(NK1-1);i++)
	{
		T=x[k2];
		for(j=0;j<=(k2-k1);j++)
		{
			x[k2-j]=x[k2-j-1];
		}
		x[k1]=T;
		k1++;
		k2+=2;
		
	}
	NK2=N-1;
	for(i=0;i<(NK1>>1);i++)
	{
		T=x[NK2-i];
		x[NK2-i]=x[NK1+i];
		x[NK1+i]=T;
	}
	
	ip=NK1;
	kk=0;
	incr=N;
	for(iter=0;iter<m;iter++)
	{
		for(k=0;k<ip;k++)
		{
			for(j=k;j<N;j+=incr)
			{
				i=j+ip;
				T=x[j];
				x[j]=T+x[i];
				x[i]=T-x[i];
				x[i]*=C[kk];
			}
			kk++;
		}
		ip>>=1;
		incr>>=1;
		
	}
	for(i=0;i<(N-1);i++)
	{
		if(i<=(int)L[i])
			continue;
		else
		{
			T=x[i];
			x[i]=x[L[i]];
			x[L[i]]=T;
		}
	}
	for(i=1;i<NK1;i++)	
		x[i]*=0.5;
	NK1=(N>>2);	
	NK2=(N>>1);
	kk=1;
	for(iter=1;iter<m;iter++)
	{
		kk<<=1;
		L1=kk-1;
		for(k=1;k<=L1;k++)
			for(i=0;i<NK1;i++)
				x[NK1+NK2*k+i]=x[NK1+NK2*k+i]-x[NK1+NK2*(k-1)+i];
			NK1>>=1;
			NK2>>=1;
	}
	x[0]=x[0]/(float)sqrt(N);
	for(i=1;i<N;i++)
		x[i]=(float)(x[i]*1.414/(float)sqrt(N));
}

void CInfoHideDoc::SetXY(int x, int y, BYTE val,int space)

⌨️ 快捷键说明

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