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

📄 数字水印技术doc.cpp

📁 基于变换域的信息隐藏技术
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 整数DCT图像压缩Doc.cpp : implementation of the CDCTDoc class
//

#include "stdafx.h"
#include <windowsx.h>
#include "Math.h"

#include "数字水印技术.h"
#include "数字水印技术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));//分配内存单元
 		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);//释放内存单元
            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 + -