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

📄 数字水印技术doc.cpp

📁 基于变换域的信息隐藏技术
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    input[2][1]=output[6]; 
    input[3][1]=output[7];
    input[0][2]=output[8];
    input[1][2]=output[9]; 
    input[0][3]=output[10]; 
    input[1][3]=output[11];
    input[2][2]=output[12];
    input[3][2]=output[13]; 
    input[2][3]=output[14]; 
    input[3][3]=output[15];
    input[4][0]=output[16];
    input[5][0]=output[17]; 
    input[4][1]=output[18]; 
    input[5][1]=output[19];
    input[6][0]=output[20];
    input[7][0]=output[21]; 
    input[6][1]=output[22]; 
    input[7][1]=output[23];
    input[4][2]=output[24];
    input[5][2]=output[25]; 
    input[4][3]=output[26]; 
    input[5][3]=output[27];
    input[6][2]=output[28];
    input[7][2]=output[29]; 
    input[6][3]=output[30]; 
    input[7][3]=output[31];
    input[0][4]=output[32];
    input[1][4]=output[33]; 
    input[0][5]=output[34]; 
    input[1][5]=output[35];
    input[2][4]=output[36];
    input[3][4]=output[37]; 
    input[2][5]=output[38]; 
    input[3][5]=output[39];
    input[0][6]=output[40];
    input[1][6]=output[41]; 
    input[0][7]=output[42]; 
    input[1][7]=output[43];
    input[2][6]=output[44];
    input[3][6]=output[45]; 
    input[2][7]=output[46]; 
    input[3][7]=output[47];
    input[4][4]=output[48];
    input[5][4]=output[49]; 
    input[4][5]=output[50]; 
    input[5][5]=output[51];
    input[6][4]=output[52];
    input[7][4]=output[53]; 
    input[6][5]=output[54]; 
    input[7][5]=output[55];
    input[4][6]=output[56];
    input[5][6]=output[57]; 
    input[4][7]=output[58]; 
    input[5][7]=output[59];
    input[6][6]=output[60];
    input[7][6]=output[61]; 
    input[6][7]=output[62]; 
    input[7][7]=output[63];
}





void CDCTDoc::OnVshow() 
{
	// TODO: Add your command handler code here
		for(int i=0;i<8;i++)
		for(int j=0;j<8;j++)   
			ShowData[i][j]=(int)DataR[m_x+i][m_y+j];
		aa=1;	
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CDCTDoc::OnHy() 
{
	// TODO: Add your command handler code here
		for(int i=0;i<8;i++)
		for(int j=0;j<8;j++)   
			ShowData[i][j]=(int)Datas[m_x+i][m_y+j];
		aa=1;	
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CDCTDoc::OnImageDCT() 
{
	// TODO: Add your command handler code here
	float*C;
	unsigned int*L;
	float*x; 
	int N,i,j,m,k1,k2;
	float max,min,scale;
	N=256;
	max=0.0;
	min=1000;
	BiaoZh();
	for( i=0;i<8;i++)
		for( j=0;j<8;j++)
          ShowFData[i][j]=(float)GetXY(m_x+i,m_y+j);
   
	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][k2];
		}
	  FCT(x,L,C,m,N);
	
       for(k2=0;k2<N;k2++)
	   {
		  Datas[k1][k2]=x[k2];
		}
	}

     for(k1=0;k1<N;k1++)
	 {
		for(k2=0;k2<N;k2++)
		{
			
		   x[k2]=Datas[k2][k1];
			
		}
        FCT(x,L,C,m,N);
        for(k2=0;k2<N;k2++)
		{
		   Datas[k2][k1]=x[k2];
			
		 }	
	
	}


	   for(k1=0;k1<N;k1++)
	   {
		   for(k2=0;k2<N;k2++)
		   {
		      DataR[k1][k2]=(float)(log10(1+fabs(Datas[k1][k2])));
			 float  temp=DataR[k1][k2];
					   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++)
			
			{
			 FDATA[k1][k2]=Datas[k1][k2];
			}
		}
////////////////////////           

		   for(k1=0;k1<RNw;k1++)
		   {		
			for(k2=0;k2<RNh;k2++)
			
			{
				SetXY(k1,k2,(BYTE)((DataR[k1][k2]-min)*scale));
			}
		}
    for(i=0;i<RNw;i++)
		for(j=0;j<RNh;j++)
		{
			if((int)Datas[i][j]>Max)
				Max=(int)Datas[i][j];
            if((int)Datas[i][j]<Min)
				Min=(int)Datas[i][j];
		}

 
    aa=2;
	UpdateAllViews(NULL);
	SetModifiedFlag();
	free(x);
	free(C);	
	free(L);
		

	
}

void CDCTDoc::OnImageIDCT() 
{
	// TODO: Add your command handler code here
	float*C;
	float*x;
	unsigned int*L;
	 
	int N,m,k1,k2;
	
 	N=256;
	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][k1];
		}
		 IFCT(x,L,C,m,N);
	
         for(k2=0;k2<N;k2++)
		{
		   Datas[k2][k1]=x[k2];
		 }
	 }

	  for(k1=0;k1<N;k1++)
	{
		 for(k2=0;k2<N;k2++)
		{
			
		   x[k2]=Datas[k1][k2];
			
		 }
         IFCT(x,L,C,m,N);
         for(k2=0;k2<N;k2++)
		 {
			  Datas[k1][k2]=x[k2];
			
		  }	
	
		}

	  ////////////
		for(k1=0;k1<RNw;k1++)
		   {		
			for(k2=0;k2<RNh;k2++)
			
			{
			  FDATA[k1][k2]=Datas[k1][k2];
			}
		}
	  ////////////
	for(k1=0;k1<RNw;k1++)
		{		
			for(k2=0;k2<RNh;k2++)
			
			{
				SetXY(k1,k2,(BYTE)(Datas[k1][k2]));
			}
		}
	Max=255;
	UpdateAllViews(NULL);
	SetModifiedFlag();
	free(x);
	free(C);	
	free(L);
				
}
void CDCTDoc::OnSuijishu() 
{
	// TODO: Add your command handler code here
	int i,j,k=0;
	float *point=new float[16*16]; 

	point=take_m(DataR,m_size.cx,8);
    for(i=0;i<8;i++)
		for(j=0;j<8;j++)
			middle[i][j]=point[k++];
	input2(DataR,point,make(Water_SuiJi),m_size.cx,8);
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{

		FDATA[i][j]=(float)(DataR[i][j]*DataR[i][j]+DataI[i][j]*DataI[i][j]);
		Datas[i][j]=(float)(sqrt(pow((float)sqrt(DataR[i][j]*DataR[i][j]+DataI[i][j]*DataI[i][j]),2)+1));
		
		}
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			SetXY(i,j,(BYTE)Datas[i][j]);
		}
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

int CDCTDoc::getbit(int m, int n)
{
	return ((m>>n)&1);
}

int * CDCTDoc::make(int *t)
{
	/////在输入的8个整数后,生成一个8*8的矩阵
   int *temp=new int[16*16];
   int i,j,n=0,p;
   for(i=0;i<8;i++)
   {
	   p=7;
	   for(j=0;j< 8;j++)
	   {
		   temp[i*8+j]=getbit(t[n],p);
		   p--;
	   }
	   n++;
   }
   return temp;
}

void CDCTDoc::input2(float src[][800], float *opt, int *water, int N, int n)
{
	CDLG_CONTROL ctrl;
	CString str;
	int t_x,t_y,t_n,i,j;
    int p=0;
////基于FFT变换(中心在原点)N*N 阵中作相应的变换后,并放回 n*n 阵
	t_x=(N-n)/2;
	t_y=t_x;
    t_n=t_x+n-1;


	if(ctrl.DoModal()==IDOK)
	{
       for(i=t_x;i<=t_n;i++)
		for(j=t_y;j<=t_n;j++)
		{
			masksize[i][j]=(ctrl.m_fsuiji*water[p])*(ctrl.m_fsuiji*water[p]);
	    	src[i][j] =opt[p]+ctrl.m_fsuiji*water[p];
			p++;
		} 
	}
}

float *CDCTDoc::take_m(float t[][800], long N, long n)
{
	////基于FFT变换(中心在原点)N*N 阵中提取 n*n 阵
	int t_x,t_y,t_n,i,j;
	float *temp=new float[n*n];
    int p=0;

	t_x=(N-n)/2;
	t_y=t_x;
    t_n=t_x+n-1;
	

	for(i=t_x;i<=t_n;i++)
		for(j=t_y;j<=t_n;j++)
		{
			temp[p++]=t[i][j];
		} 
   return temp;
}

void CDCTDoc::OnOpenfileTxt() 
{
	// TODO: Add your command handler code here
	LPCTSTR filename;
	CfileOpen filedlg;
	CFile fp;
	DWORD dwfilelength;
    CXIANSHIDLG show;
	int ID=filedlg.DoModal();
	if(ID==IDOK)
	{
		filename=filedlg.m_sfilename;
        fp.Open(filename,CFile::modeRead);//typeBinary);
		dwfilelength=fp.GetLength();
		char *str=new char[dwfilelength];
        str[dwfilelength]='\0';
		fp.SeekToBegin();
		fp.Read(str,dwfilelength);
		m_sstring.Format("%d",fp.GetLength());	
        show.m_sshow.Format("%s",str);
		

		show.DoModal();

	}
        UpdateAllViews(NULL);
	
}

void CDCTDoc::OnMagic() 
{
	// TODO: Add your command handler code here
	CString str;
	str.Format("本图像的大小为:%d * %d ",m_size.cx,m_size.cy);
	AfxMessageBox(str);
	int *tp=new int[m_size.cx*m_size.cy];
	int i,j;
	huanfang2();
	CMAGIC_DLG can;
	if(can.DoModal()==IDOK)
	{
	   for(i=0;i<=can.m_i_n;i++)
		zhiluan(Datas); 
        
	for(i=0;i<MM;i++)
		for(j=0;j<MM;j++)
		{
            SetXY(i,j,(BYTE)Datas[i][j]);
		}
    UpdateAllViews(NULL);
	SetModifiedFlag();
	}

}
void CDCTDoc::huanfang2()
{
    int s[MM][MM];
    int j,i,l;
	i=0;
	j=((MM+1)/2)-1;
	s[i][j]=1;  //数1放在第一行的正中位置//
	for(l=2;l<=MM*MM;l++)
	{ if((l-1)% MM ==0)
	    i=i+1;
	  else
	    {if(i==0)
		  i=MM-1;
		  else 
		  i=i-1;
         if(j==MM-1)
		  j=0;
		  else
		  j=j+1;
         }
       s[i][j]=l;
     }


	for(i=0;i<MM;i++)
	  for(j=0;j<MM;j++)
	  {
	    local[i][j]=s[i][j];
        locel[i][j]=s[i][j];
	 }
}

void CDCTDoc::zhiluan(float w[][800])
{
  float *x=new float[m_size.cx*m_size.cy];
  int i,num=0,j,m,k=0; 

  for(i=0;i<MM;i++)
	{
	  for(j=0;j<MM;j++)
        x[num++]=w[i][j];
         
  }

	for(i=0;i<MM;i++)
	 for(j=0;j<MM;j++)
	 {
        m=local[i][j];
	    w[i][j]=x[m-1];
	    local[i][j]=m-1;
	    if((m-1)==0)
	    local[i][j]=MM*MM;
	 }


}

void CDCTDoc::OnGray() 
{
	// TODO: Add your command handler code here
	float *temp=new float[m_size.cx*m_size.cy];
	int i,j,flag;
	CGRAY_CANDLG can;

	for(i=0;i<m_size.cx;i++)
		for(j=0;j<m_size.cy;j++)
		{
			temp[i*m_size.cx+j]=Datas[i][j];
		}
 if(can.DoModal()==IDOK)
 { 
	 
	 for(i=0;i<m_size.cx;i++)
		for(j=0;j<m_size.cy;j++)
		{
			flag=gray(i*m_size.cx+j);
            Datas[i][j]=temp[flag];
		}
 }
	 for(i=0;i<m_size.cx;i++)
		for(j=0;j<m_size.cy;j++)
		{
			SetXY(i,j,(BYTE)Datas[i][j]);
		}
	delete[]temp;
	CFANHR hairong;
	hairong.DoModal();
    UpdateAllViews(NULL);
	SetModifiedFlag();
	
}
void CDCTDoc::chengjuzhen(long x[][3],long y[3][1],long sum[3][1])
	{	long m,f,temp;
//得到结果矩阵(外循环)
	   for(m=0;m<3;m++)
   //每一行先乘后加(内循环)
	   {sum[m][0]=0;	
		   for(f=0;f<3;f++)
	        {	temp=x[m][f]*y[f][0];	  
				sum[m][0]=sum[m][0]+temp;
		   }	          
	   }
	}


//q进制的位操作
void CDCTDoc::bit(long s,long b[3][1])
{
	long i;
//输入一个十进制数

 for(i=(3-1);i>=0;i--)
 {
	 if((s%16)!=0)
	 {
		 b[i][0]=(s%16);
		 s=s/16;
	 }
	 else
	 {
		 b[i][0]=0;
		 s=s/16;
	 }
 }

}

	 
//反位操作函数
long CDCTDoc::ibit(long d[3][1])
{
	long i,sum,temp;
    sum=0;
    for(i=0;i<3;i++)
	{ 
		temp=d[i][0]*(long)pow(16,(3-i-1));
		sum=temp+sum;
	}
	return sum;
}


long CDCTDoc::gray(int flag)
{
 long a[3][3],zzjg[3][1],zjjg[3][1];
 long i,j,u[3][1],q1=0;//,u1;//,g(u);
//变换矩阵赋值
   for(i=0;i<3;i++)
	 for(j=0;j<3;j++)
		 a[i][j]=0;
   for(i=0;i<3;i++)
	{ j=i;
      a[i][j]=1;
   }
   for(i=1;i<3;i++)
   {  j=i-1;
     a[i][j]=1;}
//输出矩阵

	bit(flag,u);

//调用相乘子函数
    chengjuzhen(a,u,zjjg);

//异或
	for(i=0;i<3;i++)
	{  zzjg[i][0]=zjjg[i][0]%16;
	}    
//用逆位操作将二进制结果还原
    return ibit(zzjg);
}

void CDCTDoc::OnFenpin() 
{
	// TODO: Add your command handler code here
AfxMessageBox("我们将强化高频部分,\n目的是表明我们能够将高频部分区分出来,\n在8*8DCT中进行。");
	int lianghua[][8]={
		{16,11,10,16,24,40,51,61},
		{12,12,14,19,26,58,60,55},
		{14,13,16,24,40,57,69,56},
		{14,17,22,29,51,87,80,62},
		{18,22,37,56,68,109,103,77},
		{24,35,55,64,81,104,113,92},
		{49,64,78,87,103,121,120,101},
		{72,92,95,98,112,100,103,99}
	};
	
	chufa(FDATA,lianghua,txt);
	int i,j;
    for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			if(fabs(FDATA[i][j])==0.0)
			SetXY(i,j,255);
			else
			SetXY(i,j,(BYTE)Datas[i][j]);
		}

	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}

void CDCTDoc::chufa(float src[][800],int obj[][8],int txt[16][16])
{
	int i,j,m,n,f;
	float flag;
	float *temp=new float[m_size.cx*m_size.cy];
	CFENDLG fen;
	if(fen.DoModal()==IDOK)
	{
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
			temp[i *m_size.cx+j]=src[i][j];
	f=(int)sqrt(m_size.cx*m_size.cy/64);
	for(m=0;m<f;m++)
	{
	 for(n=0;n<f;n++)
		{
			for(i=0;i<4;i++)
			{
				for(j=0;j<4;j++)
				{
					flag=(temp[(i+m*8)*4 + j+n*8])/(obj[i][j]);
					if(fabs(flag)<fen.m_fxishu)
                      temp[(i+m*8)*4 +j+n*8]+=txt[i][j];
			          
				}
			}
		}
		
	}
	}
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
			src[i][j]=temp[i*m_size.cx + j];
}

void CDCTDoc::OnSuan2() 
{
	// TODO: Add your command handler code here
    jiance();
	int i,j;
	char *str=new char[m_size22.cy*m_size22.cx];
	for(i=0;i<m_size22.cy;i++)
		for(j=0;j<m_size22.cx;j++)
		{
			str[i*m_size22.cx+j]=(char)Datas22[i][j];
		}
	CFileDialog dlg(1,"bmp","*.bmp");
	CFile fp;
	if(dlg.DoModal()==IDOK)
	{

⌨️ 快捷键说明

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