?? 數(shù)字水印技術doc.cpp
字號:
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個整數(shù)后,生成一個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; //數(shù)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;
//得到結果矩陣(外循環(huán))
for(m=0;m<3;m++)
//每一行先乘后加(內循環(huán))
{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;
//輸入一個十進制數(shù)
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;
}
}
}
//反位操作函數(shù)
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);
//調用相乘子函數(shù)
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目的是表明我們能夠將高頻部分區(qū)分出來,\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 + -