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