📄 metrixdlg.cpp
字号:
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 + -