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

📄 metrixdlg.cpp

📁 该软件和代码实现的功能是对图象的加密和解密,运行环境是Xp+matlab,代码中有说明,很容易看明白.
💻 CPP
📖 第 1 页 / 共 2 页
字号:

double CMetrixDlg::EGD_Computer(int A[][MAX], int M, int N)
{
    double m_EGD=0.0;
	float xysum=0.0;
	int GD_arr[4],GD_xy;
    int i,j;
	for(i=0;i<M;i++);
	   for(j=0;j<N;j++)
	   { 
		{ 	
	     GD_xy=A[i][j];
		 xysum=0;
	   if(i-1<0)
		GD_arr[0]=0;
	    else 
			GD_arr[0]=A[i-1][j];
	   if(i+1>M)
		 GD_arr[1]=0;
	      else
			  GD_arr[1]=A[i+1][j];
       if(j-1<0)
		 GD_arr[2]=0;
	   else
	        GD_arr[2]=A[i][j-1];
	    if(j+1>N)
		 GD_arr[3]=0;
	      else 
			  GD_arr[3]=A[i][j+1];
	    for(i=0;i<4;i++)
             xysum=xysum+((GD_xy-GD_arr[i])*(GD_xy-GD_arr[i]))/4;
	   }
             m_EGD=m_EGD+xysum;
		   
	   }
       m_EGD=m_EGD/((M-2)*(N-2));
	   return m_EGD;
}

int CMetrixDlg::EGD_Matrix(int A[][MAX], int M, int N,long int key)
{
   int i,j,k;
   i=j=k=0;
   CString str;
   int start,num;
   unsigned int NewArr[MAX];
 
  //图像的行置乱
  start=5; 
  num=20;
  if(start==0||start>N)
		start=1;
  if(num==0||num>N)
		num=1;
  while(i<M)
	 {
	 for(j=0;j<N;j++)
		 {
			 NewArr[j]=A[i][j];
		 }
 
	if(!Josephus(NewArr,N,start,num))
	        { AfxMessageBox("调用josephus()失败");
		      return 0;
		 }
    i++;
     }
//图像的列置乱
	while(j<N)
	 {
	 for(i=0;i<M;i++)
		 {
			 NewArr[i]=A[i][j];
		 }
	
		 if(!Josephus(NewArr,M,start,num))
		 { AfxMessageBox("调用josephus()失败");
		   return 0;
		 }
	      
	      j++;
       }
//	for(i=0;i<M;i++)
	//	for(j=0;j<N;j++)
		//	A[i][j]^=(key+i*j)%256;
return 1;
}

void CMetrixDlg::OnJmOpen() 
{
	// TODO: Add your control notification handler code here
	flag_jm=0;
   	CString str_tem,JM_file_extern;
	flag_run=0;
	if(mat_Path=="")
	{  
	   AfxMessageBox("please choose path to save mat file");
	   return;
	 }
	CFileDialog JM_Dlg(TRUE,_T("*.tif"), "",NULL,
    "Data Files(*.tif)|*.tif*|All Files (*.*)|*.*||");
	AfxMessageBox("请选择一幅\n像素不超过500*500的要解密的tif文件");
	JM_Dlg.DoModal();
	////
	JM_path_name=JM_Dlg.GetPathName();
	JM_file_extern=JM_Dlg.GetFileExt(); 
	if(JM_path_name=="")
	{ 
	  AfxMessageBox("please open file again");
	  return;
	  }
     else if(JM_file_extern!="tif")
   {
	  AfxMessageBox("this file name is not *.tif file");
	  return;
   }
   mat_Path_Name2=mat_Path+"data2.mat";

flag_jm++;
}

void CMetrixDlg::OnJmCompare() 
{
	// TODO: Add your control notification handler code here
	CString str_old,str_new;
	if(JM_path_name=="")
	{  
		AfxMessageBox("please choose tif file");
	    return;
	   }
	else if(mat_Path=="")
	{
		AfxMessageBox("please choose path to save mat file");
	    return;
	   }
	if(flag_jm!=5)
      return;
	str_old.Format("原来图像的平均相邻置乱度差为%f--运行标记是%d\n",JM_EGD,flag_jm);
    str_new.Format("解密后图像的平均相邻置乱度差为%f\n",JM_EGD_NEW);
    str_old+=str_new;
    AfxMessageBox(str_old);
	
   flag_jm++;

}

void CMetrixDlg::OnJmOld() 
{
	// TODO: Add your control notification handler code here
	mxArray *AA_mx,*BB_mx;
   if(JM_path_name=="")
	{  
		AfxMessageBox("please choose tif file");
	    return;
	   }
	else if(mat_Path=="")
	{
		AfxMessageBox("please choose path to save mat file");
	    return;
	   }
	if(flag_jm!=1)
		 return;
	AfxMessageBox(JM_path_name);
    AA_mx=mxCreateString(JM_path_name);
	BB_mx=mxCreateString(mat_Path_Name2);
   // AfxMessageBox("hahhahh11111111");
    engPutVariable(ep,"JM_PATH_NAME",AA_mx);
	engPutVariable(ep,"MAT_PM2",BB_mx);
    engEvalString(ep,"JMOLD=imread(JM_PATH_NAME);");
    engEvalString(ep,"imshow(JMOLD);");
    engEvalString(ep,"save(MAT_PM2);");
    //AfxMessageBox("haha2222222222");
	mxDestroyArray(AA_mx);
    mxDestroyArray(BB_mx);
    flag_jm++;
}

void CMetrixDlg::OnJmZhifang() 
{
	// TODO: Add your control notification handler code here
	if(JM_path_name=="")
	{  
		AfxMessageBox("please choose tif file");
	    return;
	   }
	else if(mat_Path=="")
	{
		AfxMessageBox("please choose path to save mat file");
	    return;
	   }
	if(flag_jm!=2)
		return;
	else
	engEvalString(ep,"imhist(JMOLD);");
	flag_jm++;
}

void CMetrixDlg::OnJmhNew() 
{
	// TODO: Add your control notification handler code here
	MATFile *mfp2;
	CString str_tem;
	unsigned char *AA_char;//*BB_char;
	long int key;
//    int dims[2];
	
    
	CString JM_save_path;
	JM_save_path=mat_Path+"imgjm.tif";
	if(JM_path_name=="")
	{  
		AfxMessageBox("please choose tif file");
	    return;
	   }
	else if(mat_Path=="")
	{
		AfxMessageBox("please choose path to save mat file");
	    return;
	   }
	if(flag_jm!=3)
		return;
	 CKeyDlg m_KeyDlg;
     if(m_KeyDlg.DoModal()!=IDOK)
		return;
    key=StringTOInt(G_strPass);
	
    mfp2=matOpen(mat_Path_Name2,"u");
	if(mfp2==NULL)
	{AfxMessageBox("open mat file error\n");
	   return;
	  }
	//
    A_ptr=matGetArray(mfp2,"JMOLD");
    M=mxGetM(A_ptr);
	N=mxGetN(A_ptr);
	AA_char=( unsigned char*)mxGetPr(A_ptr);
    if(mxIsComplex(A_ptr))
         AfxMessageBox("this is complex\n");
 
 /////////计算解密前图像的平均相邻灰度差///

JM_EGD=0.0;
JM_EGD=JM_EGD_Computer(AA_char,M,N);
//str_tem.Format("The first JM_EGD_Computer is %lf",JM_EGD);
//AfxMessageBox(str_tem);


//一个新的矩阵,存储新的数据的矩阵
   //  B_ptr=mxCreateNumericArray(2,dims,mxUINT8_CLASS,mxREAL);
  //   mxSetName(B_ptr,"JM_NEW");
//	 BB_char=(unsigned char*)mxGetPr(B_ptr);
//////////////////////////图象解密算法

if(!JM_Matrix(AA_char,M,N,key))
AfxMessageBox("Bad Error in JM_Matrix()");

//解密后的平均相邻灰度差
JM_EGD_NEW=0.0;
JM_EGD_NEW=JM_EGD_Computer(AA_char,M,N);
//////////////这里很重要,打开的文件要先关闭,不然没有办法用matlab读写文件
//for(i=0;i<M;i++)
  // for(j=0;j<N;j++)
	  // BB_char[i+j*M]=AA_char[i+j*M];

matPutArray(mfp2,A_ptr);
AfxMessageBox("新的矩阵数据存入文件");
//matPutArray(mfp2,B_ptr);
   if(mfp2!=NULL)
	   matClose(mfp2);
///////////////////////////函数LOAD打开文件并且导出变量:--)^_^..
//显示置乱后的图像

    C_mx=mxCreateString(mat_Path);
    D_mx=mxCreateString(JM_save_path);

	engPutVariable(ep,"MAT_PATH",C_mx);
	engPutVariable(ep,"JM_SAVE_PATH",D_mx);
    engEvalString(ep,"addpath(MAT_PATH);");
    engEvalString(ep,"load data2;");
    engEvalString(ep,"imshow(JMOLD);");
//	engOutputBuffer(ep,buffer,300);
	engEvalString(ep,"imwrite(JMOLD,JM_SAVE_PATH);");
	//MessageBox((LPSTR)buffer,(LPSTR)"MATLAB-whos",MB_OK);
	mxDestroyArray(A_ptr);
 //   mxDestroyArray(B_ptr);
	mxDestroyArray(C_mx);
	mxDestroyArray(D_mx);
	flag_jm++;
}

void CMetrixDlg::OnJmhZhifang() 
{
	// TODO: Add your control notification handler code here
	if(JM_path_name=="")
	{  
		AfxMessageBox("please choose tif file");
	    return;
	   }
	else if(mat_Path=="")
	{
		AfxMessageBox("please choose path to save mat file");
	    return;
	   }
	if(flag_jm!=4)
      return;
	engEvalString(ep,"imhist(JMOLD);");
	flag_jm++;

}

long int CMetrixDlg::StringTOInt(CString m_str)
{
   char ch_A[20];
   long int sum;
   int tem;
   sum=0;
   int length=m_str.GetLength();
  
   for(i=0;i<length;i++)
   {
	   ch_A[i]=m_str[i];
	   tem=(int)ch_A[i];
	   sum+=tem*(i+1)*(i+1);
   }
   return sum;
}

BOOL CMetrixDlg::JM_EGD_Matrix(unsigned char*A_ch, int M, int N,long key)
{
   int i,j,k;
   i=j=k=0;
   CString str;
   int start,num;
   unsigned int *NewArr,*NewArr2;
   NewArr=new unsigned int[N];
   NewArr2=new unsigned int[M];

 //图像的行置乱
  if(M>N)
  {
  start=key%N; 
  num=key%start;
  if(start==0||start>N)
		start=1;
  if(num==0||num>N)
		num=1;
  }else
  {
  start=key%M; 
  num=key%start;
  if(start==0||start>N)
		start=1;
  if(num==0||num>N)
		num=1;
  }
  i=0;
  while(i<M)
	 {
	 for(j=0;j<N;j++)
		 {
			 NewArr[j]=(unsigned int)A_ch[i+j*M];
		 }
     if(!Josephus(NewArr,N,start,num))
		{ AfxMessageBox("调用josephus()失败");
			      return 0;
		}
     for(j=0;j<N;j++)
	       A_ch[i+j*M]=NewArr[j]^((i*j+key)%256);
	   i++;
     }
//图像的列置乱
    j=0;
   while(j<N)
	 {
	    for(i=0;i<M;i++)
		 {
			 NewArr[i]=(unsigned int)A_ch[i+j*M];
		 }
	
		 if(!Josephus(NewArr,M,start,num))
		 { AfxMessageBox("调用josephus()失败");
		   return 0;
		 }
	      for(i=0;i<M;i++)
		 {
			 A_ch[i+j*M]=NewArr[i]^((i*j+key)%256);
		 }
	
			j++;
       }
      delete NewArr;
	  delete NewArr2;
      return 1;

}



double CMetrixDlg::JM_EGD_Computer(unsigned char *A_ch, int M, int N)
{
    double m_EGD=0.0;
	float xysum=0.0;
	int GD_arr[4],GD_xy;
    int i,j;
	for(i=0;i<M;i++);
	   for(j=0;j<N;j++)
	   { 
		{ 	
	     GD_xy=A_ch[i+M*j];
		 xysum=0;
	   if(i-1<0)
		GD_arr[0]=0;
	    else 
			GD_arr[0]=A_ch[i-1+j*M];
	   if(i+1>M)
		 GD_arr[1]=0;
	      else
			  GD_arr[1]=A_ch[i+1+j*M];
       if(j-1<0)
		 GD_arr[2]=0;
	   else
	        GD_arr[2]=A_ch[i+(j-1)*M];
	    if(j+1>N)
		 GD_arr[3]=0;
	      else 
			  GD_arr[3]=A_ch[i+(j+1)*M];
	    for(i=0;i<4;i++)
             xysum=xysum+((GD_xy-GD_arr[i])*(GD_xy-GD_arr[i]))/4;
	   }
             m_EGD=m_EGD+xysum;
		   
	   }
       m_EGD=m_EGD/((M-2)*(N-2));
	   return m_EGD;
}

BOOL CMetrixDlg::JM_Matrix(unsigned char *A_ch,int M,int N,long int key)
{
   unsigned int *p_arr,*p_arr2;
   int *p_tem,*p_tem2;
   int num,start;
   p_arr=new unsigned int[M];
   p_tem=new int[M];
   p_tem2=new int[N];
   p_arr2=new unsigned int[N];
   CString str_tem,str;
   int i,j;
   int ii,jj;
   
   //列解密
   for(i=0;i<M;i++)
	p_arr[i]=i;
   if(M>N)
  {
  start=key%N; 
  num=key%start;
  if(start==0||start>N)
		start=1;
  if(num==0||num>N)
		num=1;
  }else
  {
  start=key%M; 
  num=key%start;
  if(start==0||start>N)
		start=1;
  if(num==0||num>N)
		num=1;
  }
	str_tem.Format("num and start is %d--%d",num,start);
     AfxMessageBox(str_tem);
     j=0;
     while(j<N)
	 {
	     for(i=0;i<M;i++)
		 {
			 p_tem[i]=A_ch[i+j*M]^((i*j+key)%256);
		 }
		 if(!Josephus(p_arr,M,start,num))
		 { 
		   AfxMessageBox("调用josephus()失败");
		   return 0;
		 }
	     for(i=0;i<M;i++)
		 {
			  ii=p_arr[i];
			  A_ch[ii+j*M]=p_tem[i];
			 
		  }
		 
	     for(i=0;i<M;i++)
		 {p_arr[i]=i;
		 }
		  j++;
       }
  //行解密
   i=0;
    for(j=0;j<N;j++)
	   p_arr2[j]=j;
    str_tem.Format("M,N is%d,%d",M,N);
    AfxMessageBox(str_tem);
	str_tem.Format("p_arr2[] is%d,%d",p_arr2[0],p_arr2[N-1]);
    AfxMessageBox(str_tem);
	while(i<M)
	 {
	     for(j=0;j<N;j++)
		 {
			 p_tem2[j]=A_ch[i+j*M]^((i*j+key)%256);
		 }
	  
       if(!Josephus(p_arr2,N,start,num))
	   { 
	   AfxMessageBox("调用josephus()失败");
	   return 0;
	   }
	    for(j=0;j<N;j++)
		 {  
			 jj=p_arr2[j];
		     A_ch[i+jj*M]=p_tem2[j];
         }
		if(i==3)
		{
         str_tem.Format("p_arr2[0],p_arr2[N-1],p_arr[19] is%d,%d",p_arr2[0],p_arr2[N-1],p_arr[19]);
         AfxMessageBox(str_tem);
		}
	     for(j=0;j<N;j++)
		 {  
			 p_arr2[j]=j;
		 }
		 i++;
		}

 delete [] p_arr;
 delete [] p_arr2;
 delete [] p_tem;
 delete [] p_tem2;
return 1;
} 

⌨️ 快捷键说明

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