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

📄 multimark.cpp

📁 十分详细的基于Wavelet的图像水印嵌入程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// MultiMarkView.cpp : implementation of the CMultiMarkView class
//

#include "stdafx.h"
#include "MultiMark.h"

#include "MultiMarkDoc.h"
#include "MultiMarkView.h"
#include "Math.h"
#include "DlgSpaceWMPatchwork.h"
#include "Dct.h"
#include "DialogUpdatePoint.h"
#include "Crypt.h"
#include "DialogChangeMark.h"
#include "IntDwt97.h"
#include "AnalysisSystem.h"
#include "SynthesisSystem.h"

#define BLOCKHEIGHT 6
#define RECLENGTH 64
#define RECW 8
#define RECH 8

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMultiMarkView

IMPLEMENT_DYNCREATE(CMultiMarkView, CScrollView)

BEGIN_MESSAGE_MAP(CMultiMarkView, CScrollView)
	//{{AFX_MSG_MAP(CMultiMarkView)
	ON_COMMAND(ID_SPACE_WATERMARK_PATCHWORK, OnSpaceWatermarkPatchwork)
	ON_COMMAND(ID_FILE_WATERMARK_READ, OnFileWatermarkRead)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_FILE_PSNR, OnFilePsnr)
	ON_COMMAND(ID_SPACE_WATERMARK_PATCHWORK_DRAW, OnSpaceWatermarkPatchworkDraw)
	ON_COMMAND(ID_VISUAL_MARK_DCT_DWT, OnVisualMarkDctDwt)
	ON_COMMAND(VISUAL_MARK_DCT_DWT_DRAW, OnMarkDctDwtDraw)
	ON_COMMAND(ID_M_VISUAL_DISVISUAL, OnMVisualDisvisual)
	ON_COMMAND(ID_M_V_DISV_REMOVE, OnMVDisvRemove)
	ON_COMMAND(ID_M_WEAK_RUBAN, OnMWeakRuban)
	ON_COMMAND(ID_M_WEAK_RUBAN_DRAW, OnMWeakRubanDraw)
	ON_COMMAND(ID_ADAPDTIVE_WAVELET_WATERMARK, OnAdapdtiveWaveletWatermark)
	ON_COMMAND(ID_ADAPDTIVE_WAVELET_WATERMARK_DRAW, OnAdapdtiveWaveletWatermarkDraw)
	ON_COMMAND(ID_ADAPDTIVE_WAVELET_IMAGE, OnAdapdtiveWaveletImage)
	ON_COMMAND(ID_ADAPDTIVE_WAVELET_IMAGE_DRAW, OnAdapdtiveWaveletImageDraw)
	ON_COMMAND(ID_ADAPDTIVE_WAVELET_IMAGE_M, OnAdapdtiveWaveletImageM)
	ON_COMMAND(ID_ADAPDTIVE_WAVELET_IMAGE_DRAW_M, OnAdapdtiveWaveletImageDrawM)
	ON_COMMAND(ID_ADAPDTIVE_WAVELET_ALL_SEARCH, OnAdapdtiveWaveletAllSearch)
	ON_COMMAND(ID_ADAPDTIVE_WAVELET_ALL_SEARCH_DRAW, OnAdapdtiveWaveletAllSearchDraw)
	ON_COMMAND(ID_WEAK_WATERMARK_INSERT, OnWeakWatermarkInsert)
	ON_COMMAND(ID_WEAK_WATERMARK_DRAW, OnWeakWatermarkDraw)
	ON_COMMAND(ID_WEAK_WATERMARK_INTDWT_INSERT, OnWeakWatermarkIntdwtInsert)
	ON_COMMAND(ID_WEAK_WATERMARK_INTDWT_DRAW, OnWeakWatermarkIntdwtDraw)
	ON_COMMAND(ID_UPDATE_POINT, OnUpdatePoint)
	ON_COMMAND(ID_CRYPT_UNIT, OnCryptUnit)
	ON_COMMAND(ID_CRYPT_DESCOMPOSE, OnCryptDescompose)
	ON_COMMAND(ID_CRYPT_RH_FORWARD, OnCryptRhForward)
	ON_COMMAND(ID_MARK_CHANGE, OnMarkChange)
	ON_COMMAND(ID_CRYPT_RH_INVERT, OnCryptRhInvert)
	ON_COMMAND(ID_RIJNDAEL_CRYPT, OnRijndaelCrypt)
	ON_COMMAND(ID_RIJNDAEL_DECRYPT, OnRijndaelDecrypt)
	ON_COMMAND(ID_WEAK_RH_INTDWT_INSERT, OnWeakRhIntdwtInsert)
	ON_COMMAND(ID_WEAK_RH_INTDWT_DRAW, OnWeakRhIntdwtDraw)
	ON_COMMAND(ID_CRYPT_RH_NEW_FORWARD, OnCryptRhNewForward)
	ON_COMMAND(ID_CRYPT_RH_NEW_INVERT, OnCryptRhNewInvert)
	ON_COMMAND(ID_WEAK_RH_NEW_INTDWT_INSERT, OnWeakRhNewIntdwtInsert)
	ON_COMMAND(ID_WEAK_RH_NEW_INTDWT_DRAW, OnWeakRhNewIntdwtDraw)
	ON_COMMAND(ID_WEAK_RH_NEW_INTDWT_DRAW_ERRO, OnWeakRhNewIntdwtDrawErro)
	ON_COMMAND(ID_WEAK_RH_NEW_INTDWT_PARAM_INSERT, OnWeakRhNewIntdwtParamInsert)
	ON_COMMAND(ID_WEAK_RH_NEW_INTDWT_PARAM_DRAW, OnWeakRhNewIntdwtParamDraw)
	ON_COMMAND(ID_WAVELET_PARAM, OnWaveletParam)
	ON_COMMAND(ID_LINE_WAVELET_ANALYSIS, OnLineWaveletAnalysis)
	ON_COMMAND(ID_LINE_READ, OnLineRead)
	ON_COMMAND(ID_BTM_WAVELET_INSERT, OnBtmWaveletInsert)
	ON_COMMAND(ID_BTM_WAVELET_DRAW, OnBtmWaveletDraw)
	ON_COMMAND(ID_BTM_VISUALMODE_INSERT, OnBtmVisualmodeInsert)
	ON_COMMAND(ID_BTM_VISUALMODE_DRAW, OnBtmVisualmodeDraw)
	ON_COMMAND(ID_ADAPT_RATIO_ALL_SEARCH_INSERT, OnAdaptRatioAllSearchInsert)
	ON_COMMAND(ID_ADAPT_RATIO_ALL_SEARCH_DRAW, OnAdaptRatioAllSearchDraw)
	ON_COMMAND(ID_BTM_RUBAN_INSERT, OnBtmRubanInsert)
	ON_COMMAND(ID_LINE_WAVELET_SYNTHESIS, OnLineWaveletSynthesis)
	ON_COMMAND(ID_WEAK_RH_NEW_INTDWT_DRAW_ERRO_NEW, OnWeakRhNewIntdwtDrawErroNew)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMultiMarkView construction/destruction

CMultiMarkView::CMultiMarkView()
{
	// 设定量化因子常数,图像作小波分解4层
	dF[0]=8.0;						//LL4层

	//LH4,HL4,HH4
	dF[1]=14.16;
	dF[2]=14.16;
	dF[3]=17.68;

	//LH3,HL3,HH3
	dF[4]=12.71;
	dF[5]=12.71;
	dF[6]=19.54;

	//LH2,HL2,HH2
	dF[7]=14.68;
	dF[8]=14.68;
	dF[9]=28.41;

	//LH1,HL1,HH1
	dF[10]=23.03;
	dF[11]=23.03;
	dF[12]=58.76;

	//定义常用水印尺寸
	m_nMarkWidth=64;
	m_nMarkHeight=64;

	//初始化水印读取标志
	boolMark=false;
}

CMultiMarkView::~CMultiMarkView()
{
}

BOOL CMultiMarkView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMultiMarkView drawing

void CMultiMarkView::OnDraw(CDC* pDC)
{
	CMultiMarkDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CSize sizeDib;
	if(pDoc->m_Dib.m_lpImage!=NULL)
	{
		sizeDib=pDoc->m_Dib.GetDimensions ();
		pDoc->m_Dib.Draw(pDC,CPoint(0,0),sizeDib);
	}
	if(m_dibMark.m_lpImage!=NULL)
	{
		sizeDib=m_dibMark.GetDimensions ();
		m_dibMark.Draw(pDC,CPoint(pDoc->m_nWidth,0),sizeDib);
	}
	if(m_dibDrawMark.m_lpImage!=NULL)
	{
		sizeDib=m_dibDrawMark.GetDimensions ();
		m_dibDrawMark.Draw(pDC,CPoint(pDoc->m_nWidth,m_nMarkHeight),sizeDib);
	}
}

void CMultiMarkView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CMultiMarkView printing

BOOL CMultiMarkView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMultiMarkView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMultiMarkView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMultiMarkView diagnostics

#ifdef _DEBUG
void CMultiMarkView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CMultiMarkView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CMultiMarkDoc* CMultiMarkView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMultiMarkDoc)));
	return (CMultiMarkDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMultiMarkView message handlers

void CMultiMarkView::OnSpaceWatermarkPatchwork() 
{
	CMultiMarkDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CDlgSpaceWMPatchwork dlgSpaceWMPatchwork;

	int i,j;

	int Seedx=4534,Seedy=5323;
	int Nx=3535,Ny=4362;

	int nbit=2;
	BYTE *pb;
	pb=pDoc->m_pbPic;
	int *nRecPoint;

	nRecPoint=new int[m_nMarkWidth*m_nMarkHeight*2];

	dlgSpaceWMPatchwork.m_nWMPoint=nbit;
	
	int bit=1;

	if(dlgSpaceWMPatchwork.DoModal()==IDOK)
	{
		nbit=dlgSpaceWMPatchwork.m_nWMPoint;
	}

	for(i=0;i<nbit-1;i++)
	{
		bit=bit*2;
	}

	int Lx,Ly;
	int w,h;

	w=pDoc->m_nWidth;
	h=pDoc->m_nHeight;

	Lx=(Seedx*Seedx)%Nx;
	Ly=(Seedy*Seedy)%Ny;

	*(nRecPoint)=(Lx%w);
	*(nRecPoint+1)=(Ly%h);

	int Tempw,Temph;
	BOOL blFlag;
	int count=1;

	while(count<m_nMarkWidth*m_nMarkHeight)
	{
		blFlag=TRUE;
		Lx=(Lx*Lx)%Nx;
		Ly=(Ly*Ly)%Ny;

		Tempw=(Lx%w);
		Temph=(Ly%h);
		
		for(j=0;j<count;j++)
		{
			if((Tempw==*(nRecPoint+2*j))&&(Temph==*(nRecPoint+2*j+1)))
			{
				blFlag=FALSE;
			}
			Lx=Lx+1;
			Ly=Ly+2;
		}
		if(blFlag)
		{
			*(nRecPoint+2*count)=Tempw;
			*(nRecPoint+2*count+1)=Temph;
			count++;
		}
	}

	if(pDoc->m_nBitCount== 8 && m_nMarkBitCount==8)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			if(*(m_pnMark+i)>128)//嵌入1/
			{
				if((*(pb+Temph*w+Tempw)%(2*bit))<bit)
				{
					*(pb+Temph*w+Tempw)=*(pb+Temph*w+Tempw)+bit;
				}
			}else if(*(m_pnMark+i)<=128)
			{
				if((*(pb+Temph*w+Tempw)%(2*bit))>=bit)
				{
					*(pb+Temph*w+Tempw)=*(pb+Temph*w+Tempw)-bit;
				}
			}
		}
	}else if(pDoc->m_nBitCount== 8 && m_nMarkBitCount==24)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			if(*(m_pnMark+3*i)>128)//嵌入1/
			{
				if((*(pb+Temph*w+Tempw)%(2*bit))<bit)
				{
					*(pb+Temph*w+Tempw)=*(pb+Temph*w+Tempw)+bit;
				}
			}else if(*(m_pnMark+3*i)<=128)
			{
				if((*(pb+Temph*w+Tempw)%(2*bit))>=bit)
				{
					*(pb+Temph*w+Tempw)=*(pb+Temph*w+Tempw)-bit;
				}
			}
		}
	}else if(pDoc->m_nBitCount== 24 && m_nMarkBitCount==8)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			if(*(m_pnMark+i)>128)//嵌入1/
			{
				if((*(pb+Temph*w*3+Tempw*3)%(2*bit))<bit)
				{
					*(pb+Temph*w*3+Tempw*3)=*(pb+Temph*w*3+Tempw*3)+bit;
				}
			}else if(*(m_pnMark+i)<=128)
			{
				if((*(pb+Temph*w*3+Tempw*3)%(2*bit))>=bit)
				{
					*(pb+Temph*w*3+Tempw*3)=*(pb+Temph*w*3+Tempw*3)-bit;
				}
			}
		}
	}else if(pDoc->m_nBitCount== 24 && m_nMarkBitCount==24)
	{
		for(i=0;i<m_nMarkWidth*m_nMarkHeight;i++)
		{
			Tempw=*(nRecPoint+2*i);
			Temph=*(nRecPoint+2*i+1);
			if(*(m_pnMark+i*3)>128)//嵌入1/
			{
				if((*(pb+Temph*w*3+Tempw*3)%(2*bit))<bit)
				{
					*(pb+Temph*w*3+Tempw*3)=*(pb+Temph*w*3+Tempw*3)+bit;
				}
			}else if(*(m_pnMark+i*3)<=128)
			{
				if((*(pb+Temph*w*3+Tempw*3)%(2*bit))>=bit)
				{
					*(pb+Temph*w*3+Tempw*3)=*(pb+Temph*w*3+Tempw*3)-bit;
				}
			}
		}
	}

	int l;

	int nDataWidth;

	if(pDoc->m_nBitCount==24)
	{
		nDataWidth=(w*3+3)/4*4;
		for(j=0;j<h;j++){
			for(i=0;i<w ;i++){
				for(l=0;l<3;l++){
					pDoc->m_Dib.m_lpImage[j*nDataWidth+i*3+l]=pb[j*w*3+i*3+l];			
				}						//for l
			}							//for i
		}
	}else if(pDoc->m_nBitCount==8)
	{
		nDataWidth=(w+3)/4*4;
		for(j=0;j<h;j++){
			for(i=0;i<w;i++){
				pDoc->m_Dib.m_lpImage[j*nDataWidth+i]=pb[j*w+i];	
			}							//for i
		}
	}
	free(nRecPoint);
	Invalidate();	
}

void CMultiMarkView::OnFileWatermarkRead() 
{
	CFile fMark;
	CFileDialog dlgMark(TRUE,"bmp","*.bmp");	//显示打开图像的对话框
	int i,j;
	int nLineWidth;
	if(dlgMark.DoModal()==IDOK){
		fMark.Open(dlgMark.GetPathName(),CFile::modeRead);
		if(m_dibMark.Read(&fMark))
		{
			m_nMarkWidth=m_dibMark.m_lpBMIH->biWidth;
			m_nMarkHeight=m_dibMark.m_lpBMIH->biHeight;
			m_nMarkBitCount=m_dibMark.m_lpBMIH->biBitCount;
			if(m_nMarkBitCount==8)
			{
				nLineWidth=(m_nMarkWidth+3)/4*4;
				m_pbMark=new BYTE[m_nMarkWidth*m_nMarkHeight];
				m_pnMark=new int[m_nMarkWidth*m_nMarkHeight];
				for(i=0;i<m_nMarkHeight;i++)
				{
					for(j=0;j<m_nMarkWidth;j++)
					{
						m_pbMark[i*m_nMarkWidth+j]=m_dibMark.m_lpImage[i*nLineWidth+j];
						m_pnMark[i*m_nMarkWidth+j]=(int)m_dibMark.m_lpImage[i*nLineWidth+j];
					}
				}
			}else if(m_nMarkBitCount==24)
			{
				nLineWidth=(m_nMarkWidth*3+3)/4*4;
				m_pbMark=new BYTE[m_nMarkWidth*m_nMarkHeight*3];
				m_pnMark=new int[m_nMarkWidth*m_nMarkHeight*3];
				for(i=0;i<m_nMarkHeight;i++)
				{
					for(j=0;j<m_nMarkWidth*3;j++)
					{
						m_pbMark[i*m_nMarkWidth*3+j]=m_dibMark.m_lpImage[i*nLineWidth+j];
						m_pnMark[i*m_nMarkWidth*3+j]=(int)m_dibMark.m_lpImage[i*nLineWidth+j];
					}
				}
			}
		}
		fMark.Close();
		boolMark=true;
	}

	//设置滚动条
	CMultiMarkDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CSize sizeTotal;
	sizeTotal.cx =pDoc->m_nWidth+m_nMarkWidth;
	sizeTotal.cy =pDoc->m_nHeight;
	SetScrollSizes(MM_TEXT, sizeTotal);
	
	//刷新文档
	Invalidate();
}

void CMultiMarkView::OnFileSave() 
{
	CFile fSaveFile;
	CMultiMarkDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CFileDialog dlgSaveFile(FALSE,"bmp","*.bmp");	//显示写入图像的文件
	if(dlgSaveFile.DoModal()==IDOK){
		fSaveFile.Open (dlgSaveFile.GetPathName(),CFile::modeCreate | CFile::modeWrite );
		pDoc->m_Dib.Write(&fSaveFile);
		fSaveFile.Close();
	}		
}

void CMultiMarkView::OnFilePsnr() 
{
	double dPSNR=0.0;
 		
   	CMultiMarkDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

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

    double dOri,dResult,t;	
	long n;

	if(pDoc->m_nBitCount==8)
	{
		for(n=0; n<(long)pDoc->m_nWidth*(long)pDoc->m_nHeight; n++ )
		{
			dOri=(double)pDoc->m_pnPic[n];
			dResult=(double)pDoc->m_pbPic[n];
			t = dOri-dResult;
			dPSNR += (double)( t*t );
		}
		dPSNR = dPSNR/((double)pDoc->m_nWidth*(double)pDoc->m_nHeight);
	}

	CString str;

	if( dPSNR != 0.0 )        
	{
	    dPSNR = 10*log10( 255.0*255.0/dPSNR );
		str.Format("PSNR: %8.4f\n",dPSNR);
	
		AfxMessageBox(str,MB_OK,0);	
	}
	else
		AfxMessageBox("无损变换");
}

void CMultiMarkView::OnSpaceWatermarkPatchworkDraw() 
{
	CMultiMarkDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CDlgSpaceWMPatchwork dlgSpaceWMPatchwork;

	long i,j;

	int nbit=2;
	BITMAPFILEHEADER BF;
	BITMAPINFOHEADER BI;

	dlgSpaceWMPatchwork.m_nWMPoint=nbit;
	
	int bit=1;
	BYTE *pb;
	int Seedx=4534,Seedy=5323;
	int Nx=3535,Ny=4362;
	
	int *nRecPoint;

	
	nRecPoint=new int[m_nMarkWidth*m_nMarkHeight*2];

	if(dlgSpaceWMPatchwork.DoModal()==IDOK)
	{
		nbit=dlgSpaceWMPatchwork.m_nWMPoint;
	}

	for(i=0;i<nbit-1;i++)
	{
		bit=bit*2;
	}


	int nWaterMarkWidth=64,nWaterMarkHeight=64;

	int Lx,Ly;
	int w,h;

	w=pDoc->m_nWidth;

⌨️ 快捷键说明

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