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

📄 ouyangimageview.cpp

📁 软件是用VisualStudio6.0制作而成
💻 CPP
📖 第 1 页 / 共 3 页
字号:

		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();

	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 调用RobertDIB()函数对DIB进行边缘检测
	if (RobertDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB)))
	{
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();
}

void COuyangImageView::OnEdgeSobel() 
{
	// TODO: Add your command handler code here
	//Sobel边缘检测运算

	// 获取文档
	COuyangImageDoc* 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);
	
	// 调用SobelDIB()函数对DIB进行边缘检测
	if (SobelDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB)))
	{
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();
}

void COuyangImageView::OnEdgePrewitt() 
{
	// TODO: Add your command handler code here
		//Prewitt边缘检测运算

	// 获取文档
	COuyangImageDoc* 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);
	
	// 调用PrewittDIB()函数对DIB进行边缘检测
	if (PrewittDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB)))
	{
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();
}

void COuyangImageView::OnCodeShannon() 
{
	// TODO: Add your command handler code here
		// 查看香农-弗诺编码表
	
	// 获取文档
	COuyangImageDoc* pDoc = GetDocument();
	
	// 指向源图像象素的指针
	unsigned char *	lpSrc;
	
	// 指向DIB的指针
	LPSTR	lpDIB;
	
	// 指向DIB象素指针
	LPSTR   lpDIBBits;
	
	// DIB的高度
	LONG	lHeight;
	
	// DIB的宽度
	LONG	lWidth;
	
	// 图像每行的字节数
	LONG	lLineBytes;
	
	// 图像象素总数
	LONG	lCountSum;
	
	// 循环变量
	LONG	i;
	LONG	j;
	
	// 保存各个灰度值频率的数组指针
	FLOAT * fFreq;
	
	// 获取当前DIB颜色数目
	int		iColorNum;
	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 获取当前DIB颜色数目
	iColorNum = ::DIBNumColors(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
	if (iColorNum != 256)
	{
		// 提示用户
		MessageBox("目前只支持256色位图香农-弗诺编码!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();
	
	/******************************************************************************
	// 开始计算各个灰度级出现的频率	
	//
	// 如果需要对其它序列进行香农-弗诺编码,只需改动此处即可,例如,直接赋值:
	   iColorNum = 8;
	   fFreq = new FLOAT[iColorNum];
	   fFreq[0] = 0.0625;
	   fFreq[1] = 0.0625;
	   fFreq[2] = 0.0625;
	   fFreq[3] = 0.0625;
	   fFreq[4] = 0.125;
	   fFreq[5] = 0.125;
	   fFreq[6] = 0.25;
	   fFreq[7] = 0.25;
	// 这样就可以对指定的序列进行香农-弗诺编码
	******************************************************************************/
	
	// 分配内存
	fFreq = new FLOAT[iColorNum];
	
	// 计算DIB宽度
	lWidth = ::DIBWidth(lpDIB);
	
	// 计算DIB高度
	lHeight = ::DIBHeight(lpDIB);
	
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	
	// 重置计数为0
	for (i = 0; i < iColorNum; i ++)
	{
		// 清零
		fFreq[i] = 0.0;
	}
	
	// 计算各个灰度值的计数(对于非256色位图,此处给数组fFreq赋值方法将不同)
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lWidth; j ++)
		{
			// 指向图像指针
			lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;
			
			// 计数加1
			fFreq[*(lpSrc)] += 1;
		}
	}
	
	// 计算图像象素总数
	lCountSum = lHeight * lWidth;
	
	// 计算各个灰度值出现的概率
	for (i = 0; i < iColorNum; i ++)
	{
		// 计算概率
		fFreq[i] /= (FLOAT)lCountSum;
	}
	
	// 计算各个灰度级出现的频率结束
	/*****************************************************************************/
	
	// 创建对话框
	CDlgShannon dlgPara;
	
	// 初始化变量值
	dlgPara.m_fFreq = fFreq;
	dlgPara.m_iColorNum = iColorNum;
	
	// 显示对话框
	dlgPara.DoModal();
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();
	
}

void COuyangImageView::OnDetectThreshold() 
{
	// TODO: Add your command handler code here
		//阈值分割

	// 获取文档
	COuyangImageDoc* 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);
	
	// 调用ThresholdDIB()函数对DIB进行阈值分割
	if (ThresholdDIB(lpDIBBits,::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
	{
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();
	
}

void COuyangImageView::OnDetectHprojection() 
{
	// TODO: Add your command handler code here
		//水平投影

	// 获取文档
	COuyangImageDoc* 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);
	
	// 调用HprojectDIB()函数对DIB进行水平投影
	if (HprojectDIB(lpDIBBits,::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
	{
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();
	
}

void COuyangImageView::OnDetectVprojection() 
{
	// TODO: Add your command handler code here
		//垂直投影

	// 获取文档
	COuyangImageDoc* 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);
	
	// 调用VprojectDIB()函数对DIB进行垂直投影
	if (VprojectDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
	{
		
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	}
	else
	{
		// 提示用户
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();
	
}

void COuyangImageView::OnViewIntensity() 
{
	// 查看当前图像灰度直方图
	
	// 获取文档
	COuyangImageDoc* 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();	
}

void COuyangImageView::OnCodeHuffman() 
{
	// TODO: Add your command handler code here
		// 查看哈夫曼编码表
	
	// 获取文档
	COuyangImageDoc* pDoc = GetDocument();
	
	// 指向源图像象素的指针
	unsigned char *	lpSrc;
	
	// 指向DIB的指针
	LPSTR	lpDIB;
	
	// 指向DIB象素指针
	LPSTR   lpDIBBits;
	
	// DIB的高度
	LONG	lHeight;
	
	// DIB的宽度
	LONG	lWidth;
	
	// 图像每行的字节数
	LONG	lLineBytes;
	
	// 图像象素总数
	LONG	lCountSum;
	
	// 循环变量
	LONG	i;
	LONG	j;
	LONG	k;
	
	// 保存各个灰度值频率的数组指针
	FLOAT * fFreq;
	
	// 获取当前DIB颜色数目
	int		iColorNum;

⌨️ 快捷键说明

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