度L加上192即0xC0),再存入该行程的代码值,行程长度和行程的代表值分别占一个字节。对于长度为1的行程,即单个像素,如果该像素的值小于或等于0xC0,则编码时直接存入该像素值,而不存储长度信息;否则,先存入0xC1,再存入该像素值,这样做的目的是为了避免该像素值被误认为长度信息【9】。例如,连续100个灰度值为0x80的像素,其编码(以十六进制表示)应为FF 80 25 80。上面的编码中出现的FF的长度信息是由63与0xC0相加所得。
2.4 LZW编码方法和理论
2.4.1 LZW编码基本理论
LZW编码又称为字串表(String Table)编码,它与霍夫曼编码有点类似。霍夫曼编码的编码原则是将出现概率高的数据用字符位数较少的码字来表示,而出现概率低的数据则用位数较多的码字来表示;LZW编码则是将原始数据中的重复字符串建立一个字串表,然后用该重复字串在字串表中的索引(相当于霍夫曼编码的码字)来替代原始数据以达到压缩的目的。LZW编码的编码效率是相当高的,但是解码速度将受到影响。LZW编码是一种无损的编码方式。
LZW(Lempel-Ziv-Welch Encoding)是Welch将Lempel和Ziv所提出的数据编码方法改良后产生的压缩技术【10】,不过由于标准的LZW编码在实际应用中仍有缺点,因此从标准的LZW编码法中又衍生了许多编码方法。其中DOS中的ARC、PKZIP和UNIX中的COMPRESS等数据压缩软件,其压缩技术都是标准LZW压缩技术的延伸。通常使用的GIF图像文件格式也是由标准LZW编码改进而来。
2.4.2 LZW编码步骤
LZW算法流程【11】:
(1)初始化:将所有的单字符串放入串表
(2)读第一个输入字符给前缀串ω
(3)Step: 读下一个输入字符K;
if 没有这样的K(输入已穷尽):
码字(ω) 输出;结束。
If ωK 已存在于串表中:
ω:=ωK;repeat Step;
else ωK不在于串表中:
码字(ω) 输出;
ωK加进串表;
ω:=K;repeat Step.
2.5本章小结
本章讲述了图像压缩编码的几种方法,包括霍夫曼编码、香农-弗诺编码、行程编码和LZW编码等。并简单介绍了各种编码方法的基本原理和编码步骤等。通过对基本理论知识的了解和总结,我们可以更好地通过编程来实现这些功能。
3 研究平台及DIB简介
3.1 研究平台简介
目前常用的图像处理工具很多,本课题选择在Visual C++环境的进行编程处理图像,原因在于C++开发环境特有的优势【11】。
(1)Visual C++开发环境具有良好的跨平台特性、程序可移植性与可读性;且C++中新增的类和对象使得编程显得更加容易。
(2)在多媒体及图形图像开发支持方面,有其独特的优势。利用Visual C++可进行Direct Api编程,且调用OpenGL比较方便,自带丰富的图形图像处理组件及类,使用很方便且功能强大,支持图像文件类型较多。
(3)Visual C++开发环境提供了丰富的可视化编程界面,且其自身携带的MFC基本类库提供了简单的应用程序框架,并且封装了许多常用的公共类,方便了程序员的调用,同时节省了大量的编程时间,增强了可操作性。
3.2 MFC简介
3.2.1 MFC概述
MFC(Microsoft Foundation Class Library)中的各种类结合起来构成了-个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK(Software Development Kit)来说更为简单的方法【12】。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序填入这个轮廓。Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用来帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;编译则通过类库实现应用程序特定的逻辑。
MFC的本质就是一个基于Windows的C++类库,用户可以通过这些基础类的使用、继承和扩展等方法,直接编写程序可以符合Windows的工作和响应机制,从而可以在用户不了解底层工作状态的情况下,实现高级的编程工作。所以MFC提供了一种新的基于Windows的程序开发模式,从而使MFC实现了自身的框架对程序的控制。
3.2.2 MFC应用程序框架组成
使用MFC产生一个应用程序,AppWizard自动的创建一系列文件构成一个应用程序框架,这些文件包括头文件(.h),实现文件(.cpp),资源文件(.rc),模块定义文件(.def)等。一般应用程序由CWinApp、CDocument、CView、CFrameWnd、CChildWnd类对应派生出的子类或者对象组成。
CWinApp类派生出应用程序类,基于框架的应用程序必须有且只有一个应用程序对象,它的主要工作包括应用程序的初始化、运行和结束。
CDocument类派生出文档类,MFC的工作机制中,数据存储在CDocument所派生出的子类当中,其主要作用就是管理数据,数据的存取和运算都是在文档类中实现的,视图窗口通过访问文档类的对象访问、调取和更新数据。
CView类派生出视图类。视图类主要在文档类和程序用户中起桥梁作用,它和文档类联系紧密。用户可以通过视图类在屏幕上获得文档内数据的内容,同时可以把用户的输入转换成为对文档的操作。
CFrameWnd类在SDK(Software Development Kit,软件开发工具包)应用程序中用来派生边框窗口,边框窗口的客户子窗口直接包含视窗口。
3.3文档、视图与框架窗口
3.3.1主框架窗口与文档窗口
主框架窗口是应用程序放置在桌面上的窗口,每个应用程序都只有一个主窗口,主窗口的标题栏上显示应用程序的名称。
使用应用程序向导AppWizard创建单文档(SDI)应用程序后,包含主窗口类的文件分别为:MainFrm.h和MainFrm.cpp。主窗口类是由CFrameWnd派生而来,类名是CMainFrame。如果应用程序中还包括工具栏(CToolBar)、状态栏(CStatusBar),则用户的CMainFrame类中还包含表示工具栏和状态栏的成员变量,并在CMainFrame的OnCreate函数中对其进行初始化。
对但单文档应用程序,文档窗口与主窗口是一致的。但对多文档窗口,文档窗口是主窗口的子窗口。其客户区是由相应的视图类构成的。因此,视图是文档窗口内的子窗口,文档窗口时刻跟踪着当前处于活动状态的视图的变化,并将用户或系统产生的命令消息传递给当前活动视图。而主窗口负责管理各个用户交互对象,它们包含菜单、工具栏、状态栏及加速键,并根据用户的操作来创建或更新文档窗口及视窗。多文档程序中的文档窗口文件为ChildFrm.h和ChildFrm.cpp,其类名是CChildFrame,它是从CMDIChildWnd派生来的。
3.3.2文档类和视图类
采用文档-视图结构的应用程序处理的文档数据通过视图与用户交互。文档内容通过视窗显示给用户,用户在视图中对文档数据所做的修改由视图通知给文档对象。
1. 文档模板类
由MFC创建的应用程序的主线程序体现在应用类中,而应用类是通过文档 模板类将文档类、文档边框窗口类(SDI中的主边框窗口类或MDI中的子边框窗口类)、视图类联系在一起,组成一个有机的整体,共同完成程序设计任务。单文档模板类(CSingleDocTemplate)和多文档模板类(CMultiDocTemplate)均由CDocTemplate类派生。单文档模板类支持单文档应用程序,多文档 模板类支持多文档模板应用程序。
应用类CwinApp通过一个内部类CDocManager来管理文档模板类。前者的类成员变量是指向后者类对象的指针。在CDocManager类中定义的指针链表中,其每项都是一个指向文档模板对象的指针。实际上,应用类通过其链表成员管理应用程序的所有文档模板对象。
一个
上一篇:
施工组织设计(小农水工程2011)
下一篇:
超市进销存管理系统的开发