📄 data_compress_systemview.cpp
字号:
// Data_Compress_SystemView.cpp : implementation of the CData_Compress_SystemView class
//
#include "stdafx.h"
#include "Data_Compress_System.h"
#include "Data_Compress_SystemDoc.h"
#include "Data_Compress_SystemView.h"
#include "MainFrm.h"
#include "SplitProc.h"
#include "GrayProc.h"
#include "DlgIntensity.h"
#include "DlgPointStre.h"
#include "DlgPointWin.h"
#include "DlgPointDT.h"
#include "DlgPointDZ.h"
#include "DLGSetAngle.h"
#include "DynamicCompressParam.h"
#include "GeoTrans.h"
#include "FreqCalculate.h"
#include "SpaceFilter.h"
#include "FreqFilter.h"
#include "DLGSetFreq.h"
#include "Coding.h"
#include "Morph.h"
#include "Noise.h"
#include "WaterMarking.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// 浮雕化模式
static enum EmbossType
{
EMBOSS_1 = 0,
EMBOSS_2,
EMBOSS_3,
EMBOSS_4,
EMBOSS_5,
EMBOSS_6,
EMBOSS_7,
EMBOSS_8
};
/////////////////////////////////////////////////////////////////////////////
// CData_Compress_SystemView
IMPLEMENT_DYNCREATE(CData_Compress_SystemView, CScrollView)
BEGIN_MESSAGE_MAP(CData_Compress_SystemView, CScrollView)
//{{AFX_MSG_MAP(CData_Compress_SystemView)
ON_WM_ERASEBKGND()
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
ON_COMMAND(ID_TOGRAY, OnTogray)
ON_COMMAND(ID_RGN_GROW, OnRgnGrow)
ON_WM_LBUTTONDBLCLK()
ON_COMMAND(ID_POINT_INVERT, OnPointInvert)
ON_COMMAND(ID_POINT_EQUA, OnPointEqua)
ON_COMMAND(ID_VIEW_INTENSITY, OnViewYIntensity)
ON_COMMAND(ID_VIEW_R_INTENSITY, OnViewRIntensity)
ON_COMMAND(ID_VIEW_G_INTENSITY, OnViewGIntensity)
ON_COMMAND(ID_VIEW_B_INTENSITY, OnViewBIntensity)
ON_COMMAND(ID_POINT_STRE, OnPointStre)
ON_COMMAND(ID_POINT_WIND, OnPointWind)
ON_COMMAND(ID_POINT_DT, OnPointDt)
ON_COMMAND(ID_POINT_DZ, OnPointDz)
ON_COMMAND(ID_SET_INTENSITY, OnSetIntensity)
ON_COMMAND(ID_POINT_SML, OnPointSml)
ON_COMMAND(ID_POINT_GML, OnPointGml)
ON_COMMAND(ID_DYNAMIC_COMPRESS, OnDynamicCompress)
ON_COMMAND(ID_GEOM_ZOOMIN, OnGeomZoomin)
ON_COMMAND(ID_GEOM_ZOOMOUT, OnGeomZoomout)
ON_COMMAND(ID_FREQ_FOUR, OnFreqFour)
ON_COMMAND(ID_BUTTERWORTH_L, OnButterworthL)
ON_COMMAND(IDM_EMBOSS_1, OnEmboss_1)
ON_COMMAND(IDM_EMBOSS_2, OnEmboss_2)
ON_COMMAND(IDM_EMBOSS_3, OnEmboss_3)
ON_COMMAND(IDM_EMBOSS_4, OnEmboss_4)
ON_COMMAND(IDM_EMBOSS_5, OnEmboss_5)
ON_COMMAND(IDM_EMBOSS_6, OnEmboss_6)
ON_COMMAND(IDM_EMBOSS_7, OnEmboss_7)
ON_COMMAND(IDM_EMBOSS_8, OnEmboss_8)
ON_COMMAND(ID_BUTTERWORTH_H, OnButterworthH)
ON_COMMAND(ID_MUTUAL_FILTER, OnMutualFilter)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_LINE_SMOOTH_FILTER, OnLineSmoothFilter)
ON_COMMAND(ID_LINE_QUICK_FILTER, OnLineQuickFilter)
ON_COMMAND(ID_MEDIAN_FILTER, OnMedianFilter)
ON_COMMAND(ID_JPEG_DECODING, OnJpegDecoding)
ON_COMMAND(ID_RETRORSE_FILTER, OnRetrorseFilter)
ON_COMMAND(ID_WIENER_FILTER, OnWienerFilter)
ON_COMMAND(ID_SOBEL, OnSobel)
ON_COMMAND(ID_PREWITT, OnPrewitt)
ON_COMMAND(ID_ROBERTS, OnRoberts)
ON_COMMAND(ID_LAPLACIAN, OnLaplacian)
ON_COMMAND(ID_GUASS__LAPLACIAN, OnGuassLaplacian)
ON_COMMAND(ID_HOUGH, OnHough)
ON_COMMAND(ID_KRISCH, OnKrisch)
ON_COMMAND(ID_CONTOURDIB, OnContourdib)
ON_COMMAND(ID_TRACEDIB, OnTracedib)
ON_COMMAND(ID_ITERATE_THRESHOLD, OnIterateThreshold)
ON_COMMAND(ID_FREQ_DCT, OnFreqDct)
ON_COMMAND(ID_FREQ_WALH, OnFreqWalh)
ON_COMMAND(ID_H_EROSION, OnHErosion)
ON_COMMAND(ID_V_EROSION, OnVErosion)
ON_COMMAND(ID_H_DILATION, OnHDilation)
ON_COMMAND(ID_V_DILATION, OnVDilation)
ON_COMMAND(ID_OPEN_OPERATE, OnOpenOperate)
ON_COMMAND(ID_CLOSE_OPERATE, OnCloseOperate)
ON_COMMAND(ID_VH_EROSION, OnVhErosion)
ON_COMMAND(ID_VH_DILATION, OnVhDilation)
ON_COMMAND(ID_THIN, OnThin)
ON_COMMAND(ID_RANDOM_NOISE, OnRandomNoise)
ON_COMMAND(ID_SALT_NOISE, OnSaltNoise)
ON_COMMAND(ID_PCX_ENCODING, OnPCXEncoding)
ON_COMMAND(ID_PCX_DECODING, OnPCXDecoding)
ON_COMMAND(ID_INTERACT, OnInteract)
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_INTERACT_BLACK, OnInteractBlack)
ON_COMMAND(ID_INTERACT_WHITE, OnInteractWhite)
ON_COMMAND(ID_LINE_SMOOTH_FILTER2, OnLineSmoothFilter2)
ON_COMMAND(ID_LINE_SMOOTH_FILTER3, OnLineSmoothFilter3)
ON_COMMAND(ID_OVERRUN_FILTER, OnOverrunFilter)
ON_COMMAND(ID_CUTWAVE, OnCutWave)
ON_COMMAND(ID_PSE_FILTER, OnPSE_Filter)
ON_COMMAND(ID_MIN_POWER, OnMinPower)
ON_COMMAND(ID_ROTATE, OnRotate)
ON_COMMAND(ID_RECTINICATION, OnRectinication)
ON_COMMAND(ID_THICK, OnThick)
ON_COMMAND(ID_MAT, OnMat)
ON_COMMAND(ID_HUFFMAN, OnHuffman)
ON_COMMAND(ID_SHANNON_FANNON, OnShannonFannon)
ON_COMMAND(ID_LZW_ENCODING, OnLzwEncoding)
ON_COMMAND(ID_LZW_DECODING, OnLzwDecoding)
ON_COMMAND(ID_SET_WATERMARKING, OnSetWatermarking)
ON_COMMAND(ID_GET_WATERMARKING, OnGetWatermarking)
ON_COMMAND(ID_DWT, OnDwt)
ON_COMMAND(ID_IDWT, OnIdwt)
ON_COMMAND(ID_MENUITEMPC, OnSavePC)
ON_COMMAND(ID_MENUITEMDEPC, OnLoadPC)
ON_COMMAND(ID_JPEG_ENCODING1, OnJpegEncoding1)
ON_COMMAND(ID_JPEG_ENCODING3, OnJpegEncoding3)
ON_COMMAND(ID_JPEG_ENCODING, OnJpegEncoding)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CData_Compress_SystemView construction/destruction
CData_Compress_SystemView::CData_Compress_SystemView()
{
m_nInteract = 0;
}
CData_Compress_SystemView::~CData_Compress_SystemView()
{
}
BOOL CData_Compress_SystemView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////[辅助函数]/////////////////////////////////////////////////
///////////////////////////////////////////
// 获取并报告当前点的颜色值 //
///////////////////////////////////////////
void CData_Compress_SystemView::CurrentRGB(CPoint point)
{
// 获取设备DC
CDC* pDC = GetDC();
// 获取当前点的RGB值
COLORREF clrT = pDC->GetPixel(point);
// 各颜色分量
int R = GetRValue(clrT);
int G = GetGValue(clrT);
int B = GetBValue(clrT);
// 报告当前点颜色值
CString strRGB;
strRGB.Format("当前点颜色值:\r\n\r\n R = %d\r\n G = %d\r\n B = %d", R, G, B);
MessageBox(strRGB, "返回结果", MB_OK);
}
void CData_Compress_SystemView::OnRButtonDown(UINT nFlags, CPoint point)
{
m_nInteract = 0;
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
ReleaseCapture();
CScrollView::OnRButtonDown(nFlags, point);
}
void CData_Compress_SystemView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 保存当前选中点坐标
pDoc->m_ptPoint_I = pDoc->m_ptPoint_II;
pDoc->m_ptPoint_II = point;
// 报告当前RGB值
CurrentRGB(point);
CScrollView::OnLButtonDblClk(nFlags, point);
}
void CData_Compress_SystemView::OnLButtonDown(UINT nFlags, CPoint point)
{
// 在交互状态下对当前点画圆
DrawCircle(point);
// 重画视图
Invalidate();
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 获取设备环境句柄
CDC* pDC = GetDC();
// 判断是否选中已圈矩形
BOOL bResult = pDoc->m_Tracker.HitTest(point) != CRectTracker::hitNothing;
// 如果选中矩形
if (bResult)
{
if(pDoc->m_bIsFrequency)
{
// 获取当前滚动位置
CPoint pt = GetScrollPosition();
// 修正选中矩形在全图中的坐标
pDoc->m_rect[pDoc->m_nRgnNum] = pDoc->m_Tracker.m_rect;
pDoc->m_rect[pDoc->m_nRgnNum].top += pt.y;
pDoc->m_rect[pDoc->m_nRgnNum].bottom += pt.y;
pDoc->m_rect[pDoc->m_nRgnNum].left += pt.x;
pDoc->m_rect[pDoc->m_nRgnNum].right += pt.x;
// 获取当前图象尺寸
CSize size = pDoc->GetDocSize();
// 越界保护
if (pDoc->m_rect[pDoc->m_nRgnNum].top < 0)
pDoc->m_rect[pDoc->m_nRgnNum].top = 0;
if (pDoc->m_rect[pDoc->m_nRgnNum].bottom > size.cy)
pDoc->m_rect[pDoc->m_nRgnNum].bottom = size.cy;
if (pDoc->m_rect[pDoc->m_nRgnNum].left < 0)
pDoc->m_rect[pDoc->m_nRgnNum].left = 0;
if (pDoc->m_rect[pDoc->m_nRgnNum].right > size.cx)
pDoc->m_rect[pDoc->m_nRgnNum].right = size.cx;
// 设置选中区域的颜色
pDoc->m_clsDIB.SetRgnColor(pDoc->GetHDIB(), pDoc->m_rect[pDoc->m_nRgnNum], RGB(0, 0, 0));
// 重画视图
InvalidateRect(&pDoc->m_rect[pDoc->m_nRgnNum]);
// 选中区域个数计数
pDoc->m_nRgnNum++;
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
}
}
// 如果不是选中区域则拖放
else
pDoc->m_Tracker.TrackRubberBand(this, point, TRUE);
// 画选中区域边框
pDoc->m_Tracker.Draw(pDC);
// 释放资源
ReleaseDC(pDC);
CScrollView::OnLButtonDown(nFlags, point);
}
///////////////////////////////////////////
// 在当前点画圆 //
///////////////////////////////////////////
void CData_Compress_SystemView::DrawCircle(CPoint point)
{
if (m_nInteract > 0)
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 获取当前图象尺寸
CSize size = pDoc->GetDocSize();
// 获取当前滚动位置
CPoint pt = GetScrollPosition();
// 标定的区域
CRect rect(point.x + pt.x + 8, point.y + pt.y + 8, point.x + pt.x + 24, point.y + pt.y + 24);
// 越界保护
if (rect.top < 0 || rect.bottom > size.cy + 8 || rect.left < -8 || rect.right > size.cx + 8)
return;
// 获取设备环境句柄
CDC* pDC = GetDC();
// 设置选中区域的颜色
COLORREF col;
if (m_nInteract == 1)
col = RGB(255, 0, 0);
if (m_nInteract == 2)
col = RGB(255, 255, 255);
if (m_nInteract == 2)
col = RGB(0, 0, 0);
pDoc->m_clsDIB.SetCircleColor(pDoc->GetHDIB(), rect, col);
// 重画视图
InvalidateRect(rect);
// 释放资源
ReleaseDC(pDC);
}
}
///////////////////////////////////////////
// 交互标定 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnInteract()
{
m_nInteract = 1;
// SetCapture();
// SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR));
}
void CData_Compress_SystemView::OnInteractBlack()
{
m_nInteract = 2;
// SetCapture();
// SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR));
}
void CData_Compress_SystemView::OnInteractWhite()
{
m_nInteract = 3;
// SetCapture();
// SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR));
}
///////////////////////////////////////////
// 重画视图 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnDraw(CDC* pDC)
{
// 显示等待光标
BeginWaitCursor();
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 获取DIB
HDIB hDIB = pDoc->GetHDIB();
// 判断DIB是否为空
if (hDIB != NULL)
{
LPBYTE lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);
// 获取DIB宽度
int cxDIB = (int) pDoc->m_clsDIB.DIBWidth(lpDIB);
// 获取DIB高度
int cyDIB = (int) pDoc->m_clsDIB.DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL) hDIB);
CRect rcDIB;
rcDIB.top = rcDIB.left = 0;
rcDIB.right = cxDIB;
rcDIB.bottom = cyDIB;
CRect rcDest;
// 判断是否是打印
if (pDC->IsPrinting())
{
// 是打印,计算输出图像的位置和大小,以便符合页面
// 获取打印页面的水平宽度(象素)
int cxPage = pDC->GetDeviceCaps(HORZRES);
// 获取打印页面的垂直高度(象素)
int cyPage = pDC->GetDeviceCaps(VERTRES);
// 获取打印机每英寸象素数
int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
// 计算打印图像大小(缩放,根据页面宽度调整图像大小)
rcDest.top = rcDest.left = 0;
rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch) / ((double)cxDIB * cxInch));
rcDest.right = cxPage;
// 计算打印图像位置(垂直居中)
int temp = cyPage - (rcDest.bottom - rcDest.top);
rcDest.bottom += temp/2;
rcDest.top += temp/2;
}
else // 非打印
{
// 不必缩放图像
rcDest = rcDIB;
}
// 输出DIB
pDoc->m_clsDIB.PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
&rcDIB, pDoc->GetDocPalette());
}
// 恢复正常光标
EndWaitCursor();
}
void CData_Compress_SystemView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
}
/////////////////////////////////////////////////////////////////////////////
// 图像打印 //
/////////////////////////////////////////////////////////////////////////////
BOOL CData_Compress_SystemView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 设置总页数为一。
pInfo->SetMaxPage(1);
return DoPreparePrinting(pInfo);
}
void CData_Compress_SystemView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CData_Compress_SystemView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CData_Compress_SystemView diagnostics
#ifdef _DEBUG
void CData_Compress_SystemView::AssertValid() const
{
CScrollView::AssertValid();
}
void CData_Compress_SystemView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CData_Compress_SystemDoc* CData_Compress_SystemView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CData_Compress_SystemDoc)));
return (CData_Compress_SystemDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CData_Compress_SystemView message handlers
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// //
// 基本位图操作 //
// //
/////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////
// 设置子窗体默认背景色为m_refColorBKG //
///////////////////////////////////////////
BOOL CData_Compress_SystemView::OnEraseBkgnd(CDC* pDC)
{
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
// 创建一个Brush
CBrush brush(pDoc->m_refColorBKG);
// 保存以前的Brush
CBrush* pOldBrush = pDC->SelectObject(&brush);
// 获取重绘区域
CRect rectClip;
pDC->GetClipBox(&rectClip);
// 重绘
pDC->PatBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(), PATCOPY);
// 恢复以前的Brush
pDC->SelectObject(pOldBrush);
// 返回
return TRUE;
}
///////////////////////////////////////////
// 实现新的调色板 //
///////////////////////////////////////////
void CData_Compress_SystemView::OnDoRealize(WPARAM wParam, LPARAM lParam)
{
ASSERT(wParam != NULL);
// 获取文档
CData_Compress_SystemDoc* pDoc = GetDocument();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -