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

📄 ch1_1view.cpp

📁 vc++数字图像处理 ,是一本很不错的介绍数字图像方面的书籍,这里有本书的全部源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	// 判断伪彩色编码是否改动	if (pDoc->m_nColorIndex != nColor)	{		// 调用ReplaceColorPal()函数变换调色板		::ReplaceColorPal(lpDIB, (BYTE*) ColorsTable[nColor]);				// 替换当前文档调色板		pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable[nColor]);				// 更新类成员变量		pDoc->m_nColorIndex = nColor;				// 设置脏标记		pDoc->SetModifiedFlag(TRUE);				// 实现新的调色板		OnDoRealize((WPARAM)m_hWnd,0);				// 更新视图		pDoc->UpdateAllViews(NULL);	}		// 解除锁定	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	// 恢复光标	EndWaitCursor();}void CCh1_1View::OnFILE256ToGray() {	// 将256色位图转换成灰度图		// 获取文档	CCh1_1Doc* 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();	}////////////////////////////////////////////////////////////////////////////////////////  图像正交变换//void CCh1_1View::OnFreqFour() {	// 图像付立叶变换		// 获取文档	CCh1_1Doc* 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();		// 调用Fourier()函数进行付立叶变换	if (::Fourier(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))	{				// 设置脏标记		pDoc->SetModifiedFlag(TRUE);				// 更新视图		pDoc->UpdateAllViews(NULL);	}	else	{		// 提示用户		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);	}		// 解除锁定	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());		// 恢复光标	EndWaitCursor();	}void CCh1_1View::OnFreqDct() {	// 图像离散余弦变换		// 获取文档	CCh1_1Doc* 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();		// 调用DIBDct()函数进行离散余弦变换	if (::DIBDct(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))	{				// 设置脏标记		pDoc->SetModifiedFlag(TRUE);				// 更新视图		pDoc->UpdateAllViews(NULL);	}	else	{		// 提示用户		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);	}		// 解除锁定	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());		// 恢复光标	EndWaitCursor();	}void CCh1_1View::OnFreqWalh() {	// 图像沃尔什-哈达玛变换		// 获取文档	CCh1_1Doc* 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();		// 调用DIBWalsh()或者DIBWalsh1()函数进行变换	if (::DIBWalsh1(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))	{				// 设置脏标记		pDoc->SetModifiedFlag(TRUE);				// 更新视图		pDoc->UpdateAllViews(NULL);	}	else	{		// 提示用户		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);	}		// 解除锁定	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());		// 恢复光标	EndWaitCursor();	}////////////////////////////////////////////////////////////////////////////////////////  形态学变换//void CCh1_1View::OnMorphErosion() {	//腐蚀运算	// 获取文档	CCh1_1Doc* 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;	}		int nMode;		// 创建对话框	cDlgMorphErosion dlgPara;		// 初始化变量值	dlgPara.m_nMode = 0;		// 显示对话框,提示用户设定腐蚀方向	if (dlgPara.DoModal() != IDOK)	{		// 返回		return;	}		// 获取用户设定的腐蚀方向	nMode = dlgPara.m_nMode;	int structure[3][3];	if (nMode == 2)	{		structure[0][0]=dlgPara.m_nStructure1;		structure[0][1]=dlgPara.m_nStructure2;		structure[0][2]=dlgPara.m_nStructure3;		structure[1][0]=dlgPara.m_nStructure4;		structure[1][1]=dlgPara.m_nStructure5;		structure[1][2]=dlgPara.m_nStructure6;		structure[2][0]=dlgPara.m_nStructure7;		structure[2][1]=dlgPara.m_nStructure8;		structure[2][2]=dlgPara.m_nStructure9;	}		// 删除对话框	delete dlgPara;			// 更改光标形状	BeginWaitCursor();	// 找到DIB图像象素起始位置	lpDIBBits = ::FindDIBBits(lpDIB);		// 调用ErosionDIB()函数腐蚀DIB	if (ErosionDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))	{				// 设置脏标记		pDoc->SetModifiedFlag(TRUE);		// 更新视图		pDoc->UpdateAllViews(NULL);	}	else	{		// 提示用户		MessageBox("分配内存失败或者图像中含有0和255之外的像素值!", "系统提示" , MB_ICONINFORMATION | MB_OK);	}		// 解除锁定	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	// 恢复光标	EndWaitCursor();	}void CCh1_1View::OnMorphOpen() {	//开运算	// 获取文档	CCh1_1Doc* 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;	}		int nMode;		// 创建对话框	cDlgMorphOpen dlgPara;		// 初始化变量值	dlgPara.m_nMode = 0;		// 显示对话框,提示用户设定开运算方向	if (dlgPara.DoModal() != IDOK)	{		// 返回		return;	}		// 获取用户设定的开运算方向	nMode = dlgPara.m_nMode;	int structure[3][3];	if (nMode == 2)	{		structure[0][0]=dlgPara.m_nStructure1;		structure[0][1]=dlgPara.m_nStructure2;		structure[0][2]=dlgPara.m_nStructure3;		structure[1][0]=dlgPara.m_nStructure4;		structure[1][1]=dlgPara.m_nStructure5;		structure[1][2]=dlgPara.m_nStructure6;		structure[2][0]=dlgPara.m_nStructure7;		structure[2][1]=dlgPara.m_nStructure8;		structure[2][2]=dlgPara.m_nStructure9;	}		// 删除对话框	delete dlgPara;			// 更改光标形状	BeginWaitCursor();	// 找到DIB图像象素起始位置	lpDIBBits = ::FindDIBBits(lpDIB);		// 调用ErosionDIB()函数开运算DIB	//if (OpenDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nMode , structure))	if (OpenDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), nMode , structure))	{				// 设置脏标记		pDoc->SetModifiedFlag(TRUE);		// 更新视图		pDoc->UpdateAllViews(NULL);	}	else	{		// 提示用户		MessageBox("分配内存失败或者图像中含有0和255之外的像素值!", "系统提示" , MB_ICONINFORMATION | MB_OK);	}		// 解除锁定	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());	// 恢复光标	EndWaitCursor();		}void CCh1_1View::OnMorphThining() {	//闭运算	// 获取文档	CCh1_1Doc* 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();	

⌨️ 快捷键说明

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