?? 數(shù)字水印技術doc.cpp
字號:
// 整數(shù)DCT圖像壓縮Doc.cpp : implementation of the CDCTDoc class
//
#include "stdafx.h"
#include <windowsx.h>
#include "Math.h"
#include "數(shù)字水印技術.h"
#include "數(shù)字水印技術Doc.h"
#include "MyDlg1.h"
#include "InputDlg.h"
#include "XIANSHIDLG.h"
#include "FANHR.h"
#include "fileOpen.h"
#include "SUIJIDLG.h"
#include "PIC_256_DLG.h"
#include "Dlg.h"
#include "XYDlg.h"
#include "CANSHUDLG.h"
#include "MAGIC_DLG.h"
#include "GRAY_CANDLG.h"
#include "FENDLG.h"
#include "HELPDLG.h"
#include "DLG_CONTROL.h"
#include "FANHUANFANG.h"
#define MM 255
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDCTDoc
IMPLEMENT_DYNCREATE(CDCTDoc, CDocument)
BEGIN_MESSAGE_MAP(CDCTDoc, CDocument)
//{{AFX_MSG_MAP(CDCTDoc)
ON_COMMAND(IDC_FFT, OnFft)
ON_COMMAND(IDC_IFFT, OnIfft)
ON_COMMAND(IDC_DCT, OnDct)
ON_COMMAND(IDC_IDCT, OnIdct)
ON_COMMAND(IDC_ZDCT, OnZdct)
ON_COMMAND(IDC_ZIDCT, OnZidct)
ON_COMMAND(ID_SHANG, OnShang)
ON_COMMAND(IDC_YUCE, OnYuce)
ON_COMMAND(IDC_HUIFU, OnHuifu)
ON_COMMAND(IDC_VData, OnVData)
ON_COMMAND(IDC_HData, OnHData)
ON_COMMAND(IDC_DataDCT, OnDataDCT)
ON_COMMAND(IDC_IDCtHData, OnIDCtHData)
ON_COMMAND(IDC_ZSTORE, OnZstore)
ON_COMMAND(IDC_HDATADCT, OnHdatadct)
ON_COMMAND(IDC_HZDCT, OnHZDCt)
ON_COMMAND(IDC_WUCHA, OnWucha)
ON_COMMAND(IDC_JIANJIN, OnJianjin)
ON_COMMAND(IDD_DIALOG8,OnSuijishu)
ON_COMMAND(IDC_VSHOW, OnVshow)
ON_COMMAND(IDC_HY, OnHy)
ON_COMMAND(IDC_ImageDCT, OnImageDCT)
ON_COMMAND(IDC_ImageIDCT, OnImageIDCT)
ON_COMMAND(ID_OPENFILE_TXT, OnOpenfileTxt)
ON_COMMAND(ID_MAGIC, OnMagic)
ON_COMMAND(ID_GRAY, OnGray)
ON_COMMAND(ID_FENPIN, OnFenpin)
ON_COMMAND(ID_SUAN_2, OnSuan2)
ON_COMMAND(ID_HUIDU_PIC, OnHuiduPic)
ON_COMMAND(ID_NEW_256_PIC, OnNew256Pic)
ON_COMMAND(ID_DATA_W, OnDataW)
ON_COMMAND(ID_S_1, OnS1)
ON_COMMAND(ID_DATA_PIC, OnDataPic)
ON_COMMAND(ID_BEGIN_H, OnBeginH)
ON_COMMAND(ID_YUAN_PIC, OnYuanPic)
ON_COMMAND(ID_CHUSHI_PIC, OnChushiPic)
ON_COMMAND(ID_SUB_P_W, OnSubPW)
ON_COMMAND(ID_TXT_TO_BITS, OnTxtToBits)
ON_COMMAND(ID_BIT_TXT, OnBitTxt)
ON_COMMAND(ID_S_4, OnS4)
ON_COMMAND(ID_2_PIC, On2Pic)
ON_COMMAND(ID_S_5, OnS5)
ON_COMMAND(ID_W_T, OnWT)
ON_COMMAND(ID_TIQU_2, OnWT2)
ON_COMMAND(ID_SIM_YANZHENG, OnSimYanzheng)
ON_COMMAND(ID_YANZHENG, OnYanzheng)
ON_COMMAND(ID_HELPDLG, OnHelpdlg)
ON_COMMAND(ID_S_2, OnS2)
ON_COMMAND(ID_PIC_SAVE, OnPicSave)
ON_COMMAND(ID_S_6, OnS6)
ON_COMMAND(ID_S_7, OnS7)
ON_COMMAND(ID_FANH, OnFanHuanFang)
ON_COMMAND(ID_SUIJISHU, OnSuijishu)
ON_COMMAND(ID_magicx, Onmagicx)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDCTDoc construction/destruction
CDCTDoc::CDCTDoc()
{
// TODO: add one-time construction code here
lpbmi=NULL;
Min=0;
Max=255;
}
CDCTDoc::~CDCTDoc()
{
if(lpbmi!=NULL)
GlobalFreePtr(lpbmi);
}
BOOL CDCTDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CDCTDoc serialization
void CDCTDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CDCTDoc diagnostics
#ifdef _DEBUG
void CDCTDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CDCTDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDCTDoc commands
//void CDCTDoc::FCT(fl0at *, unsigned int *, float *, int, int)
//{
//}
BOOL CDCTDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
aa=1;
// TODO: Add your specialized creation code here
CFile fp;
fp.Open(lpszPathName,CFile::modeRead);
fp.Read((LPSTR)&bmh,sizeof(BITMAPFILEHEADER));//第一次讀
if(bmh.bfType!=0x4d42)
{
MessageBox(NULL,"不是合法的位圖文件","錯誤!",MB_OK);
fp.Close();
return false;
}
DWORD dwBitsSize=bmh.bfSize;
lpbmi=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-
sizeof(BITMAPFILEHEADER));//分配內(nèi)存單元
fp.Read(lpbmi,dwBitsSize-sizeof(BITMAPFILEHEADER));//第二次讀
if((lpbmi->bmiHeader.biBitCount!=8)
||(lpbmi->bmiHeader.biCompression!=BI_RGB))
{
MessageBox(NULL,"not 256 or compresed","error",MB_OK);
GlobalFreePtr(lpbmi);//釋放內(nèi)存單元
lpbmi=NULL;
fp.Close();//關閉文件
return false;
}
lpbits=(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
m_size.cx=lpbmi->bmiHeader.biWidth;
m_size.cy=lpbmi->bmiHeader.biHeight;
m_TrueWidth=(m_size.cx+3)/4*4;
fp.Close();
CXYDlg XY;
XY.DoModal();
m_x=XY.m_x;
m_y=XY.m_y;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
ShowData[i][j]=GetXY(i+m_x,j+m_y);
StartData[i][j]=GetXY(i+m_x,j+m_y);
}
UpdateAllViews(NULL);
SetModifiedFlag();
return TRUE;
}
BOOL CDCTDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
// TODO: Add your specialized code here and/or call the base class
// return CDocument::OnSaveDocument(lpszPathName);
CFile fp;
fp.Open(lpszPathName,CFile::modeWrite|CFile::modeCreate);
fp.Write((LPSTR)&bmh,sizeof(BITMAPFILEHEADER));
fp.Write(lpbmi,bmh.bfSize-sizeof(BITMAPFILEHEADER));
fp.Close();
SetModifiedFlag(false);
return true;
}
void CDCTDoc::OnDraw(CDC *pDC)
{
::StretchDIBits(pDC->m_hDC,0,0,m_size.cx,m_size.cy,
0,0,m_size.cx,
m_size.cy,lpbits,lpbmi,DIB_RGB_COLORS,SRCCOPY);
CString str;
str.Format("圖像象素值 StarPoint(%d, %d)",m_x,m_y);
pDC->TextOut(m_size.cx+20,0,str);
if(aa==1)
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
str.Format("%d",ShowData[i][j]);
pDC->TextOut(m_size.cx+20+i*40,(j+1)*30,str);
}
}
else
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
str.Format("%-8.3f",ShowFData[i][j]);
pDC->TextOut(m_size.cx+20+i*80,(j+1)*30,str);
}
}
////獲得在(X,Y)點的像素值 \\\GetXY(x,y)
BYTE CDCTDoc::GetXY(int x, int y)
{
y=m_size.cy-y-1;
return lpbits[y*m_TrueWidth+x];
}
////修改在(X,Y)點的像素值 \\\SetXY(x,y,value)
void CDCTDoc::SetXY(int x, int y, BYTE val)
{
y=m_size.cy-y-1;
lpbits[y*m_TrueWidth+x]=val;
}
////////快速FFT變換
void CDCTDoc::FFT(float*xr,float*xi,float*wr,float*wi,int m,int N)
{
int ip,k,kk,incr,iter,j,i,l;
float Tr,Ti;
ip=1;
kk=(N>>1);
incr=2;
for(iter=0;iter<m;iter++)
{
for(j=0;j<N;j+=incr)
{
i=j+ip;
Tr=xr[i];
Ti=xi[i];
xr[i]=xr[j]-Tr;
xi[i]=xi[j]-Ti;
xr[j]=xr[j]+Tr;
xi[j]=xi[j]+Ti;
}
if(iter!=0)
{
for(k=1;k<ip;k++)
{
l=k*kk-1;
for(j=k;j<N;j+=incr)
{
i=j+ip;
Tr=xr[i]*wr[l]-xi[i]*wi[l];
Ti=xr[i]*wi[l]+xi[i]*wr[l];
xr[i]=xr[j]-Tr;
xi[i]=xi[j]-Ti;
xr[j]=xr[j]+Tr;
xi[j]=xi[j]+Ti;
}
}
}
kk>>=1;
ip<<=1;
incr<<=1;
}
}
///////////////
void CDCTDoc::GLT(float *wr, float *wi, int N, int sign)
{
int n2,i;
float theta;
n2=(N>>1)-1;
theta=(float)(2.0*3.14159/((float)N));
for(i=0;i<n2;i++)
{
wr[i]=(float)cos((double)((i+1)*theta));
wi[i]=(float)sin((double)((i+1)*theta));
if(sign==(int)(-1))
wi[i]=-wi[i];
}
}
void CDCTDoc::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 CDCTDoc::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 CDCTDoc::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 CDCTDoc::WTSINV(float *C, int m, int N)
{
int NK,i,k,iter,LK;
double PI;
PI=3.14159265;
NK=4;
k=0;
LK=1;
for(iter=0;iter<m;iter++)
{
for(i=0;i<LK;i++)
{
C[k]=(float)(1.0/(float)cos((PI*(4*i+1))/NK));
k++;
}
NK<<=1;
LK<<=1;
}
for(i=1;i<(N-1);i++)
C[i]/=2.0;
}
void CDCTDoc::IFCT(float *x, unsigned int *L, float *C, int m, int N)
{
int NK1,NK2,i,j,k,kk,ip,incr,L1,iter;
float T;
x[0]=x[0]*(float)sqrt(N);
for(i=1;i<N;i++)
x[i]=(float)(x[i]*(float)sqrt(N)/1.4140);
NK1=1;
NK2=2;
kk=1;
for(i=0;i<m;i++)
kk*=2;
for(iter=1;iter<m;iter++)
{
kk>>=1;
L1=kk-1;
for(k=L1;k>=1;k--)
for(i=0;i<NK1;i++)
x[NK1+k*NK2+i]=x[NK1+k*NK2+i]+x[NK1+(k-1)*NK2+i];
NK1<<=1;
NK2<<=1;
}
NK1=N>>1;
for(i=1;i<NK1;i++)
x[i]*=2.0;
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;
}
}
ip=1;
kk=0;
incr=2;
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[i]=x[i]*C[kk];
x[j]=T+x[i];
x[i]=T-x[i];
}
kk++;
}
ip<<=1;
incr<<=1;
}
kk=1;
for(i=1;i<(N>>1);i++)
{
T=x[N-1];
k=1;
for(j=kk;j<N;j++)
{
x[N-k]=x[N-k-1];
k++;
}
x[kk]=T;
kk+=2;
}
for(i=0;i<N;i++)
x[i]=x[i]/(float)(N);
}
void CDCTDoc::ZDCT(int *Z, unsigned int *L, int m, int N)
{
double pi;
int ip,k,kk,incr,iter,j,i,l,Zr1i,Zr1j,T,NK1,k1,k2,NK2;
int Zr[8],Zi[8];
pi=3.141592;
//調整輸入順序
NK1=N>>1;
T=Z[2];
Z[2]=Z[1];
Z[1]=T;
k1=2;
k2=4;
for(i=1;i<(NK1-1);i++)
{
T=Z[k2];
for(j=0;j<=(k2-k1);j++)
{
Z[k2-j]=Z[k2-j-1];
}
Z[k1]=T;
k1++;
k2+=2;
}
NK2=N-1;
for(i=0;i<(NK1>>1);i++)
{
T=Z[NK2-i];
Z[NK2-i]=Z[NK1+i];
Z[NK1+i]=T;
}
//倒位序
for(i=0;i<(N-1);i++)
{
if(i<=(int)L[i])
continue;
else
{
T=Z[i];
Z[i]=Z[L[i]];
Z[L[i]]=T;
}
}
for(i=0;i<N;i++)
{
Zr[i]=Z[i];
Zi[i]=0;
}
//ZFFT運算
ip=1;
kk=(N>>1);
incr=2;
for(iter=0;iter<m;iter++)
{
for(i=0;i<N;i+=incr)
{
j=i+ip;
Zr[i]=Zr[i];
Zr[j]=-Zr[j];
Zr[i]=Zr[i];
Zr[j]=Zr[j]+Zr[i];
Zr[i]=Zr[i]+(int)(Zr[j]*(sqrt(2)/2-1));
Zr[j]=Zr[j];
Zr[i]=Zr[i];
Zr[j]=(int)(-Zr[i]*sqrt(2))+Zr[j];
Zr[i]=Zr[i]+(int)(Zr[j]*(sqrt(2)/2-0.5));
Zr[j]=Zr[j];
Zr[i]=Zr[i]-(int)(0.5*Zr[j]);
Zr[j]=Zr[j];
Zr[i]=Zr[i];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -