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

📄 watermark.cpp

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

#include "stdafx.h"
#include "ImageVisual.h"

#include "ImageVisualDoc.h"
#include "ImageVisualView.h"
#include "math.h"
#include "DialogPointLiner.h"
#include "DialogPointThreTrans.h"
#include "DialogPointWinTrans.h"
#include "DialogPointGrayStretch.h"
#include "DialogGeoTranslation.h"
#include "DialogGeoZoom.h"
#include "DialogWatermarkPatchwork.h"
#include "FloatDCT.h"
#include "Dwt.h"
#include "math.h"
#include "DialogEnhanSmooth.h"
#include "ColorTable.h"
#include "DialogColor.h"
#include "DialogShapeErosion.h"
#include "Edgecontour.h"
#include "DialogHuffman.h"
#include "DialogShannon.h"
#include "Pcx.h"

#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr

DECLARE_HANDLE(HDIB);// DIB句柄
#define PI 3.14159
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CImageVisualView

IMPLEMENT_DYNCREATE(CImageVisualView, CScrollView)

BEGIN_MESSAGE_MAP(CImageVisualView, CScrollView)
	//{{AFX_MSG_MAP(CImageVisualView)
	ON_COMMAND(ID_MARK_READ, OnMarkRead)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_INSERT_WATERMARK, OnInsertWatermark)
	ON_COMMAND(ID_DRAW_WATERMARK, OnDrawWatermark)
	ON_COMMAND(ID_TOOL_PSNR, OnToolPsnr)
	ON_COMMAND(ID_TOOL_INTENSITY, OnToolIntensity)
	ON_COMMAND(ID_POINT_INVERT, OnPointInvert)
	ON_COMMAND(ID_POINT_LINER, OnPointLiner)
	ON_COMMAND(ID_POINT_THRESHOLD_TRANS, OnPointThresholdTrans)
	ON_COMMAND(ID_IMAGE_BAKE, OnImageBake)
	ON_COMMAND(ID_POINT_WIN_TRANS, OnPointWinTrans)
	ON_COMMAND(ID_POINT_GRAY_STRETCH, OnPointGrayStretch)
	ON_COMMAND(ID_POINT_INTE_EQUALIZE, OnPointInteEqualize)
	ON_COMMAND(ID_GEO_TRANSLATION, OnGeoTranslation)
	ON_COMMAND(ID_GEO_MIRROR_S, OnGeoMirrorS)
	ON_COMMAND(ID_GEO_MIRROR_H, OnGeoMirrorH)
	ON_COMMAND(ID_GEO_ROTATION, OnGeoRotation)
	ON_COMMAND(ID_GEO_ZOOM, OnGeoZoom)
	ON_COMMAND(ID_WATERMARK_PATCHWORK, OnWatermarkPatchwork)
	ON_COMMAND(ID_RESTORE_BLURDIB, OnRestoreBlurdib)
	ON_COMMAND(ID_WATERMARK_PATCHWORK_DRAW, OnWatermarkPatchworkDraw)
	ON_COMMAND(ID_WATERMARK_HASH_ONEWAY, OnWatermarkHashOneway)
	ON_COMMAND(ID_WATERMARK_DRAW_HASH, OnWatermarkDrawHash)
	ON_COMMAND(ID_WATERMARK_T_DCT_GRAY, OnWatermarkTDctGray)
	ON_COMMAND(ID_LOSS_FDCT, OnLossFdct)
	ON_COMMAND(ID_WATERMARK_T_DCT_GRAY_DRAW, OnWatermarkTDctGrayDraw)
	ON_COMMAND(ID_W_TEST, OnWTest)
	ON_COMMAND(ID_WATERMARK_T_FLOAT_WAVELET_EMMBEND, OnWatermarkTFloatWaveletEmmbend)
	ON_COMMAND(ID_COMPRESS_DCT, OnCompressDct)
	ON_COMMAND(ID_VISUALWATERMARK_DCT, OnVisualwatermarkDct)
	ON_COMMAND(ID_VISUALWATERMARK_DCT_DRAW, OnVisualwatermarkDctDraw)
	ON_COMMAND(ID_GEO_ROTATION_ANY_ANGLE, OnGeoRotationAnyAngle)
	ON_COMMAND(ID_GEO_ROTATION_INTERPOLATION, OnGeoRotationInterpolation)
	ON_COMMAND(ID_Z_FOURIER, OnZFourier)
	ON_COMMAND(ID_Z_FOURIER_INVERT, OnZFourierInvert)
	ON_COMMAND(ID_Z_DCT, OnZDct)
	ON_COMMAND(ID_Z_DCT_INVERT, OnZDctInvert)
	ON_COMMAND(ID_Z_WALSH, OnZWalsh)
	ON_COMMAND(ID_Z_WALSH_INVERT, OnZWalshInvert)
	ON_COMMAND(ID_ENHA_SMOOTH, OnEnhaSmooth)
	ON_COMMAND(ID_ENHAN_GUASS, OnEnhanGuass)
	ON_COMMAND(ID_ENHAN_MEDIAN_FILTER, OnEnhanMedianFilter)
	ON_COMMAND(ID_ENHAN_GRADSHARP, OnEnhanGradsharp)
	ON_COMMAND(ID_ENHAN_LAPLATH, OnEnhanLaplath)
	ON_COMMAND(ID_ENHAN_GUASS_SHARP, OnEnhanGuassSharp)
	ON_COMMAND(ID_FILE_COLOR, OnFileColor)
	ON_COMMAND(ID_FILE_COLOR_GRADE, OnFileColorGrade)
	ON_COMMAND(ID_FILE_256_GRAY, OnFile256Gray)
	ON_COMMAND(ID_SHAPE_EROSION, OnShapeErosion)
	ON_COMMAND(ID_SHAPE_DILATION, OnShapeDilation)
	ON_COMMAND(ID_SHAPE_OPEN, OnShapeOpen)
	ON_COMMAND(ID_SHAPE_CLOSE, OnShapeClose)
	ON_COMMAND(ID_SHAPE_THIN, OnShapeThin)
	ON_COMMAND(ID_EDGE_SOBEL, OnEdgeSobel)
	ON_COMMAND(ID_ENDGE_ROBERT, OnEndgeRobert)
	ON_COMMAND(ID_EDGE_PREWITT, OnEdgePrewitt)
	ON_COMMAND(ID_EDGE_KIRSCH, OnEdgeKirsch)
	ON_COMMAND(ID_EDGE_GUASS, OnEdgeGuass)
	ON_COMMAND(ID_EDGE_LINE, OnEdgeLine)
	ON_COMMAND(ID_EDGE_CONTOUR, OnEdgeContour)
	ON_COMMAND(ID_EDGE_TRACE, OnEdgeTrace)
	ON_COMMAND(ID_EDGE_FILL_SIMPLE, OnEdgeFillSimple)
	ON_COMMAND(ID_EDGE_SCAN, OnEdgeScan)
	ON_COMMAND(ID_DISMENBER_THRESHOLD, OnDismenberThreshold)
	ON_COMMAND(ID_DISMENBER_HPROJECT, OnDismenberHproject)
	ON_COMMAND(ID_DISMENBER_VPROJECT, OnDismenberVproject)
	ON_COMMAND(ID_DISMENBER_ADD, OnDismenberAdd)
	ON_COMMAND(ID_DISMENBER_MINUS, OnDismenberMinus)
	ON_COMMAND(ID_DISMENBER_T, OnDismenberT)
	ON_COMMAND(ID_RESTORE_BLUR, OnRestoreBlur)
	ON_COMMAND(ID_RESTORE_INVERT_BLUR, OnRestoreInvertBlur)
	ON_COMMAND(ID_RESTORE_BLUR_NOISE, OnRestoreBlurNoise)
	ON_COMMAND(ID_RESTORE_WIENER, OnRestoreWiener)
	ON_COMMAND(ID_RESTORE_NOISE_RANDOM, OnRestoreNoiseRandom)
	ON_COMMAND(ID_RESTORE_SALT_NOISE, OnRestoreSaltNoise)
	ON_COMMAND(ID_COMPRESS_HUFFMAN, OnCompressHuffman)
	ON_COMMAND(ID_COMPRESS_SHANNON, OnCompressShannon)
	ON_COMMAND(ID_COMPRESS_PCX_SAVE, OnCompressPcxSave)
	ON_COMMAND(ID_COMPRESS_PCX_OP, OnCompressPcxOp)
	ON_COMMAND(ID_COMPRESS_LOADPCX, OnCompressLoadpcx)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CImageVisualView construction/destruction

CImageVisualView::CImageVisualView()
{
	// TODO: add construction code here
	blDrawMark=FALSE;
	blTran=FALSE;
	m_nMarkHeight=64;
	m_nMarkWidth=64;

}

CImageVisualView::~CImageVisualView()
{
}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageVisualView drawing

void CImageVisualView::OnDraw(CDC* pDC)
{
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CSize sizeDib=pDoc->m_dibOriPic.GetDimensions ();
	pDoc->m_dibOriPic.Draw(pDC,CPoint(0,0),sizeDib);

	if(pnMarkPic!=NULL){
		sizeDib=m_dibMarkPic.GetDimensions ();
		m_dibMarkPic.Draw(pDC,CPoint(pDoc->m_nOriWidth,0),sizeDib);
	}
	if(blDrawMark)
	{
		sizeDib=m_dibDrawMark.GetDimensions ();
		m_dibDrawMark.Draw(pDC,CPoint(pDoc->m_nOriWidth,m_nMarkHeight),sizeDib);
	}
}

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

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

/////////////////////////////////////////////////////////////////////////////
// CImageVisualView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CImageVisualView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CImageVisualView message handlers

void CImageVisualView::OnMarkRead() 
{
	// TODO: Add your command handler code here
	BYTE *pb;				//读取图像数据指针
//	long lgSizePicture;		//图像的大小
	int i,j,l;
	int *pn;

	CFile m_fOutFile;
	CFile m_fInFile;

	CFileDialog dlg(TRUE,"bmp","*.bmp");	//显示打开图像的对话框
	if(dlg.DoModal()==IDOK){
		sMarkFileName=dlg.GetPathName();//获取打开图像的路径
	}
	
	if(sMarkFileName!=""){				//判断图像的路径名非空
		m_fInFile.Open(sMarkFileName,CFile::modeRead);//以只读的方式打开图像
		
		/////////////////////////////////////////////////////////////
		///////////////////////////读取图像的信息////////////////////
		if(m_dibMarkPic.Read(&m_fInFile)==TRUE){			//读取图像
			m_nMarkWidth=m_dibMarkPic.m_lpBMIH ->biWidth ;//获取图像的宽度
			m_nMarkHeight=m_dibMarkPic.m_lpBMIH ->biHeight ;//获取图像的高度
			m_nMarkBitCount=m_dibMarkPic.m_lpBMIH->biBitCount;	//获取图像的颜色数
			
			pb=m_dibMarkPic.m_lpImage ;	//获取图像的数据指针
				
			pbMarkStatic=pb;			//设置图像数据静态指针
			if(m_nMarkBitCount==24)
			{

				pnMarkPic=(int *)malloc(sizeof(int) * m_nMarkWidth*m_nMarkHeight*3);
				pn=pnMarkPic;
								
//				lgSizePicture=m_nMarkWidth*m_nMarkHeight;		//计算图像的尺寸

				for( j=0;j<m_nMarkHeight;j++){			//将图像数据赋值给数组icCol
					for( i=0;i<m_nMarkWidth;i++){
						for( l=0;l<3;l++){
							*pnMarkPic=(int)*pb;
							pb=pb+1;
							pnMarkPic=pnMarkPic+1;
						}
					}
					if(((m_nMarkWidth*3)%4)!=0){
						pb=pb+4-((m_nMarkWidth*3)%4);		//忽略图像的附加数据
					}
				}
			}else if(m_nMarkBitCount==8)
			{
				pnMarkPic=(int *)malloc(sizeof(int) * m_nMarkWidth*m_nMarkHeight);
				pn=pnMarkPic;
				
				for( j=0;j<m_nMarkHeight;j++){			//将图像数据赋值给数组icCol
					for( i=0;i<m_nMarkWidth;i++){
						*pnMarkPic=(int)*pb;
						pb=pb+1;
						pnMarkPic=pnMarkPic+1;
					
					}
					if(((m_nMarkWidth)%4)!=0){
						pb=pb+4-((m_nMarkWidth)%4);		//忽略图像的附加数据
					}
				}
			}else
				MessageBox("图像不是256色或者3、24位真彩图");
					
			m_fInFile.Close ();
			pnMarkPic=pn;
		}
	}
	Invalidate();
}

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

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

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

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

	lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
	
	pnI= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth];

	
	if( pDoc->m_nOriBitCount== 8 )
	{
		pnRecIntW= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth];

		for( i = 0; i < lgSizePicture; i++ )	
			*( pnI + i) = (*( pDoc->pnOriPic+i)-128);

		m_IntWT.IntWT_2D( pnI, pDoc->m_nOriHeight, pDoc->m_nOriWidth, 1, 1 );
		
		memcpy( pnRecIntW, pnI, sizeof(int)*lgSizePicture );

		for(i=0;i<lgSizePicture;i++)
		{
			if((*(pnI+i)+128)<0)
			{
				temp=0;
			}
			else if((*(pnI+i)+128)>255)
			{
				temp=255;
			}
			else
				temp=(int)(*(pnI+i)+128);

			*(pnI+i)=temp;
		}
		
		memcpy( pDoc->pnOriPic, pnI, sizeof(int)*lgSizePicture );

	}
	else if( pDoc->m_nOriBitCount==24 )
	{
		pnRecIntW= new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth*(long)3];
	
		for(int p=0;p<3;p++)
		{
			for( i = 0; i < lgSizePicture; i++ )	
				*( pnI + i) = (*( pDoc->pnOriPic+3*i+p)-128);

			m_IntWT.IntWT_2D( pnI, pDoc->m_nOriHeight, pDoc->m_nOriWidth, 1, 1 );
			
			for( i = 0; i < lgSizePicture; i++ )	
				*( pnRecIntW+3*i+p)= (*( pnI + i));

			for(i=0;i<lgSizePicture;i++)
			{
				if((*(pnI+i)+128)<0)
				{
					temp=0;
				}
				else if((*(pnI+i)+128)>255)
				{
					temp=255;
				}
				else
					temp=(int)(*(pnI+i)+128);

				*(pnI+i)=temp;
			}
			
			for( i = 0; i < lgSizePicture; i++ )	
				*( pDoc->pnOriPic+3*i+p)= (*( pnI + i));
		}

	}
		
	free(pnI);
	
	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::OnDrawWatermark() 
{
	// TODO: Add your command handler code here
	CImageVisualDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

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

	lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
	
	pnI = new int [(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth];
	
	if( pDoc->m_nOriBitCount== 8 )
	{
		for( i = 0; i < lgSizePicture; i++ )	
			*( pnI + i) =*( pnRecIntW+i);

		m_IntWT.IntWT_2D_I( pnI, pDoc->m_nOriHeight, pDoc->m_nOriWidth, 1, 1 );	

		for(i=0;i<lgSizePicture;i++)
		{
			if((*(pnI+i)+128)<0)
			{
				temp=0;
			}
			else if((*(pnI+i)+128)>255)
			{
				temp=255;
			}
			else
				temp=(int)(*(pnI+i)+128);

			*(pnI+i)=temp;
		}
		
		memcpy( pDoc->pnOriPic, pnI, sizeof(int)*lgSizePicture );

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

			m_IntWT.IntWT_2D_I( pnI, pDoc->m_nOriHeight, pDoc->m_nOriWidth, 1, 1 );	

			for(i=0;i<lgSizePicture;i++)
			{
				if((*(pnI+i)+128)<0)
				{
					temp=0;
				}
				else if((*(pnI+i)+128)>255)
				{
					temp=255;
				}
				else
					temp=(int)(*(pnI+i)+128);

				*(pnI+i)=temp;
			}
			
			for( i = 0; i < lgSizePicture; i++ )	
				*( pDoc->pnOriPic+3*i+p)= (*( pnI + i));
		}

	}
		
	free(pnI);
	
	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::OnToolPsnr() 
{
	// TODO: Add your command handler code here

⌨️ 快捷键说明

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