else
{ if((iCount>1)||(bChar1>= 0xC0)) { lpDst[dwBuffUsed] = iCount | 0xC0; lpDst[dwBuffUsed+1] = bChar1;
dwBuffUsed += 2;
} else { lpDst[dwBuffUsed] = bChar1;
dwBuffUsed++;
}
bChar1 = bChar2;
iCount =1;
}
}
if((iCount > 1) ||(bChar1>=0xC0)) { lpDst[dwBuffUsed] = iCount | 0xC0;
lpDst[dwBuffUsed+1]= bChar1;
dwBuffUsed+=2; } else { lpDst[dwBuffUsed] = bChar1;
dwBuffUsed++;
}
}
file.WriteHuge((LPSTR)lpDst,dwBuffUsed); delete[] lpDst;
lpDst = new BYTE[769]; * lpDst = 0x0C; for(i=0;i<256;i++) {
lpDst[i*3+1] =i; lpDst[i*3+2] =i; lpDst[i*3+3] =i; }
file.Write((LPSTR)lpDst,769); return TRUE; }
5.3.2 视图类处理函数OnRleCoding()
第 26 页 共 32 页
关于 PCXCoding的函数调用部分,在图像处理的主窗口菜单栏“图像编码”下添加“行程编码”项,对应的处理函数是CDImageProcessView视图类中的OnRleCoding()函数,具体代码如下。
void CDImageProcessView::OnPcxcoding()
{
CDImageProcessDoc* pDoc = GetDocument(); LPSTR lpDIB; LPSTR lpDIBBits;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHObject()); lpDIBBits = pDoc->m_dib.GetBits(lpDIB); if(pDoc->m_dib.GetColorNum(lpDIB)!=256) {
MessageBox(\目前只支持256色位图!\系统提示\TION| MB_OK); ::GlobalUnlock((HGLOBAL)pDoc->GetHObject());
return; } int width; int height;
width= pDoc->m_dib.GetWidth(lpDIB); height= pDoc->m_dib.GetHeight(lpDIB); BeginWaitCursor(); CString strFilePath;
strFilePath = pDoc->GetPathName();
if(strFilePath.Right(4).CompareNoCase(\
{ strFilePath=strFilePath.Left(strFilePath.GetLength()-3)+\ } else { }
CfileDialog
dlg(FALSE,\Y|OFN_OVERWRITEPROMPT,\X图像文件(*.PCX) |*.PCX|所有文件(*.*)|*.*||\ if(dlg.DoModal()!=IDOK) {
strFilePath +=\
::GlobalUnlock((HGLOBAL)pDoc->GetHObject()); EndWaitCursor();
return; }
strFilePath = dlg.GetPathName(); CFile file; CFileException fe;
第 27 页 共 32 页
if(!file.Open(strFilePath,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe)) {
MessageBox(\打开指定PCX文件时失败!\系统提示\TION|MB_OK); return;
}
if(PCXCoding(lpDIBBits,width,height,file)) { } else {
MessageBox(\成功保存为PCX文件!\系统提示\
MessageBox(\保存为PCX文件失败!\系统提示\TION|MB_OK); }
::GlobalUnlock((HGLOBAL)pDoc->GetHObject()); EndWaitCursor();
六、实验结果:
如下图6.1所示,分别采用哈夫曼编码、香农-范诺编码和行程编码进行图像压缩处理,对比其压缩后的数据来分析编码的优缺点。
图6.1位图图像“原始lena图像”
6.1 哈弗曼编码结果
对位图图像“原始lena图像”进行哈夫曼编码压缩,如下图6.2所示。编码效率约为99.7%,图像熵值为7.44,平均码长7.47。
第 28 页 共 32 页
图6.2哈夫曼编码运行结果
6.2 香农-范诺编码结果
对位图图像“原始lena图像”进行香农-范诺编码压缩,如下图6.3所示。编码效率约为99.2%,平均码长为7.5,图像熵值7.44。
图6.3香农-范诺编码运行结果
6.3 行程编码结果
第 29 页 共 32 页
行程编码是将位图图像,即以.bmp为后缀的图像保存为以.PCX为后缀的文件格式
图6.4保存为以.PCX为后缀的文件
若保存成功,则弹出对话框提示成功保存,如图6.5所示。
图6.5成功保存提示对话框
保存成PCX文件后,其压缩程度可从属性中看出来,如图6.6所示。
第 30 页 共 32 页