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

📄 watermarkxview.cpp

📁 一篇有关数字水印的程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 		long lStyle = ::GetWindowLong(hFig,GWL_STYLE);
 		::SetWindowLong(hFig,GWL_STYLE,lStyle & (~WS_CAPTION) & (~WS_THICKFRAME));
 		::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
 
 		// 获取绘图区域的位置和大小
 		RECT PlotRec;
 		CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA);
 		PlotArea->GetWindowRect(&PlotRec);
		

 		long Width = PlotRec.right - PlotRec.left;
 		long Height = PlotRec.bottom - PlotRec.top;
 
 		// 设置Figure窗口为绘图区域窗口的子窗口并调整其位置
 		::SetParent(hFig,PlotArea->GetSafeHwnd());
 		::SetWindowPos(hFig,NULL,1,1,Width-3,Height-3,SWP_NOZORDER | SWP_NOACTIVATE); 
		
	}	
}
  
mwArray CWaterMarkxView::Get_h(mwArray strFigName, mwArray BKColor, mwArray strVisible)
{

	 h_fig = figure(
            mwArray("DoubleBuffer"), mwArray("On"),
            mwArray("NumberTitle"),  mwArray("Off"),
            mwArray("Name"),         strFigName,
            mwArray("Menubar"),      mwArray("None"),
            mwArray("Color"),        BKColor,
            mwArray("Visible"),      strVisible);
	
	// h_a = axes("Parent",h_f,"Box","On");
    // h_a = axes(mwArray("Parent"), h_fig, mwArray("Box"), mwArray("Off"));
	  //h_a=subplot(mwArray(1),mwArray(1),mwArray(1),mwArray("replace"));	  
	  
    return h_a;
}


void CWaterMarkxView::SetVisible(mwArray h_a, mwArray strVisible)
{
    // h_f = get(h_a,"Parent");
	mwArray h_f = get(h_a, mwArray("Parent"));

	// set(h_f,"Visible",strVisible);
    Vset(h_f, mwArray("Visible"), strVisible);
}

void CWaterMarkxView::OnClose() 
{
	// TODO: Add your message handler code here and/or call default

	// 在退出程序时关闭打开的Figure窗口
 	// close('all');
	if(~h_a.IsEmpty())
		h_a.Clear();
	if(~h_fig.IsEmpty())
		h_fig.Clear();

 	close(mwArray("all"));

	CFormView::OnClose();
}

void CWaterMarkxView::DCTWater()
{
  /*%**********************************************************
	%图像分块作DCT,用两个不相关的伪随机序列分别代表水印信息中的0和1,潜入到DCT域的中频部分
	%注:此算法为水印嵌入算法。
	%一位一位来
	%*********************************************************	 */
	CString str;
	startime=CTime::GetCurrentTime();
//	str.Format("%02d:%02d:%02d",startime.GetHour(),startime.GetMinute(),startime.GetSecond());
//	MessageBox(str);  	  

	int jj=0,ii=0; 
	mwArray DI1,WW,DWW,FDI,MID1;
	  
	WW=round(rdivide(double_func(W),mwArray(256)));			
	EI=I;		

	//%初始化扫描原始图像I的x和y
	int I_x=1;
	int I_y=1;

	//	%初始化扫描水印W的x和y
	int W_x=1;
	int W_y=1;
		 
	for(int kk=1;kk<water_block;)
	{
		


		DI1=dct2(I(colon(mwArray(I_y),mwArray(I_y+blocksize-1)),\
					colon(mwArray(I_x),mwArray(I_x+blocksize-1))) );//%对原始图像I进行离散余弦变换
	    DWW=WW(colon(mwArray(kk),mwArray(kk+3)));	 //%得到水印块
		FDI=floor(DI1);
		MID1=mod(FDI,mwArray(4*G));
		
		for(int t=1;t<=watersize;t++)
		{
			if( tobool(DWW(mwArray(t))==mwArray(0)) )
			{	  for(ii=2*t-1;ii<=2*t;ii++)
					  for(jj=1;jj<=blocksize;jj++)
						  if(midband[ii][jj]==1)
								  DI1(mwArray(ii),mwArray(jj))=DI1(mwArray(ii),mwArray(jj))\
												+mwArray(A*G)-MID1(mwArray(ii),mwArray(jj));

			}
			else
			{	  for(ii=2*t-1;ii<=2*t;ii++)
					  for(jj=1;jj<=blocksize;jj++)
						  if(midband[ii][jj]==1)
								  DI1(mwArray(ii),mwArray(jj))=DI1(mwArray(ii),mwArray(jj))\
												+mwArray(B*G)-MID1(mwArray(ii),mwArray(jj));


			
			}
		}

		//	%离散余弦逆变换得到q嵌入水印后的图像EI
		EI(colon(mwArray(I_y),mwArray(I_y+blocksize-1)),\
					colon(mwArray(I_x),mwArray(I_x+blocksize-1)))=idct2(DI1); 

		//horzcat();
	//  %~~~~~~~~~~*****原始图像扫描********~~~~~~~~~~~~~~~~~~~~

		if((I_x+blocksize)>=(i_Nc-8)) 
		{	I_x=1;
			I_y=I_y+blocksize;
		}
		else
			I_x=I_x+blocksize;	
		kk+=4;
	}		  
	
	
	//subplot(mwArray(2),mwArray(2),mwArray(3));
	//imshow(EI);	   
	//title(mwArray("已嵌入水印的图像"));	

	endtime=CTime::GetCurrentTime(); 
//	str.Format("%02d:%02d:%02d",endtime.GetHour(),endtime.GetMinute(),endtime.GetSecond());
//	MessageBox(str);

	costime=endtime-startime;
//	str.Format("%02d:%02d:%02d",costime.GetHours(),costime.GetMinutes(),costime.GetSeconds());
//	MessageBox(str);

	EI_1=EI; 
	int i,j;
	double *qianruData=new double[i_Mc*i_Nc];
	for(i=0;i<i_Mc*i_Nc;i++)
	{
		qianruData[i] = *(mxGetPr(EI.GetData())+i);
	}

 	//mwArray Itemp =double_func(rgb2gray(I));
	//mwArray EItemp=double_func(rgb2gray(EI));
	mwArray Itemp =double_func(I);
	mwArray EItemp=double_func(EI);
	GetCoef(Itemp ,i_Mc,i_Nc,EItemp);  	 //得到相关系数
	//GetCoef(I ,i_Mc,i_Nc,EI);  	 //得到相关系数

	LPSTR lpDIB;
	DWORD dwBitsSize;
	LONG lLineBytes;
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_OriginHDIB);
	DWORD biSize;
	biSize=((LPBITMAPINFOHEADER)lpDIB)->biSize;
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(i_Nc * 8);
	dwBitsSize = lLineBytes*i_Mc;
	if(m_QianruHDIB==NULL)
	{
		m_QianruHDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, m_OriginImageSize - sizeof(BITMAPFILEHEADER));
	}

	CopyHDIB(m_OriginHDIB,m_QianruHDIB,0);
	
	
	LPSTR lpDIBBits_Source;
	unsigned char* lpSrcs;
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_QianruHDIB);
	lpDIBBits_Source = ::FindDIBBits(lpDIB);
	for( i = 0; i < i_Mc; i++)
		{
			for( j = 0; j <i_Nc; j++)
			{
				
				lpSrcs = (unsigned char*)lpDIBBits_Source + lLineBytes * i + j;
				*(lpSrcs)=(unsigned char)qianruData[j+i*i_Nc];
			}
		}
	delete[] qianruData;
	this->Invalidate();
}	

void CWaterMarkxView::DCTCheck()
{   /*%**********************************************************
	%图像分块作DCT,用两个不相关的伪随机序列分别代表水印信息中的0和1,潜入到DCT域的中频部分
	%注:此算法为水印提取算法。
	%一位一位来
	%*********************************************************	 */	  
	
	CString str; 
	
   	startime=CTime::GetCurrentTime();
 //	str.Format("%02d:%02d:%02d",startime.GetHour(),startime.GetMinute(),startime.GetSecond());
//	MessageBox(str);

	mwArray S(abs(A-B)*G);		  


 //	mwArray Im_filename(filename),Water_filename("5555.bmp"); 
	int jj=0,ii=0,num=0; 
	mwArray EWI1,DEI1,FDEI1,MFDEI1;
	mwArray nn=1;	 
	mwArray WW=round(rdivide(double_func(W),mwArray(256)));			 
	//%初始化扫描原始图像I的x和y
	int EI_x=1;
	int EI_y=1;

	//	%初始化扫描水印W的x和y
	int EWI_x=1;
	int EWI_y=1;

	for(int kk=1;kk<=water_block;)
	{
		DEI1=dct2(EI_1(colon(mwArray(EI_y),mwArray(EI_y+blocksize-1)),\
					colon(mwArray(EI_x),mwArray(EI_x+blocksize-1))) );//%对原始图像I进行离散余弦变换

		FDEI1=floor(DEI1);
		MFDEI1=mod(FDEI1,mwArray(4*G));
		
		for(int t=1;t<=watersize;t++)
		{
			  num=0;
			  for(ii=2*t-1;ii<=2*t;ii++)
					  for(jj=1;jj<=blocksize;jj++)
						  if(midband[ii][jj]==1)
								if(tobool(MFDEI1(mwArray(ii),mwArray(jj))>S))
									num=num+1;
			   
			   if(num>3)
					EWI1(nn)=1;
			   else
					EWI1(nn)=0;
			   nn++;   	
		}

   //  %~~~~~~~~~~*****对需检测图像扫描********~~~~~~~~~~~~~~~~~~~~
	  	if((EI_x+blocksize)>=(i_Nc-8)) 
		{	
			EI_x=1;
			EI_y=EI_y+blocksize;
		}
		else
			EI_x=EI_x+blocksize;	

		kk+=4;
	}	
	EWI2=reshape(EWI1,Mw,Nw);

	double *TiquData=new double[i_Mw*i_Nw];
	int i,j;
	for(i=0;i<i_Mw*i_Nw;i++)
	{
		TiquData[i] = *(mxGetPr(EWI2.GetData())+i);
		if(TiquData[i]>0)
			TiquData[i]=255;
	}


	LPSTR lpDIB;
	DWORD dwBitsSize;
	LONG lLineBytes;
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_SuiyinHDIB);
	DWORD biSize;
	biSize=((LPBITMAPINFOHEADER)lpDIB)->biSize;
	::GlobalUnlock((HGLOBAL) m_SuiyinHDIB);
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(i_Nw * 8);
	dwBitsSize = lLineBytes*i_Mw;
	if(m_TiquHDIB==NULL)
	{
		m_TiquHDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, m_SuiyinImageSize - sizeof(BITMAPFILEHEADER));
	}
	if(m_SuiyinHDIB!=NULL)
	{
		//CopyHDIB(m_SuiyinHDIB,m_TiquHDIB,m_SuiyinImageSize - sizeof(BITMAPFILEHEADER)-::PaletteSize(lpDIB)-biSize);
		CopyHDIB(m_SuiyinHDIB,m_TiquHDIB,0);
	}

	LPSTR lpDIBBits_Source;
	unsigned char* lpSrcs;
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_TiquHDIB);
	lpDIBBits_Source = ::FindDIBBits(lpDIB);
	for( i = 0; i < i_Mw; i++)
		{
			for( j = 0; j <i_Nw; j++)
			{
				
				lpSrcs = (unsigned char*)lpDIBBits_Source + lLineBytes * i + j;
				*(lpSrcs)=(unsigned char)TiquData[j+i*i_Nw];
			}
		}
	delete[] TiquData;
	::GlobalUnlock((HGLOBAL) m_TiquHDIB);
	this->Invalidate();
		//  %~~~~~~~~~~*****显示检测出的水印图像********~~~~~~~~~~~~~~~~~~~~
	//subplot(mwArray(2),mwArray(2),mwArray(4));
	//imshow(EWI2);	 
	//title(mwArray("检测到的水印图像"));
 	endtime=CTime::GetCurrentTime();  
	
//	str.Format("%02d:%02d:%02d",endtime.GetHour(),endtime.GetMinute(),endtime.GetSecond());
//	MessageBox(str);

	costime=endtime-startime;
//	str.Format("%02d:%02d:%02d",costime.GetHours(),costime.GetMinutes(),costime.GetSeconds());
//	MessageBox(str);  

	
	mwArray Wtemp =double_func(WW);
	mwArray EWItemp=double_func(EWI2);

	GetCoef(Wtemp ,i_Mw,i_Nw,EWItemp);  	 //得到相关系数

}
  

void CWaterMarkxView::OnWaterInsert() 
{
	// TODO: Add your command handler code here
	//嵌入水印
	bWait = 0;
	m_title.SetCaption("数字水印嵌入");
	UpdateData(FALSE);

		   
		try{
			SetTimer(1,1000,NULL);
			DCTWater();
			busydlg.DoModal();	   //等待 
 			bshow=3;
			bsave_I=1;
			// 设置窗口可见
 			//SetVisible(h_a,mwArray("On"));
 
 			// 进入窗口等待状态				
 			//mlfHGWaitForFiguresToDie();  
		
		}
		catch (mwException & ex){	 	
			mwDisplayException(ex);
		}			   
 	 
}

void CWaterMarkxView::OnWaterDistill() 
{
	// TODO: Add your command handler code here
	// 检测水印
	bWait=1;
	m_title.SetCaption("数字水印检测");
	UpdateData(FALSE);

		 
		try{	 
			SetTimer(2,1000,NULL);
			//DCTCheck();
			busydlg.DoModal();		//等待

 		   	//只有打开原始图像和打开需检测的图像可选	  
			binsert=0;	 
			bshow=0;	 
			bcheck=0;  
			bdishow=0;

			//可以保存图像或水印
			bsave_C=1;
			// 设置窗口可见
 			SetVisible(h_a,mwArray("On"));
 
 			// 进入窗口等待状态				
 			mlfHGWaitForFiguresToDie(); 
		}
		catch (mwException & ex){	 	
			mwDisplayException(ex);
		}	   			
 
}

void CWaterMarkxView::OnFileOpen() 
{
	// TODO: Add your command handler code here
	//打开原始图像
//	clf(mwArray(1));  //清除图像
	CString str;
	
//	sndPlaySound("Over-delete.wav",SND_ASYNC|SND_FILENAME);//播放按键音乐

	/*if(tobool(isempty(h_a)))
		CreatFigDlg();
	else
	{*/		  
		try{
			
			OpenFileDlg(0);	   //打开原始图像  
			if(!Filename.IsEmpty())
			{
			    //Im_filename=mwArray(Filename);

				//原始图像打开
				bshow=1; 
				binsert=1;
				bsave_I=0;//不能保存图像
				bsave_C=0;
				//subplot(mwArray(1),mwArray(2),mwArray(1));	 

				//I=imread(NULL,NULL,Im_filename);  //%读取原始图像
				CFile file;

 				// 打开文件
				if( !file.Open(Filename, CFile::modeRead | CFile::shareDenyWrite))
				{
					// 返回	
					return ;
				}

					if (m_OriginHDIB != NULL)
					{
					// 清除DIB对象
					::GlobalFree((HGLOBAL) m_OriginHDIB);
					m_OriginHDIB=NULL;
					}


				//DeleteContents();
	
				// 更改光标形状
				BeginWaitCursor();
	
				// 尝试调用ReadDIBFile()读取图像
				TRY
				{
					//m_OriginHDIB = ::ReadDIBFile(file);
					m_OriginHDIB=::ReadDIBFile(file);
			
				}
				CATCH (CFileException, eLoad)
				{
				// 读取失败
					file.Abort();
				// 恢复光标形状
					EndWaitCursor();
		// 报告失败
		//	ReportSaveLoadException(strPathName, eLoad,FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -