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