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

📄 dibprocessview.cpp

📁 额外耳闻目睹 挖饿亽亽的额外负担为额外饿本挖 额发挖额额外负担
💻 CPP
字号:
// DibProcessView.cpp : implementation of the CDibProcessView class
//

#include "stdafx.h"
#include "DibProcess.h"

#include "DibProcessDoc.h"
#include "DibProcessView.h"

#include "function.h"
#include "MedianFiltDlg.h"
#include "LaplacSharp.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CDibProcessView* pView;

/////////////////////////////////////////////////////////////////////////////
// CDibProcessView

IMPLEMENT_DYNCREATE(CDibProcessView, CView)

BEGIN_MESSAGE_MAP(CDibProcessView, CView)
	//{{AFX_MSG_MAP(CDibProcessView)
	ON_COMMAND(IDM_HISTENHANCE, OnHistenhance)
	ON_COMMAND(IDM_MEDIANFILTER, OnMedianfilter)
	ON_COMMAND(IDM_LAPLASSHARP, OnLaplassharp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDibProcessView construction/destruction

CDibProcessView::CDibProcessView()
{
	// TODO: add construction code here

}

CDibProcessView::~CDibProcessView()
{
}

BOOL CDibProcessView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDibProcessView drawing

void CDibProcessView::OnDraw(CDC* pDC)
{
	CDibProcessDoc* pDoc = GetDocument();   //获取文档
	ASSERT_VALID(pDoc);
	HGLOBAL hDIB = pDoc->GetHObject();
	
	if(hDIB != NULL)                        //判断DIB是否为空
	{
		LPSTR lpDibSection = (LPSTR) ::GlobalLock(hDIB);
		int cxDIB = (int) pDoc->GetWidth(lpDibSection);
		int cyDIB = (int) pDoc->GetHeight(lpDibSection);
		::GlobalUnlock(hDIB);

		CRect rcDIB;
		rcDIB.top = rcDIB.left = 0;
		rcDIB.bottom = cyDIB;
		rcDIB.right = cxDIB;

		CRect rcDest = rcDIB;
		pDoc->DrawDib(pDC->m_hDC,&rcDest,pDoc->GetHObject(),//重画DIB
			&rcDIB,pDoc->GetDocPal());
	}
}

/////////////////////////////////////////////////////////////////////////////
// CDibProcessView diagnostics

#ifdef _DEBUG
void CDibProcessView::AssertValid() const
{
	CView::AssertValid();
}

void CDibProcessView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CDibProcessView message handlers

void CDibProcessView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();	
	// TODO: Add your specialized code here and/or call the base class
	pView = this;
}


void CDibProcessView::OnHistenhance() 
{
	// TODO: Add your command handler code here
	CDibProcessDoc* pDoc = GetDocument();				// 获取当前文档
	LPSTR	lpDIB;										// 指向当前DIB的指针
	LPSTR   lpDIBBits;								// 指向当前DIB像素指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHObject());	// 锁定DIB
	lpDIBBits = pDoc->GetBits(lpDIB);						// 找到DIB图像象素起始位置
	if (pDoc->GetColorNum(lpDIB) != 256)						// 判断是否是256色位图
	{
		MessageBox("目前只支持256色位图!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);				// 如果不是,提示用户
		::GlobalUnlock((HGLOBAL) pDoc->GetHObject());			// 解除锁定
		return;										// 返回
	}
	BeginWaitCursor();									// 更改光标形状
	GrayHistEnhance(lpDIBBits,pDoc->GetWidth(lpDIB),pDoc->GetHeight(lpDIB));//调用灰度直方图图像增强函数
	pDoc->SetModifiedFlag(TRUE);							// 设置脏标记
	pDoc->UpdateAllViews(NULL);							// 更新视图
	EndWaitCursor();									// 恢复光标
}

void CDibProcessView::OnMedianfilter() //中值滤波
{
	// TODO: Add your command handler code here
		// 查看当前图像灰度直方图	
	// 获取文档
	CDibProcessDoc* pDoc = GetDocument();
	// 指向DIB的指针
	LPSTR lpDIB;
	// 指向DIB象素指针
	LPSTR    lpDIBBits;
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHObject());
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetBits(lpDIB);
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
	if (pDoc->GetColorNum(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);	
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHObject());	
		// 返回
		return;
	}
	int mFilterH;
	int mFilterW; 
	int mFilterMX; 
	int mFilterMY;	
	// 创建对话框
	MedianFiltDlg medianfilter;	
	// 显示对话框,提示用户设定平移量
	if (medianfilter.DoModal() != IDOK)
	{
		// 返回
		return;
	}
	mFilterH=medianfilter.mFilterH;
	mFilterW=medianfilter.mFilterW;
	mFilterMX=medianfilter.mFilterMX; 
	mFilterMY=medianfilter.mFilterMY;
	delete medianfilter;
	// 更改光标形状
	BeginWaitCursor();
	MedianFilter(lpDIBBits,pDoc->GetWidth(lpDIB),pDoc->GetHeight(lpDIB), 
						 mFilterH, mFilterW, 
						 mFilterMX, mFilterMY);
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
	// 更新视图
	pDoc->UpdateAllViews(NULL);
	// 恢复光标
	EndWaitCursor();
}

void CDibProcessView::OnLaplassharp() 
{
	// TODO: Add your command handler code here
	CDibProcessDoc* pDoc = GetDocument();				// 获取当前文档
	LPSTR lpDIB;										// 指向当前DIB的指针
	LPSTR    lpDIBBits;								// 指向当前DIB像素指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHObject());	// 锁定DIB
	lpDIBBits = pDoc->GetBits(lpDIB);						// 找到DIB图像象素起始位置
	if (pDoc->GetColorNum(lpDIB) != 256)						// 判断是否是256色位图
	{
		MessageBox("目前只支持256色位图!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);				// 如果不是,提示用户
		::GlobalUnlock((HGLOBAL) pDoc->GetHObject());			// 解除锁定
		return;										// 返回
	}
	int		mTempH;									// 模板高度
	int		mTempW;									// 模板宽度
	FLOAT	mTempCof;								// 模板系数
	int		mTempMX;								// 模板中心元素X坐标
	int		mTempMY;								// 模板中心元素Y坐标
	double	laplasValue[9];								// 模板元素数组
	BeginWaitCursor();									// 更改光标形状
	mTempW = 3;										// 设置拉普拉斯模板参数
	mTempH = 3;										// 设置拉普拉斯模板参数
	mTempCof = 1.0;									// 设置拉普拉斯模板参数
	mTempMX = 1;										// 设置拉普拉斯模板参数
	mTempMY = 1;										// 设置拉普拉斯模板参数
	CLaplacSharp laplacsharp;								// 实例化对话框
	if (laplacsharp.DoModal() != IDOK)						// 显示对话框,用户设置参数
	{
		return;										// 返回
	}
	//读取对话框用户选择的拉普拉斯模板参数
	laplasValue[0] = laplacsharp.laplasvalue[0];
	laplasValue[1] = laplacsharp.laplasvalue[1];
	laplasValue[2] = laplacsharp.laplasvalue[2];
	laplasValue[3] = laplacsharp.laplasvalue[3];
	laplasValue[4] = laplacsharp.laplasvalue[4];
	laplasValue[5] = laplacsharp.laplasvalue[5];
	laplasValue[6] = laplacsharp.laplasvalue[6];
	laplasValue[7] = laplacsharp.laplasvalue[7];
	laplasValue[8] = laplacsharp.laplasvalue[8];
	delete laplacsharp;									// 删除对话框
	// 调用Template()函数用拉普拉斯模板锐化DIB
	if ( Template(lpDIBBits, pDoc->GetWidth(lpDIB), pDoc->GetHeight(lpDIB), 
		mTempH, mTempW, mTempMX, mTempMY, laplasValue, mTempCof))
	{	
		pDoc->SetModifiedFlag(TRUE);						// 设置脏标记
		pDoc->UpdateAllViews(NULL);						// 更新视图
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	::GlobalUnlock((HGLOBAL) pDoc->GetHObject());				// 解除锁定
	EndWaitCursor();			
}

⌨️ 快捷键说明

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