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

📄 linetransview.cpp

📁 人民邮电出版社的——Visual C++数字图像处理典型算法及实现(源码) 希望大家能用上
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void CLineTransView::OnViewIntensity() 
{
	// 查看当前图像灰度直方图

	CLineTransDoc* pDoc = GetDocument();
	
	LPSTR lpDIB;			// 指向DIB的指针	
	LPSTR    lpDIBBits;		// 指向DIB象素指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		return;
	}
	
	BeginWaitCursor();

	CIntensityDlg dlgPara;
	dlgPara.m_lpDIBBits = lpDIBBits;
	dlgPara.m_lWidth = pDoc->GetDibImage()->DIBWidth(lpDIB);
	dlgPara.m_lHeight = pDoc->GetDibImage()->DIBHeight(lpDIB);
	dlgPara.m_iLowGray = 0;
	dlgPara.m_iUpGray = 255;
	
	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}

	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CLineTransView::OnPointEqua() 
{
	// 灰度均衡

	CLineTransDoc* pDoc = GetDocument();
		
	LPSTR	lpDIB;				// 指向DIB的指针	
	LPSTR    lpDIBBits;			// 指向DIB象素指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的直方图均衡!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}
	
	BeginWaitCursor();
	
	// 调用InteEqualize()函数进行直方图均衡
	pDoc->GetDibImage()->InteEqualize(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB));

	pDoc->SetModifiedFlag(TRUE);	// 设置脏标记	
	pDoc->UpdateAllViews(NULL);		// 更新视图
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CLineTransView::OnPointInvert() 
{
	// 图像反色
	
	CLineTransDoc* pDoc = GetDocument();
	
	LPSTR lpDIB;			// 指向DIB的指针	
	LPSTR    lpDIBBits;		// 指向DIB象素指针	
	FLOAT fA;				// 线性变换的斜率	
	FLOAT fB;				// 线性变换的截距	
	// 反色操作的线性变换的方程是-x + 255
	fA = -1.0;
	fB = 255.0;
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的反色,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的反色!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		return;
	}
	
	BeginWaitCursor();
	
	// 调用LinerTrans()函数反色
	pDoc->GetDibImage()->LinerTrans(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), fA, fB);
	
	pDoc->SetModifiedFlag(TRUE);	// 设置脏标记	
	pDoc->UpdateAllViews(NULL);		// 更新视图
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CLineTransView::OnPointLiner() 
{
	// 线性变换

	CLineTransDoc* pDoc = GetDocument();
		
	LPSTR lpDIB;				// 指向DIB的指针	
	LPSTR    lpDIBBits;			// 指向DIB象素指针	
	CLinerParaDlg dlgPara;		// 创建对话框	
	FLOAT fA;					// 线性变换的斜率	
	FLOAT fB;					// 线性变换的截距
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的线性变换,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的线性变换!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}
	
	dlgPara.m_fA = 2.0;
	dlgPara.m_fB = -128.0;
	
	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}	
	// 获取用户设定的平移量
	fA = dlgPara.m_fA;
	fB = dlgPara.m_fB;

	delete dlgPara;	
	BeginWaitCursor();
	
	// 调用LinerTrans()函数进行线性变换
	pDoc->GetDibImage()->LinerTrans(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB),
		pDoc->GetDibImage()->DIBHeight(lpDIB), fA, fB);
	
	pDoc->SetModifiedFlag(TRUE);	// 设置脏标记	
	pDoc->UpdateAllViews(NULL);		// 更新视图
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CLineTransView::OnPointStre() 
{
	// 灰度拉伸
	
	CLineTransDoc* pDoc = GetDocument();
		
	LPSTR	lpDIB;				// 指向DIB的指针	
	LPSTR   lpDIBBits;			// 指向DIB象素指针	
	CPointStreDlg dlgPara;		// 创建对话框	
	BYTE	bX1,bY1;			// 点1坐标		
	BYTE	bX2,bY2;			// 点2坐标

	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的灰度拉伸,其它的可以类推)
	if (pDoc->GetDibImage()->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()函数进行灰度拉伸
	pDoc->GetDibImage()->GrayStretch(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), bX1, bY1, bX2, bY2);
	
	pDoc->SetModifiedFlag(TRUE);	// 设置脏标记	
	pDoc->UpdateAllViews(NULL);		// 更新视图
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CLineTransView::OnPointThre() 
{
	// 阈值变换

	CLineTransDoc* pDoc = GetDocument();
		
	LPSTR	lpDIB;				// 指向DIB的指针	
	LPSTR   lpDIBBits;			// 指向DIB象素指针	
	CPointThreDlg  dlgPara;		// 参数对话框	
	BYTE	bThre;				// 阈值

	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的阈值变换,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的阈值变换!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}	
	dlgPara.m_bThre = 128;
	
	// 显示对话框,提示用户设定阈值
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}
	bThre = dlgPara.m_bThre;

	delete dlgPara;	
	BeginWaitCursor();
	
	// 调用ThresholdTrans()函数进行阈值变换
	pDoc->GetDibImage()->ThresholdTrans(lpDIBBits, 
		pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), bThre);
	
	pDoc->SetModifiedFlag(TRUE);	// 设置脏标记	
	pDoc->UpdateAllViews(NULL);		// 更新视图
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CLineTransView::OnPointWind() 
{
	// 窗口变换

	CLineTransDoc* pDoc = GetDocument();
	
	LPSTR lpDIB;				// 指向DIB的指针
	LPSTR    lpDIBBits;			// 指向DIB象素指针
	CPointWinDlg  dlgPara;		// 创建对话框	
	BYTE	bLow;				// 窗口下限	
	BYTE	bUp;				// 窗口上限

	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());	
	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的窗口变换,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的窗口变换!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		return;
	}

	dlgPara.m_bLow = 0;
	dlgPara.m_bUp = 255;
	
	// 显示对话框,提示用户设定窗口上下限
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}
	bLow = dlgPara.m_bLow;
	bUp = dlgPara.m_bUp;

	delete dlgPara;	
	BeginWaitCursor();
	
	// 调用WindowTrans()函数进行窗口变换
	pDoc->GetDibImage()->WindowTrans(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), bLow, bUp);
	
	pDoc->SetModifiedFlag(TRUE);	// 设置脏标记	
	pDoc->UpdateAllViews(NULL);		// 更新视图
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

⌨️ 快捷键说明

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