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

📄 watermarkxview.cpp

📁 一篇有关数字水印的程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		
		// 设置DIB为空
					m_OriginHDIB = NULL;
					return ;
				}
				END_CATCH
				
				// 恢复光标形状
				EndWaitCursor();
	
				// 判断读取文件是否成功
				if (m_OriginHDIB == NULL)
				{
					// 失败,可能非BMP格式
					CString strMsg;
					strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
					// 提示出错
					MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
					// 返回FALSE
					return ;
				}
				LPSTR lpDIB;
				lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_OriginHDIB);
				int nNumcolor=::DIBNumColors(lpDIB);

				if(nNumcolor!=256)
				{
					// 失败,可能非BMP格式
					CString strMsg;
					strMsg = "目前该程序只能处理256色灰度格式图象,请选择该格式图象";
					// 提示出错
					MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
					// 返回FALSE
					::GlobalUnlock((HGLOBAL) m_OriginHDIB);
					::GlobalFree((HGLOBAL) m_OriginHDIB);
					m_OriginHDIB=NULL;
					
					return ;
					
				}

				CalImageLocation();
				OnInitData();

				m_OriginImageSize = file.GetLength();
				

	/*LPSTR lpDIB;
	DWORD dwBitsSize, dwBitSize1;
	LONG lLineBytes;
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_OriginHDIB);
	DWORD biSize;
	biSize=((LPBITMAPINFOHEADER)lpDIB)->biSize;
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(::DIBWidth(lpDIB) * 8);
	dwBitsSize = file.GetLength();
	dwBitSize1=lLineBytes*(::DIBHeight(lpDIB));
	::GlobalUnlock((HGLOBAL) m_OriginHDIB);



//	int xx=sizeof(BITMAPFILEHEADER);
	if(m_QianruHDIB==NULL)
	{
		m_QianruHDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize - sizeof(BITMAPFILEHEADER));

	}
	CopyHDIB(m_OriginHDIB,m_QianruHDIB,dwBitsSize-biSize-::PaletteSize(lpDIB)-sizeof(BITMAPFILEHEADER));
*/

				this->Invalidate();
				

				file.Close();
				
				i_max_message=(::DIBHeight(lpDIB)/blocksize)*(::DIBWidth(lpDIB)/blocksize);
				i_Mc=::DIBHeight(lpDIB);
				i_Nc=::DIBWidth(lpDIB);

				::GlobalUnlock((HGLOBAL) m_OriginHDIB);
				double *OriginData=new double[i_Mc*i_Nc];
				LPSTR    lpDIBBits;
				unsigned char *lpSrc;
				int i,j;
				LONG	lLineBytes;
				lpDIBBits = ::FindDIBBits(lpDIB);
				lLineBytes = WIDTHBYTES(i_Nc * 8);
				for(  i = 0; i < i_Mc; i++)
				{
					for(  j = 0; j < i_Nc; j++)
					{
						lpSrc = (unsigned char*)lpDIBBits + lLineBytes *i + j;
						// 给时域赋值
						OriginData[j + i * i_Nc] = *(lpSrc);
					}
				}

				I=mwArray(i_Mc,i_Nc,OriginData);
				Mc=size(I,mwArray(1)); 
				Nc=size(I,mwArray(2)); 
				mwArray temp=fix( rdivide(Mc,mwArray(blocksize)) );
				mwArray temp1=fix(rdivide(Nc,mwArray(blocksize)) );
				max_message=times(temp,temp1);	 //原始图像的最大分块数 
				//转化为整型
				i_Mc=(int)Mc.ExtractScalar(1);
				i_Nc=(int)Nc.ExtractScalar(1);

				delete[] OriginData;

				//确定载体图像的大小	   
				/*Mc=size(I,mwArray(1)); 
				Nc=size(I,mwArray(2)); 
				mwArray temp=fix( rdivide(Mc,mwArray(blocksize)) );
				mwArray temp1=fix(rdivide(Nc,mwArray(blocksize)) );
				max_message=times(temp,temp1);	 //原始图像的最大分块数 
				//转化为整型
				i_Mc=(int)Mc.ExtractScalar(1);
				i_Nc=(int)Nc.ExtractScalar(1);
				//i_max_message=(int)max_message.ExtractScalar(1); 
 				i_max_message=(i_Mc/blocksize)*(i_Nc/blocksize);
				mwArray h;
				h=imagesc(I);
				title(mwArray("原始图像"));	
				// 设置窗口可见
 				SetVisible(h_a,mwArray("On"));
  				// 进入窗口等待状态						
 				//mlfHGWaitForFiguresToDie();*/
				

			}
		}
		catch (mwException & ex)
		{	 	
			mwDisplayException(ex);
		}	   
	//}		
}	

void CWaterMarkxView::OnFileOpenWater() 
{
	// TODO: Add your command handler code here
	//打开水印图像	
//	clf(mwArray(1));  //清除图像
	int error=0;

	CString str;



		try{
			OpenFileDlg(1);	   //打开水印图像  
			if(!Filename.IsEmpty())
			{	
				/*Water_filename=mwArray(Filename); 
				//水印图像打开	
 				bshow=2;   
				bdishow=-2;	  
				W=imread(NULL,NULL,Water_filename);  //	读取水印图像 
				// 确定水印图像的大小
				Mw=size(W,mwArray(1));
				Nw=size(W,mwArray(2));
				//转化为整型  
				i_Mw=(int)Mw.ExtractScalar(1);
				i_Nw=(int)Nw.ExtractScalar(1);	 
				water_block=(int)i_Mw*i_Nw;	 //水印的块数				
				*/
				CFile file;
 				// 打开文件
				if( !file.Open(Filename, CFile::modeRead | CFile::shareDenyWrite))
				{
					// 返回	
					return ;
				}

				if (m_SuiyinHDIB != NULL)
				{
					// 清除DIB对象
					::GlobalFree((HGLOBAL) m_SuiyinHDIB);
					m_SuiyinHDIB=NULL;
				}
				// 更改光标形状
				BeginWaitCursor();
				// 尝试调用ReadDIBFile()读取图像
				TRY
				{
					m_SuiyinHDIB = ::ReadDIBFile(file);
			
				}
				CATCH (CFileException, eLoad)
				{
				// 读取失败
					file.Abort();
				// 恢复光标形状
					EndWaitCursor();
					m_SuiyinHDIB = NULL;
					return ;
				}
				END_CATCH

				m_SuiyinImageSize=file.GetLength();
				file.Close();
				// 恢复光标形状
				EndWaitCursor();
	
				// 判断读取文件是否成功
				if (m_SuiyinHDIB == NULL)
				{
					// 失败,可能非BMP格式
					CString strMsg;
					strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
					// 提示出错
					MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
					// 返回FALSE
					return ;
				}

				LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_SuiyinHDIB);				
				int nNumcolor=::DIBNumColors(lpDIB);
				if(nNumcolor!=256)
				{
					// 失败,可能非BMP格式
					CString strMsg;
					strMsg = "目前该程序只能处理256色灰度格式图象,请选择该格式图象";
					// 提示出错
					MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
					// 返回FALSE

					::GlobalFree((HGLOBAL) m_SuiyinHDIB);
					m_SuiyinHDIB=NULL;
					return ;
				}

				CalImageLocation();
				OnInitData();
				this->Invalidate();

				bshow=2;   
				bdishow=-2;	

				i_Mw=::DIBHeight(lpDIB);
				i_Nw=::DIBWidth(lpDIB);
				water_block=i_Mw*i_Nw;
				Mw=mwArray(i_Mw);
				Nw=mwArray(i_Nw);

				double *SuiyinData=new double[i_Mw*i_Nw];
				LPSTR    lpDIBBits;
				unsigned char *lpSrc;
				int i,j;
				LONG	lLineBytes;
				lpDIBBits = ::FindDIBBits(lpDIB);
				lLineBytes = WIDTHBYTES(i_Nw * 8);
				for(  i = 0; i < i_Mw; i++)
				{
					for(  j = 0; j < i_Nw; j++)
					{
						lpSrc = (unsigned char*)lpDIBBits + lLineBytes *i + j;
						// 给时域赋值
						SuiyinData[j + i * i_Nw] = *(lpSrc);
					}
				}

				W=mwArray(i_Mw,i_Nw,SuiyinData);
				delete[] SuiyinData;
				if(water_block>4*i_max_message)	 //判断是否可以完全嵌入此水印数据
				{
				
				//	CInformation infor;	
					if(binsert)
						infor.Setdata(i_Mc,i_Nc,i_max_message,i_Mw,i_Nw,water_block);				
					if(bcheck)
						infor.Setdata(i_Mc,i_Nc,i_max_message,i_Mw,i_Nw,water_block);	
					int breturn=infor.DoModal();					 
				//	UpdateData(FALSE); 
					if(breturn==IDOK)
					{
						Filename.Empty(); 
					   OnFileOpenWater();	   //打开水印图像  
					}  	   
					Filename.Empty();  
					error=1; 
				}						
				if(!error)
				{

					//subplot(mwArray(2),mwArray(2),mwArray(2)); 
					//imshow(W);	//	 显示水印图像  	
					//title(mwArray("水印图像"));

					//subplot(mwArray(2),mwArray(2),mwArray(1)); 
					if(binsert)
					{
						//imshow(I);
						//title(mwArray("原始图像"));
					}
					if(bcheck)
					{
						//imshow(EI_1);		  //显示需检测的图像
						//title(mwArray("需检测的图像"));	
					}

 					// 设置窗口可见
 					//SetVisible(h_a,mwArray("On"));	 				
					// 进入窗口等待状态						
 					//mlfHGWaitForFiguresToDie();   
				}

			}		
		}
		catch (mwException & ex){	 	
			mwDisplayException(ex);
		}	   
 	
}

void CWaterMarkxView::OnDistillOpen() 
{
	// TODO: Add your command handler code here
	//打开检测图像

		try{	   
 			OpenFileDlg(2);	   //打开待检测图像 
			if(!Filename.IsEmpty())
			{	

				Im_filename=mwArray(Filename);

				//待检测得图像打开
				bdishow=-1;  
				bcheck=1;
				bsave_C=0; //不能保存图像
				bsave_I=0;

				//EI_1=imread(NULL,NULL,Im_filename);  //读取待检测的图像	 
			//	subplot(mwArray(2),mwArray(2),mwArray(1)); 

 				//确定载体图像的大小	   
				Mc=size(EI_1,mwArray(1)); 
				Nc=size(EI_1,mwArray(2)); 
				mwArray temp=fix( rdivide(Mc,mwArray(blocksize)) );
				mwArray temp1=fix(rdivide(Nc,mwArray(blocksize)) );
				max_message=times(temp,temp1);	 //原始图像的最大分块数 
				//转化为整型
				i_Mc=(int)Mc.ExtractScalar(1);
				i_Nc=(int)Nc.ExtractScalar(1);
				i_max_message=(int)max_message.ExtractScalar(1); 

				//subplot(mwArray(1),mwArray(1),mwArray(1));

				//imshow(EI_1);		  //显示待检测的图像
				//title(mwArray("需检测的图像"));	 

				// 设置窗口可见
 				//SetVisible(h_a,mwArray("On"));
 
 				// 进入窗口等待状态		 
				//mlfHGWaitForFiguresToDie(); 
			}
		}
		catch (mwException & ex){	 	
			mwDisplayException(ex);
		}  
 	
}

void CWaterMarkxView::OpenFileDlg(int model)
{		 
	CFileDialog fileopenbox(TRUE,"BMP",NULL,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,szFilter);
	switch(model)
	{
		case 0://打开原始图像
			fileopenbox.m_ofn.lpstrTitle="打开原始图像"; 	
			break;
		case 1://打开水印图像
			fileopenbox.m_ofn.lpstrTitle="打开水印图像";
			break;
		case 2://打开代检测图像
			fileopenbox.m_ofn.lpstrTitle="打开需检测图像";
			break;
		case 3:
 			fileopenbox.m_ofn.lpstrTitle="保存已嵌入水印图像";
		//	fileopenbox.SetDlgItemText(IDOK,"保存");
			break;
		case 4:
 			fileopenbox.m_ofn.lpstrTitle="保存检测水印";
	//		fileopenbox.SetDlgItemText(IDOK,"保存"); 
			break;	
	}
		 
	if(fileopenbox.DoModal()==IDOK){ //单击“OK”按钮
		Filename=fileopenbox.GetPathName();  //得到所选文件的路径名(含文件名)
		Filetype=fileopenbox.GetFileExt();   //得到所选文件的扩展名	 
	}  
}


mwArray CWaterMarkxView::PSNR(mwArray Im_original,int m,int n, mwArray Im_modified)
{
/*	%**************************************************************
	%计算峰值信噪比子程序
	%     输入:  Im_original    原始图像
				  m				 原始图像的行数
				  n				 原始图像的列数
	%             Im_modified    修改过的图像
	%     输出:  S              峰值信噪比
	% 注:此程序用来计算灰度图像的失真程度
	%**************************************************************
 */
	mwArray S;
	CString str;

	if( tobool(size(Im_original)!=size(Im_modified)) )
	{
		MessageBox("错误:两个输入图像大小不一致!");
		return mwArray(-1);
	}

	//if(tobool(~isrgb(Im_original)&~isrgb(Im_modified)))
	if(1)
	{

		mwArray sumaDif=0.0,temp=0.0;
		mwArray	mn=times(mwArray(m),mwArray(n));
		mwArray maxI=times(mn,max( max( power(Im_original,2) ) ));	
   
		int u=0,v=0;

/*		for (u=1;u<=m;u++)
		{	for (v=1;v<=n;v++)
			{
				temp=Im_original(mwArray(u),mwArray(v))-Im_modified(mwArray(u),mwArray(v));
				sumaDif =sumaDif+power(temp,2);
			}
		}
 */
		temp=Im_original-Im_modified;
		sumaDif=sum(sum( power(temp,2) ));
		if( tobool( sumaDif==mwArray(0) ) )
			sumaDif=mwArray(1.0);	
		  			   			   
		S=rdivide( double_func(maxI),sumaDif);
		S=mwArray(10)*log10(S);	 
		return S;				  

	}
	else
	{
		MessageBox("错误:输入图像为彩色图像");	  
		return mwArray(-1);
	}
	

}

mwArray CWaterMarkxView::Similar(mwArray Im_original,mwArray Im_modified)
{
/*	%**************************************************************
	%计算;两个矢量的相似度子程序
	%     输入:  Im_original    原始图像 
	%             Im_modified    修改过的图像
	%     输出:  sim            相似度
	% 注:此程序用来计算两个矢量的相似度,通过相似度可以判定水印是否存在

⌨️ 快捷键说明

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