www.pudn.com > FingerPro.rar > FingerProView.cpp


// FingerProView.cpp : implementation of the CFingerProView class 
// 
 
#include "stdafx.h" 
#include "FingerPro.h" 
 
#include "FingerProDoc.h" 
#include "FingerProView.h" 
#include "MainFrm.h" 
 
#include "DlgSetBinary.h" 
#include "DlgSmooth.h" 
#include "DlgMidFilter.h" 
#include "DlgSharpThre.h" 
#include "DlgPointStre.h" 
#include "DlgIntensity.h" 
 
#include "ColorTable.h" 
#include "PointTrans.h" 
#include "TemplateTrans.h" 
#include "morph.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CFingerProView 
extern BOOL b_load;               
extern BOOL b_changetogray;	   
extern BOOL b_binary;             
 
IMPLEMENT_DYNCREATE(CFingerProView, CView) 
 
BEGIN_MESSAGE_MAP(CFingerProView, CView) 
	//{{AFX_MSG_MAP(CFingerProView) 
	ON_COMMAND(ID_256toGray, On256toGray) 
	ON_COMMAND(ID_Binary, OnBinary) 
	ON_COMMAND(ID_ENHA_SMOOTH, OnEnhaSmooth) 
	ON_COMMAND(ID_ENHA_MidianF, OnENHAMidianF) 
	ON_COMMAND(ID_ENHA_SHARP, OnEnhaSharp) 
	ON_COMMAND(ID_ENHA_GRADSHARP, OnEnhaGradsharp) 
	ON_COMMAND(ID_MORPH_THINING, OnMorphThining) 
	ON_COMMAND(ID_GRAYSCR, OnGrayscr) 
	ON_COMMAND(ID_VIEW_INTENSITY, OnViewIntensity) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFingerProView construction/destruction 
 
CFingerProView::CFingerProView() 
{ 
	// TODO: add construction code here              
	b_changetogray=false;	  
	b_binary=false; 
} 
 
CFingerProView::~CFingerProView() 
{ 
} 
 
BOOL CFingerProView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CFingerProView drawing 
 
void CFingerProView::OnDraw(CDC* pDC) 
{ 
	// 显示等待光标 
	BeginWaitCursor(); 
 
	CFingerProDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
	 
	// 获取DIB 
	HDIB hDIB = pDoc->GetHDIB(); 
	 
	// 判断DIB是否为空 
	if (hDIB != NULL) 
	{ 
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); 
		 
		// 获取DIB宽度 
		int cxDIB = (int) ::DIBWidth(lpDIB); 
		 
		// 获取DIB高度 
		int cyDIB = (int) ::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 
		::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(), 
			&rcDIB, pDoc->GetDocPalette()); 
	} 
	 
	// 恢复正常光标 
	EndWaitCursor(); 
	 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CFingerProView printing 
 
BOOL CFingerProView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CFingerProView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CFingerProView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CFingerProView diagnostics 
 
#ifdef _DEBUG 
void CFingerProView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CFingerProView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CFingerProDoc* CFingerProView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFingerProDoc))); 
	return (CFingerProDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CFingerProView message handlers 
 
void CFingerProView::On256toGray()  
{ 
	// TODO: Add your command handler code here 
	// 将256色位图转换成灰度图 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
	 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 颜色表中的颜色数目 
	WORD wNumColors; 
	 
	// 获取DIB中颜色表中的颜色数目 
	wNumColors = ::DIBNumColors(lpDIB); 
	 
	// 判断是否是8-bpp位图 
	if (wNumColors != 256) 
	{ 
		// 提示用户 
		MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 指向DIB象素的指针 
	BYTE *	lpSrc; 
	 
	// 循环变量 
	LONG	i; 
	LONG	j; 
	 
	// 图像宽度 
	LONG	lWidth; 
	 
	// 图像高度 
	LONG	lHeight; 
	 
	// 图像每行的字节数 
	LONG	lLineBytes; 
	 
	// 指向BITMAPINFO结构的指针(Win3.0) 
	LPBITMAPINFO lpbmi; 
	 
	// 指向BITMAPCOREINFO结构的指针 
	LPBITMAPCOREINFO lpbmc; 
	 
	// 表明是否是Win3.0 DIB的标记 
	BOOL bWinStyleDIB; 
	 
	// 获取指向BITMAPINFO结构的指针(Win3.0) 
	lpbmi = (LPBITMAPINFO)lpDIB; 
	 
	// 获取指向BITMAPCOREINFO结构的指针 
	lpbmc = (LPBITMAPCOREINFO)lpDIB; 
	 
	// 灰度映射表 
	BYTE bMap[256]; 
	 
	// 判断是否是WIN3.0的DIB 
	bWinStyleDIB = IS_WIN30_DIB(lpDIB); 
	 
	// 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板 
	for (i = 0; i < 256; i ++) 
	{ 
		if (bWinStyleDIB) 
		{ 
			// 计算该颜色对应的灰度值 
			bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed + 
						     0.587 * lpbmi->bmiColors[i].rgbGreen + 
					         0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5); 
			 
			// 更新DIB调色板红色分量 
			lpbmi->bmiColors[i].rgbRed = i; 
			 
			// 更新DIB调色板绿色分量 
			lpbmi->bmiColors[i].rgbGreen = i; 
			 
			// 更新DIB调色板蓝色分量 
			lpbmi->bmiColors[i].rgbBlue = i; 
			 
			// 更新DIB调色板保留位 
			lpbmi->bmiColors[i].rgbReserved = 0; 
		} 
		else 
		{ 
			// 计算该颜色对应的灰度值 
			bMap[i] = (BYTE)(0.299 * lpbmc->bmciColors[i].rgbtRed + 
						     0.587 * lpbmc->bmciColors[i].rgbtGreen + 
					         0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5); 
			 
			// 更新DIB调色板红色分量 
			lpbmc->bmciColors[i].rgbtRed = i; 
			 
			// 更新DIB调色板绿色分量 
			lpbmc->bmciColors[i].rgbtGreen = i; 
			 
			// 更新DIB调色板蓝色分量 
			lpbmc->bmciColors[i].rgbtBlue = i; 
		} 
	} 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB);	 
	 
	// 获取图像宽度 
	lWidth = ::DIBWidth(lpDIB); 
	 
	// 获取图像高度 
	lHeight = ::DIBHeight(lpDIB); 
	 
	// 计算图像每行的字节数 
	lLineBytes = WIDTHBYTES(lWidth * 8); 
	 
	// 更换每个象素的颜色索引(即按照灰度映射表换成灰度值) 
	// 每行 
	for(i = 0; i < lHeight; i++) 
	{ 
		// 每列 
		for(j = 0; j < lWidth; j++) 
		{ 
			// 指向DIB第i行,第j个象素的指针 
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; 
			 
			// 变换 
			*lpSrc = bMap[*lpSrc]; 
		} 
	} 
	 
	// 替换当前调色板为灰度调色板 
	pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable[0]); 
	 
	// 设置脏标记 
	pDoc->SetModifiedFlag(TRUE); 
	 
	// 实现新的调色板 
	OnDoRealize((WPARAM)m_hWnd,0); 
	 
	// 更新视图 
	pDoc->UpdateAllViews(NULL); 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
	 
	b_changetogray=true; 
} 
 
LRESULT CFingerProView::OnDoRealize(WPARAM wParam, LPARAM) 
{ 
	ASSERT(wParam != NULL); 
 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 判断DIB是否为空 
	if (pDoc->GetHDIB() == NULL) 
	{ 
		// 直接返回 
		return 0L; 
	} 
	 
	// 获取Palette 
	CPalette* pPal = pDoc->GetDocPalette(); 
	if (pPal != NULL) 
	{ 
		// 获取MainFrame 
		CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd; 
		ASSERT_KINDOF(CMainFrame, pAppFrame); 
		 
		CClientDC appDC(pAppFrame); 
 
		// All views but one should be a background palette. 
		// wParam contains a handle to the active view, so the SelectPalette 
		// bForceBackground flag is FALSE only if wParam == m_hWnd (this view) 
		CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd); 
		 
		if (oldPalette != NULL) 
		{ 
			UINT nColorsChanged = appDC.RealizePalette(); 
			if (nColorsChanged > 0) 
				pDoc->UpdateAllViews(NULL); 
			appDC.SelectPalette(oldPalette, TRUE); 
		} 
		else 
		{ 
			TRACE0("\tCFingerProView::OnPaletteChanged中调用SelectPalette()失败!\n"); 
		} 
	} 
	 
	return 0L; 
} 
	 
 
 
void CFingerProView::OnBinary()  
{ 
	// TODO: Add your command handler code here 
	// 阈值变换 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
 
	if(!b_changetogray) 
	{ 
		AfxMessageBox("请先将您的图片转换为灰度图!"); 
		return; 
	} 
	 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 参数对话框 
	CDlgSetBinary  dlgPara; 
	 
	// 阈值 
	BYTE	bThre; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的阈值变换,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的阈值变换!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	// 初始化变量值 
	dlgPara.m_Thre = 128; 
	 
	// 显示对话框,提示用户设定阈值 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 获取用户设定的阈值 
	bThre = dlgPara.m_Thre; 
	 
	// 删除对话框 
	delete dlgPara;	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用ThresholdTrans()函数进行阈值变换 
	ThresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre); 
	 
	// 设置脏标记 
	pDoc->SetModifiedFlag(TRUE); 
	 
	// 更新视图 
	pDoc->UpdateAllViews(NULL); 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 恢复光标 
	EndWaitCursor(); 
 
	b_binary=true; 
} 
	 
 
void CFingerProView::OnEnhaSmooth()  
{ 
	// TODO: Add your command handler code here 
	// 图像平滑 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
	 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 模板高度 
	int		iTempH; 
	 
	// 模板宽度 
	int		iTempW; 
	 
	// 模板系数 
	FLOAT	fTempC; 
	 
	// 模板中心元素X坐标 
	int		iTempMX; 
	 
	// 模板中心元素Y坐标 
	int		iTempMY; 
	 
	// 模板元素数组 
	FLOAT	aValue[25]; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的平滑!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	// 创建对话框 
	CDlgSmooth dlgPara; 
	 
	// 给模板数组赋初值(为平均模板) 
	aValue[0] = 1.0; 
	aValue[1] = 1.0; 
	aValue[2] = 1.0; 
	aValue[3] = 0.0; 
	aValue[4] = 0.0; 
	aValue[5] = 1.0; 
	aValue[6] = 1.0; 
	aValue[7] = 1.0; 
	aValue[8] = 0.0; 
	aValue[9] = 0.0; 
	aValue[10] = 1.0; 
	aValue[11] = 1.0; 
	aValue[12] = 1.0; 
	aValue[13] = 0.0; 
	aValue[14] = 0.0; 
	aValue[15] = 0.0; 
	aValue[16] = 0.0; 
	aValue[17] = 0.0; 
	aValue[18] = 0.0; 
	aValue[19] = 0.0; 
	aValue[20] = 0.0; 
	aValue[21] = 0.0; 
	aValue[22] = 0.0; 
	aValue[23] = 0.0; 
	aValue[24] = 0.0; 
	 
	// 初始化对话框变量值 
	dlgPara.m_intType = 0; 
	dlgPara.m_iTempH  = 3; 
	dlgPara.m_iTempW  = 3; 
	dlgPara.m_iTempMX = 1; 
	dlgPara.m_iTempMY = 1; 
	dlgPara.m_fTempC  = (FLOAT) (1.0 / 9.0); 
	dlgPara.m_fpArray = aValue; 
	 
	// 显示对话框,提示用户设定平移量 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 获取用户设定的平移量 
	iTempH  = dlgPara.m_iTempH; 
	iTempW  = dlgPara.m_iTempW; 
	iTempMX = dlgPara.m_iTempMX; 
	iTempMY = dlgPara.m_iTempMY; 
	fTempC  = dlgPara.m_fTempC; 
	 
	// 删除对话框 
	delete dlgPara;	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用Template()函数平滑DIB 
	if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),  
		  iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
	 
} 
 
void CFingerProView::OnENHAMidianF()  
{ 
	// TODO: Add your command handler code here 
	// 中值滤波 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
	 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 滤波器的高度 
	int iFilterH; 
	 
	// 滤波器的宽度 
	int iFilterW; 
	 
	// 中心元素的X坐标 
	int iFilterMX; 
	 
	// 中心元素的Y坐标 
	int iFilterMY; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的中值滤波!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	// 创建对话框 
	CDlgMidFilter dlgPara; 
	 
	// 初始化变量值 
	dlgPara.m_iFilterType = 0; 
	dlgPara.m_iFilterH = 3; 
	dlgPara.m_iFilterW = 1; 
	dlgPara.m_iFilterMX = 0; 
	dlgPara.m_iFilterMY = 1; 
	 
	// 显示对话框,提示用户设定平移量 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 获取用户的设定 
	iFilterH = dlgPara.m_iFilterH; 
	iFilterW = dlgPara.m_iFilterW; 
	iFilterMX = dlgPara.m_iFilterMX; 
	iFilterMY = dlgPara.m_iFilterMY; 
	 
	// 删除对话框 
	delete dlgPara;	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用MedianFilter()函数中值滤波 
	if (::MedianFilter(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),  
		  iFilterH, iFilterW, iFilterMX, iFilterMY)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor();	 
} 
 
void CFingerProView::OnEnhaSharp()  
{ 
	// TODO: Add your command handler code here 
	// 图像锐化 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
	 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR lpDIB; 
	 
	// 指向DIB象素指针 
	LPSTR    lpDIBBits; 
	 
	// 模板高度 
	int		iTempH; 
	 
	// 模板宽度 
	int		iTempW; 
	 
	// 模板系数 
	FLOAT	fTempC; 
	 
	// 模板中心元素X坐标 
	int		iTempMX; 
	 
	// 模板中心元素Y坐标 
	int		iTempMY; 
	 
	// 模板元素数组 
	FLOAT	aValue[9]; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB);	 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的锐化,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的锐化!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 设置拉普拉斯模板参数 
	iTempW = 3; 
	iTempH = 3; 
	fTempC = 1.0; 
	iTempMX = 1; 
	iTempMY = 1; 
	aValue[0] = -1.0; 
	aValue[1] = -1.0; 
	aValue[2] = -1.0; 
	aValue[3] = -1.0; 
	aValue[4] =  9.0; 
	aValue[5] = -1.0; 
	aValue[6] = -1.0; 
	aValue[7] = -1.0; 
	aValue[8] = -1.0; 
	 
	// 调用Template()函数用拉普拉斯模板锐化DIB 
	if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),  
		  iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CFingerProView::OnEnhaGradsharp()  
{ 
	// TODO: Add your command handler code here 
	// 梯度锐化 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
	 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR lpDIB; 
	 
	// 指向DIB象素指针 
	LPSTR    lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB);	 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的梯度锐化,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的梯度锐化!", "系统提示" ,  
			MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	// 阈值 
	BYTE	bThre; 
	 
	// 创建对话框 
	CDlgSharpThre dlgPara; 
	 
	// 初始化变量值 
	dlgPara.m_bThre = 10; 
	 
	// 提示用户输入阈值 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 获取用户的设定 
	bThre = dlgPara.m_bThre; 
	 
	// 删除对话框 
	delete dlgPara;	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用GradSharp()函数进行梯度板锐化 
	if (::GradSharp(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor();	 
} 
 
void CFingerProView::OnMorphThining()  
{ 
	// TODO: Add your command handler code here 
	//细化运算 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
 
	if(!b_changetogray) 
	{ 
		AfxMessageBox("请先将您的图片转换为灰度图!"); 
		return; 
	} 
	  
    if(!b_binary) 
	{ 
		AfxMessageBox("请先将您的图片二值化,再进行细化"); 
		return; 
	} 
 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的闭运算,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的细化运算!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用ThiningDIB()函数对DIB进行闭运算 
	if (ThiningDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB))) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败或者图像中含有0和255之外的像素值!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor();	 
} 
 
void CFingerProView::OnGrayscr()  
{ 
	// TODO: Add your command handler code here 
	// 灰度拉伸 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
	 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 创建对话框 
	CDlgPointStre dlgPara; 
	 
	// 点1坐标 
	BYTE	bX1; 
	BYTE	bY1; 
	 
	// 点2坐标 
	BYTE	bX2; 
	BYTE	bY2; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的灰度拉伸,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的灰度拉伸!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	// 初始化变量值 
	dlgPara.m_bX1 = 50; 
	dlgPara.m_bY1 = 30; 
	dlgPara.m_bX2 = 200; 
	dlgPara.m_bY2 = 220; 
	 
	// 显示对话框,提示用户设定拉伸位置 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 获取用户的设定 
	bX1 = dlgPara.m_bX1; 
	bY1 = dlgPara.m_bY1; 
	bX2 = dlgPara.m_bX2; 
	bY2 = dlgPara.m_bY2; 
	 
	// 删除对话框 
	delete dlgPara;	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用GrayStretch()函数进行灰度拉伸 
	GrayStretch(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bX1, bY1, bX2, bY2); 
	 
	// 设置脏标记 
	pDoc->SetModifiedFlag(TRUE); 
	 
	// 更新视图 
	pDoc->UpdateAllViews(NULL); 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor();	 
} 
 
void CFingerProView::OnViewIntensity()  
{ 
	// TODO: Add your command handler code here 
	// 查看当前图像灰度直方图 
	if(!b_load) 
	{ 
		AfxMessageBox("您没有加载图片进行处理,请先加载处理您的图片!"); 
	    return; 
	} 
	 
	// 获取文档 
	CFingerProDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR lpDIB; 
	 
	// 指向DIB象素指针 
	LPSTR    lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
		// 返回 
		return; 
	} 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 创建对话框 
	CDlgIntensity dlgPara; 
	 
	// 初始化变量值 
	dlgPara.m_lpDIBBits = lpDIBBits; 
	dlgPara.m_lWidth = ::DIBWidth(lpDIB); 
	dlgPara.m_lHeight = ::DIBHeight(lpDIB); 
	dlgPara.m_iLowGray = 0; 
	dlgPara.m_iUpGray = 255; 
	 
	// 显示对话框,提示用户设定平移量 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor();	 
}