📄 multimark.cpp
字号:
// 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 + -