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

📄 仙农费诺编码.c

📁 实现了香农费诺 编码的源码函数
💻 C
字号:
void CCh1_1View::OnCodeShannon() 
{
	// 查看香农-弗诺编码表
	
	// 获取文档
	CCh1_1Doc* 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();
	
}

⌨️ 快捷键说明

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