📄 imagedwtview.cpp
字号:
// ImageDWTView.cpp : implementation of the CImageDWTView class
//
#include "stdafx.h"
#include "ImageDWT.h"
#include "ImageDWTDoc.h"
#include "ImageDWTView.h"
#include "cdib.h"
#include "DlgDWT.h"
#include "DlgIDWT.h"
#include "DWT.h"
#include <complex>
using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CImageDWTView
IMPLEMENT_DYNCREATE(CImageDWTView, CScrollView)
BEGIN_MESSAGE_MAP(CImageDWTView, CScrollView)
//{{AFX_MSG_MAP(CImageDWTView)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
ON_COMMAND(ID_TRANS_DWT, OnTransDwt)
ON_COMMAND(ID_TRANS_IDWT, OnTransIDwt)
ON_COMMAND(ID_FILE_RELOAD, OnFileReload)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CImageDWTView construction/destruction
CImageDWTView::CImageDWTView()
{
// TODO: add construction code here
// 设置当前分解的总级数
m_nDWTCurstep = 0;
// 分配临时内存,并将图象数据存放到临时内存中
m_dwtdata = new double[2048*2048];
}
CImageDWTView::~CImageDWTView()
{
// 释放内存
delete []m_dwtdata;
}
BOOL CImageDWTView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImageDWTView drawing
void CImageDWTView::OnDraw(CDC* pDC)
{
CImageDWTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CSize sizeDibDisplay;
if(!pDoc->m_pDibSrc->IsEmpty())
{
sizeDibDisplay = pDoc->m_pDibSrc->GetDimensions();
pDoc->m_pDibSrc->Draw(pDC,CPoint(0,0),sizeDibDisplay);
}
}
void CImageDWTView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: calculate the total size of this view
CImageDWTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CSize sizeTotal = pDoc->m_pDibSrc->GetDimensions();
SetScrollSizes(MM_TEXT, sizeTotal);
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
/////////////////////////////////////////////////////////////////////////////
// CImageDWTView printing
BOOL CImageDWTView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CImageDWTView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CImageDWTView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CImageDWTView diagnostics
#ifdef _DEBUG
void CImageDWTView::AssertValid() const
{
CScrollView::AssertValid();
}
void CImageDWTView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CImageDWTDoc* CImageDWTView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDWTDoc)));
return (CImageDWTDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageDWTView message handlers 菜单处理消息函数
/*************************************************************************
*
* \函数名称:
* OnFileReload()
*
* \输入参数:
* 无
*
* \返回值:
* 无
*
* \说明:
* 该函数响应ID_FILE_RELOAD点击的消息,并重载DIB
*
*************************************************************************/
void CImageDWTView::OnFileReload()
{
// TODO: Add your command handler code here
CImageDWTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 判断当前图像是否已经被改动
if (pDoc->IsModified())
{
// 提示用户该操作将丢失所有当前的修改
if (::MessageBox(NULL, "重新打开图像将丢失所有改动!是否继续?", "系统提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
{
// 用户取消操作,直接返回
return;
}
}
CFile file;
CString strPathName;
CFileException fe;
strPathName = pDoc->GetPathName();
// 重新打开文件
if( !file.Open(strPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
// 失败
pDoc->ReportSaveLoadException(strPathName, &fe, FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
// 返回
return;
}
// 更改光标
BeginWaitCursor();
// 重新读取图象
if(!pDoc->m_pDibSrc->Read(&file))
{
// 恢复光标形状
EndWaitCursor();
// 返回
return;
}
// 设置当前分解的总级数
m_nDWTCurstep = 0;
// 初始化胀标记为FALSE
pDoc->SetModifiedFlag(FALSE);
// 刷新
pDoc->UpdateAllViews(NULL);
// 恢复光标形状
EndWaitCursor();
// 返回
return;
}
void CImageDWTView::OnEditCopy()
{
// TODO: Add your command handler code here
// 复制当前图像
CImageDWTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDib cdib;
// 打开剪贴板
if (OpenClipboard())
{
// 更改光标形状
BeginWaitCursor();
// 清空剪贴板
EmptyClipboard();
// 复制当前图像到剪贴板
SetClipboardData (CF_DIB, cdib.CopyHandle((HANDLE)pDoc->m_pDibSrc->m_hDib));
// 关闭剪贴板
CloseClipboard();
// 恢复光标
EndWaitCursor();
}
}
void CImageDWTView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
// 如果当前DIB对象不空,复制菜单项有效
pCmdUI->Enable(GetDocument()->m_pDibSrc->m_hDib != NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CImageDWTView message handlers 小波处理消息函数
/****************************************************************************
* 小波图像变换函数
*****************************************************************************/
void CImageDWTView::OnTransDwt()
{
// TODO: Add your command handler code here
CDlgDWT dlgDWT;
CDWT cDwt;
// 显示对话框,提示用户设定平移量
if (dlgDWT.DoModal() != IDOK)
{ return; }
// 获得文档类指针
CImageDWTDoc* pDoc = GetDocument();
// 更改光标形状
BeginWaitCursor();
/******************** 进行小波变换 ******************/
// 指向原始图象的指针
CDib* pDib = pDoc->m_pDibSrc;
// 获取图象的长度和宽度
int ImageWidth = pDib->m_lpBMIH->biWidth;
// 获取图象的长度和宽度
int ImageHeight = pDib->m_lpBMIH->biHeight;
// 设置滤波器组
CString WaveletFilterName;
WaveletFilterName = dlgDWT.m_DWTFilter;
cDwt.SetFilters(WaveletFilterName);
// 小波分解的级数
int nstep = dlgDWT.m_DWTnstep;
// 小波分解
int rsl = cDwt.ImageDWT(pDib->m_lpImage, m_dwtdata,
ImageWidth, ImageHeight,
m_nDWTCurstep, nstep,
cDwt.ExtendMode);
// 小波分解后的分解总级数
m_nDWTCurstep = m_nDWTCurstep + nstep;
// 恢复光标形状
EndWaitCursor();
// 如果小波变换不成功,则直接返回
if (!rsl)
return;
// 设置脏标志
pDoc->SetModifiedFlag(TRUE);
// 更新显示
pDoc->UpdateAllViews(FALSE);
// 删除对话框
delete dlgDWT;
}
/****************************************************************************
* 小波图像反变换函数
*****************************************************************************/
void CImageDWTView::OnTransIDwt()
{
// TODO: Add your command handler code here
CDlgIDWT dlgIDWT;
CDWT cDwt;
// 显示对话框,提示用户设定平移量
if (dlgIDWT.DoModal() != IDOK)
{ return; }
// 获得文档类指针
CImageDWTDoc* pDoc = GetDocument();
// 更改光标形状
BeginWaitCursor();
/******************** 进行小波反变换 ******************/
// 指向图象的指针
CDib * pDib = pDoc->m_pDibSrc;
// 获取图象的长度和宽度
int ImageWidth = pDib->m_lpBMIH->biWidth;
// 获取图象的长度和宽度
int ImageHeight = pDib->m_lpBMIH->biHeight;
// 设置滤波器组
CString WaveletFilterName;
WaveletFilterName = dlgIDWT.m_IDWTFilter;
cDwt.SetFilters(WaveletFilterName);
// 小波合成的级数
int nstep = dlgIDWT.m_IDWTnstep;
if (nstep>m_nDWTCurstep)
{
MessageBox("请减少合成级数!","error",MB_OKCANCEL|MB_ICONERROR);
return;
}
// 小波合成
int rsl = cDwt.ImageIDWT(m_dwtdata, pDib->m_lpImage,
ImageWidth, ImageHeight,
m_nDWTCurstep, nstep,
cDwt.ExtendMode);
// 小波合成后的分解总级数
m_nDWTCurstep = m_nDWTCurstep - nstep;
// 恢复光标形状
EndWaitCursor();
// 如果小波变换不成功,则直接返回
if (!rsl)
return;
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(FALSE);
double *pTemdata = new double [ImageWidth*ImageHeight ];
for (int i=0; i<ImageHeight; i++)
for (int j=0; j<ImageWidth; j++)
pTemdata[i*ImageWidth+j] = pDib->m_lpImage[(ImageHeight-1-i)*ImageWidth+j];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -