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

📄 watermark.cpp

📁 十分详细的基于Wavelet的图像水印嵌入程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	double psnr;
 		
   	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

    if( pDoc->pnOriPic == NULL || pDoc->pnRecOriPic == NULL )
	{
	    AfxMessageBox( "无比较图像的数据!", MB_OK, 0 );	
	    return;
	}

    int *pO, *pR, t;

    pO = pDoc->pnOriPic;     // m_pdResData 指向重建图的数据
    pR = pDoc->pnRecOriPic ;     // m_pdOriData 指向原图数据 
	
	psnr = 0.0;

	if(pDoc->m_nOriBitCount==8)
	{
		for( long n=0; n<pDoc->m_nOriWidth*pDoc->m_nOriHeight; n++ )
		{

			t = (*pR) - (*pO);
			psnr += (double)( t*t );
			pO++;
			pR++;
		}
		psnr = psnr/((double)pDoc->m_nOriWidth*(double)pDoc->m_nOriHeight);
	}

	CString str;

	if( psnr != 0.0 )        // 信噪比计算有错????????????????
	{
	    psnr = 10*log10( 255.0*255.0/psnr );
		str.Format("PSNR: %8.4f\n",psnr);
	
		AfxMessageBox(str,MB_OK,0);	
	}
	else
		AfxMessageBox("无损变换");
}

void CImageVisualView::OnToolIntensity() 
{
	// TODO: Add your command handler code here
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	int nSizePic;
	nSizePic=pDoc->m_nOriHeight*pDoc->m_nOriWidth;
	int i,p;
	CDialogIntensity dlgIntensity;
	dlgIntensity.m_ndlgSizePic=nSizePic;
	dlgIntensity.m_nPicWidth=pDoc->m_nOriWidth;
	dlgIntensity.m_nPicHeight=pDoc->m_nOriHeight;
	
	dlgIntensity.m_ndlgBitCount=pDoc->m_nOriBitCount;

	for(i=0;i<256;i++)
	{
		dlgIntensity.m_ndlgNumberPoint[i]=0;
		for(p=0;p<3;p++)
			dlgIntensity.m_ndlgColorNumber[i][p]=0;
	}


	if(pDoc->m_nOriBitCount==8)
	{
		for(i=0;i<nSizePic;i++)
		{
			dlgIntensity.m_ndlgNumberPoint[*(pDoc->pnOriPic+i)]++;
		}
	}else if(pDoc->m_nOriBitCount==24)
	{
		for(i=0;i<nSizePic;i++)
		{
			for(p=0;p<3;p++)
			{
				dlgIntensity.m_ndlgColorNumber[*(pDoc->pnOriPic+i*3+p)][p]++;
			}
		}
	}
		

	if(! dlgIntensity.DoModal())
	{
		AfxMessageBox("对话框打开失败");
	}

}

//DEL void CImageVisualView::OnButtonPaint() 
//DEL {
//DEL 	// TODO: Add your control notification handler code here
//DEL 	CClientDC dlgDC(this);
//DEL 
//DEL 	CPen Pen;
//DEL 	CPen *OldPen;
//DEL 	
//DEL 	Pen.CreatePen (PS_SOLID,1,RGB(0,0,200));
//DEL 	OldPen=dlgDC.SelectObject (&Pen);
//DEL 	dlgDC.Rectangle(10,10,400,500);
//DEL }

void CImageVisualView::OnPointInvert() 
{
	// TODO: Add your command handler code here
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	long i,j,l;
	long lgSizePicture;
	int *pn;
	BYTE *pb;

	lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
	

	if( pDoc->m_nOriBitCount== 8 )
	{
		for(i=0;i<lgSizePicture;i++)
		{
			*(pDoc->pnOriPic+i)=255-*(pDoc->pnOriPic+i);
		}
	}
	else if( pDoc->m_nOriBitCount==24 )
	{
		for(i=0;i<lgSizePicture;i++)
		{
			for(int p=0;p<3;p++)
			{
				*(pDoc->pnOriPic+3*i+p)=255-*(pDoc->pnOriPic+3*i+p);
			}
		}


	}
		
	pb=pDoc->pbOriStatic;
	pn=pDoc->pnOriPic;

	if(pDoc->m_nOriBitCount==24)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				for(l=0;l<3;l++){
					*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
					pDoc->pnOriPic=pDoc->pnOriPic+1;
					pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
				}						//for l
			}							//for i
			if(((pDoc->m_nOriWidth*3)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
			}
		}
	}else if(pDoc->m_nOriBitCount==8)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
				pDoc->pnOriPic=pDoc->pnOriPic+1;
				pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
			
			}							//for i
			if(((pDoc->m_nOriWidth)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
			}
		}
	}
	pDoc->pbOriStatic=pb;
	pDoc->pnOriPic=pn;
	Invalidate();	
	
}

void CImageVisualView::OnPointLiner() 
{
	// TODO: Add your command handler code here
	float fA=2.0;
	float fB=-128.0;
	CDialogPointLiner dlgPointLiner;

	dlgPointLiner.m_ffA=fA;
	dlgPointLiner.m_ffB=fB;
		
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	long i,j,l;
	long lgSizePicture;
	int *pn;
	BYTE *pb;

	if(dlgPointLiner.DoModal()!=IDOK)
	{
		return;
	}

	fA=dlgPointLiner.m_ffA;
	fB=dlgPointLiner.m_ffB;
	delete dlgPointLiner;

	lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
	

	if( pDoc->m_nOriBitCount== 8 )
	{
		for(i=0;i<lgSizePicture;i++)
		{
			*(pDoc->pnOriPic+i)=(int)((float)*(pDoc->pnOriPic+i)*fA+fB);
			if(*(pDoc->pnOriPic+i)<0)
			{
				*(pDoc->pnOriPic+i)=0;
			}else if(*(pDoc->pnOriPic+i)>255)
			{
				*(pDoc->pnOriPic+i)=255;
			}
		}
	}
	else if( pDoc->m_nOriBitCount==24 )
	{
		for(i=0;i<lgSizePicture;i++)
		{
			for(int p=0;p<3;p++)
			{
				*(pDoc->pnOriPic+3*i+p)=(int)((float)*(pDoc->pnOriPic+3*i+p)*fA+fB);
			
				if(*(pDoc->pnOriPic+3*i+p)<0)
				{
					*(pDoc->pnOriPic+3*i+p)=0;
				}else if(*(pDoc->pnOriPic+3*i+p)>255)
				{
					*(pDoc->pnOriPic+3*i+p)=255;
				}
			}
		}


	}
		
	pb=pDoc->pbOriStatic;
	pn=pDoc->pnOriPic;

	if(pDoc->m_nOriBitCount==24)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				for(l=0;l<3;l++){
					*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
					pDoc->pnOriPic=pDoc->pnOriPic+1;
					pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
				}						//for l
			}							//for i
			if(((pDoc->m_nOriWidth*3)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
			}
		}
	}else if(pDoc->m_nOriBitCount==8)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
				pDoc->pnOriPic=pDoc->pnOriPic+1;
				pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
			
			}							//for i
			if(((pDoc->m_nOriWidth)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
			}
		}
	}
	pDoc->pbOriStatic=pb;
	pDoc->pnOriPic=pn;
	Invalidate();	


}

void CImageVisualView::OnPointThresholdTrans() 
{
	// TODO: Add your command handler code here
	int nThre=128;
	CDialogPointThreTrans dlgPointThreTrans;

	dlgPointThreTrans.m_nThre=nThre;
		
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	long i,j,l;
	long lgSizePicture;
	int *pn;
	BYTE *pb;

	if(dlgPointThreTrans.DoModal()!=IDOK)
	{
		return;
	}
	
	nThre=dlgPointThreTrans.m_nThre;

	delete dlgPointThreTrans;

	lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
	

	if( pDoc->m_nOriBitCount== 8 )
	{
		for(i=0;i<lgSizePicture;i++)
		{
			
			if(*(pDoc->pnOriPic+i)<=nThre)
			{
				*(pDoc->pnOriPic+i)=0;
			}else if(*(pDoc->pnOriPic+i)>nThre)
			{
				*(pDoc->pnOriPic+i)=255;
			}
		}
	}
	else if( pDoc->m_nOriBitCount==24 )
	{
		for(i=0;i<lgSizePicture;i++)
		{
			for(int p=0;p<3;p++)
			{
				if(*(pDoc->pnOriPic+3*i+p)<=nThre)
				{
					*(pDoc->pnOriPic+3*i+p)=0;
				}else if(*(pDoc->pnOriPic+3*i+p)>nThre)
				{
					*(pDoc->pnOriPic+3*i+p)=255;
				}
			}
		}


	}
		
	pb=pDoc->pbOriStatic;
	pn=pDoc->pnOriPic;

	if(pDoc->m_nOriBitCount==24)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				for(l=0;l<3;l++){
					*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
					pDoc->pnOriPic=pDoc->pnOriPic+1;
					pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
				}						//for l
			}							//for i
			if(((pDoc->m_nOriWidth*3)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
			}
		}
	}else if(pDoc->m_nOriBitCount==8)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
				pDoc->pnOriPic=pDoc->pnOriPic+1;
				pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
			
			}							//for i
			if(((pDoc->m_nOriWidth)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
			}
		}
	}
	pDoc->pbOriStatic=pb;
	pDoc->pnOriPic=pn;
	Invalidate();	
}

void CImageVisualView::OnImageBake() 
{
	// TODO: Add your command handler code here
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	long i,j,l;
	long lgSizePicture;
	int *pn;
	BYTE *pb;

	if(pDoc->m_boolFlag)
	{
		lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
		

		if( pDoc->m_nOriBitCount== 8 )
		{
			for(i=0;i<lgSizePicture;i++)
			{
				*(pDoc->pnOriPic+i)=*(pDoc->pnRecOriPic+i);
			}
		}
		else if( pDoc->m_nOriBitCount==24 )
		{
			for(i=0;i<lgSizePicture;i++)
			{
				for(int p=0;p<3;p++)
				{
					*(pDoc->pnOriPic+3*i+p)=*(pDoc->pnRecOriPic+3*i+p);
				}
			}
		}
			
		pb=pDoc->pbOriStatic;
		pn=pDoc->pnOriPic;

		if(pDoc->m_nOriBitCount==24)
		{
			for(j=0;j<pDoc->m_nOriHeight;j++){
				for(i=0;i<pDoc->m_nOriWidth ;i++){
					for(l=0;l<3;l++){
						*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
						pDoc->pnOriPic=pDoc->pnOriPic+1;
						pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
					}						//for l
				}							//for i
				if(((pDoc->m_nOriWidth*3)%4)!=0){		//加入附加字节
					pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
				}
			}
		}else if(pDoc->m_nOriBitCount==8)
		{
			for(j=0;j<pDoc->m_nOriHeight;j++){
				for(i=0;i<pDoc->m_nOriWidth ;i++){
					*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
					pDoc->pnOriPic=pDoc->pnOriPic+1;
					pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
				
				}							//for i
				if(((pDoc->m_nOriWidth)%4)!=0){		//加入附加字节
					pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
				}
			}
		}
		pDoc->pbOriStatic=pb;
		pDoc->pnOriPic=pn;
		Invalidate();
	}
}

void CImageVisualView::OnPointWinTrans() 
{
	// TODO: Add your command handler code here
	int nThreMax=240;
	int nThreMin=20;
	CDialogPointWinTrans dlgPointWinTrans;

	dlgPointWinTrans.m_nThreMax=nThreMax;
	dlgPointWinTrans.m_nThreMin=nThreMin;
		
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	long i,j,l;
	long lgSizePicture;
	int *pn;
	BYTE *pb;

	if(dlgPointWinTrans.DoModal()!=IDOK)
	{
		return;
	}
	
	nThreMax=dlgPointWinTrans.m_nThreMax;
	nThreMin=dlgPointWinTrans.m_nThreMin;

	delete dlgPointWinTrans;

	lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
	

	if( pDoc->m_nOriBitCount== 8 )
	{
		for(i=0;i<lgSizePicture;i++)
		{
			
			if(*(pDoc->pnOriPic+i)<nThreMin)
			{
				*(pDoc->pnOriPic+i)=0;
			}else if(*(pDoc->pnOriPic+i)>nThreMax)
			{
				*(pDoc->pnOriPic+i)=255;
			}

		}
	}
	else if( pDoc->m_nOriBitCount==24 )
	{
		for(i=0;i<lgSizePicture;i++)
		{
			for(int p=0;p<3;p++)
			{
				if(*(pDoc->pnOriPic+3*i+p)<nThreMin)
				{
					*(pDoc->pnOriPic+3*i+p)=0;
				}else if(*(pDoc->pnOriPic+3*i+p)>nThreMax)
				{
					*(pDoc->pnOriPic+3*i+p)=255;
				}
			}
		}


	}
		
	pb=pDoc->pbOriStatic;
	pn=pDoc->pnOriPic;

	if(pDoc->m_nOriBitCount==24)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				for(l=0;l<3;l++){
					*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
					pDoc->pnOriPic=pDoc->pnOriPic+1;
					pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
				}						//for l
			}							//for i
			if(((pDoc->m_nOriWidth*3)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
			}
		}
	}else if(pDoc->m_nOriBitCount==8)
	{
		for(j=0;j<pDoc->m_nOriHeight;j++){
			for(i=0;i<pDoc->m_nOriWidth ;i++){
				*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
				pDoc->pnOriPic=pDoc->pnOriPic+1;
				pDoc->pbOriStatic=pDoc->pbOriStatic+1;						
			
			}							//for i
			if(((pDoc->m_nOriWidth)%4)!=0){		//加入附加字节
				pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
			}
		}
	}
	pDoc->pbOriStatic=pb;
	pDoc->pnOriPic=pn;
	Invalidate();	
}

void CImageVisualView::OnPointGrayStretch() 
{
	// TODO: Add your command handler code here
	int nGrayX1=20;
	int nGrayY1=30;
	
	int nGrayX2=100;
	int nGrayY2=120;
	CDialogPointGrayStretch dlgPointGrayStretch;

⌨️ 快捷键说明

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