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

📄 data_compress_systemview.cpp

📁 各种数据压缩和解压的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -