实验2图像的哈夫曼编码实现

  • 格式:doc
  • 大小:139.50 KB
  • 文档页数:15

实验二 图像的哈夫曼编码实现 实验目的: 使学生掌握图像的哈夫曼编码及哈夫曼编码的实现过程。 实验环境: 具有多媒体处理功能的计算安装有Windows操作系统,安装有Visual c++6.0程序设计软件。

实验要求: 学习相关理论指导,掌握相关程序设计知识;按照实验步骤要求完成程序设计任务,书写实验报告,试验报告中要求包含程序实现的主要程序代码和程序运行结果或结果说明。

实验内容和实验步骤: 1、使用应用程序向导生成哈夫曼编码程序框架和用于数据显示的界面。

1)创建多文档应用程序:HuffmanExp (1)使用资源管理制作对话框IDD_DLG_HUFFMAN 资源号分别为:IDC_LST_Table,IDC_EDIT1,IDC_EDIT2,IDC_EDIT3 (2)对应的数据成员定义为: CListCtrl m_lstTable; double m_dEntropy; double m_dAvgCodeLen; double m_dEfficiency; (3)为该对话框定义类CDlgHuffman class CDlgHuffman : public CDialog { // Construction public: CDlgHuffman(CWnd* pParent = NULL); // standard constructor

// Dialog Data //{{AFX_DATA(CDlgHuffman) enum { IDD = IDD_DLG_HUFFMAN }; CListCtrl m_lstTable; double m_dEntropy; double m_dAvgCodeLen; double m_dEfficiency; //}}AFX_DATA

public: // 灰度级别数目 int m_iColorNum;

// 各个灰度值出现频率 FLOAT * m_fFreq;

// 哈夫曼编码表 CString * m_strCode; // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CDlgHuffman) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

// Implementation protected:

// Generated message map functions //{{AFX_MSG(CDlgHuffman) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; 3)使用文件菜单打开位图文件,实现参考代码为重载文档类的Serialize(CArchive& ar)函数 void CHuffmanExpDoc::Serialize(CArchive& ar) { m_pDib->Serialize(ar);------不理解 if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } } 其中m_pDib为CDib类型对象。 4)重载视图类的OnInitialUpdate()函数,用于获取DIB文件的信息来设置滚动显示范围。----视图类中缺少Inintial函数 void CHuffmanExpView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CHuffmanExpDoc* pDoc = GetDocument(); CSize sizeTotal(pDoc->m_pDib->GetWidth(), pDoc->m_pDib->GetHeight()); SetScrollSizes(MM_TEXT, sizeTotal);

CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd; ASSERT_KINDOF(CMainFrame, pAppFrame); CRect rc; pAppFrame->GetClientRect(&rc); if (rc.Width() >= sizeTotal.cx && rc.Height() >= sizeTotal.cy && (sizeTotal.cx>0 || sizeTotal.cy>0)) ResizeParentToFit(FALSE);

} 5)重载视图类的OnDraw(CDC* pDC)函数实现图像显示。 void CHuffmanExpView::OnDraw(CDC* pDC) { CHuffmanExpDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here if (! pDoc->m_pDib->IsEmpty()) pDoc->m_pDib->Display(pDC, 0, 0); } 其中CDib类的各成员函数为: class CDib : public CObject { DECLARE_SERIAL(CDib)

// Public member function public: // constructor CDib(); // create BOOL Create(DWORD dwWidth, DWORD dwHeight); BOOL Create(DWORD dwWidth, DWORD dwHeight, WORD wBitCount); BOOL Create(LPBYTE lpDIB); BOOL Create(LPBYTE lpDIB, // DIB pointer WORD wBitCount); // bits/pixel BOOL Create(HBITMAP hBitmap); // DIBSection BOOL Create(HBITMAP hBitmap, // DIBSection WORD wBitCount); // bits/pixel BOOL Create(HBITMAP hBitmap, // Bitmap handle HPALETTE hPalette); // Palette handle BOOL Create(HBITMAP hBitmap, // Bitmap handle HPALETTE hPalette, // Palette handle WORD wBitCount); // bits/pixel BOOL Create(CRect rcScreen); BOOL Create(HWND hWnd, WORD fPrintArea); BOOL Create(HWND hWnd, CRect rcClientArea); // load/save BOOL Load(UINT uIDS, LPCTSTR lpszDibType); BOOL Load(LPCTSTR lpszDibRes, LPCTSTR lpszDibType); BOOL Load(LPCTSTR lpszDibFile); BOOL Save(LPCTSTR lpszDibFile); BOOL Read(CFile *pFile); BOOL Write(CFile *pFile);

// clone CDib * Clone();

// deconstructor virtual ~CDib(); // destroy void Destroy();

// overlaying Serialize virtual void Serialize(CArchive &ar);

// display BOOL Display(CDC * pDC, int xDest, int yDest, int nWidthDest, int nHeightDest, int xSrc, int ySrc, DWORD dwRop=SRCCOPY); BOOL Display(CDC * pDC, int xDest, int yDest, int nWidthDest, int nHeightDest, int xSrc, int ySrc, int nWidthSrc, int nHeightSrc, DWORD dwRop=SRCCOPY); BOOL Display(CDC* pDC, int x, int y, DWORD dwRop=SRCCOPY); BOOL Display(CDC* pDC, CRect rcDest, CRect rcSrc,DWORD dwRop=SRCCOPY); BOOL DisplayPalette(CDC* pDC, CRect rc);

// DC for modify DIB CDC* BeginPaint(CDC *pDC); void EndPaint();

// DDB and palette BOOL BuildBitmap(); BOOL BuildPalette();

// attributes BOOL IsEmpty();