毕业设计(论文)基于MFC的图片浏览器的设计与实现_第1页
毕业设计(论文)基于MFC的图片浏览器的设计与实现_第2页
毕业设计(论文)基于MFC的图片浏览器的设计与实现_第3页
毕业设计(论文)基于MFC的图片浏览器的设计与实现_第4页
毕业设计(论文)基于MFC的图片浏览器的设计与实现_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第1章 绪 论图像处理源自于二战中的摄影侦察。当时,处理操作是通过光学方法来完成的,判读工作则是由专门精于此道并能确定炸弹袭击结果的人员来做。随着20世纪60年代后期卫星图像的出现,更多基于计算机的工作便开展起来。彩色合成的卫星图像,有时的确漂亮的让人吃惊,它们已经成为人类视觉文化和对我们这个行星进行认知的一个组成部分。1980年1月科学美国人发表了一幅被称之为“plume 2”的著名图像,它是1979年3月5日通过宇宙飞船旅行者1号在木星的卫星上探测到的8次火山爆发中的第二次。这幅图像在星际探险图像中是一个里程碑,人们第一次在宇宙中看到了正在爆发的火山。它也是图像处理领域的一次伟大胜利。卫星

2、图像以及宇宙探测器所获取的图像直到近年来才大量应用图像处理技术。在这些技术中,对计算机图像进行数字化处理以得到想要获得的效果,比如使图像的某一部分或某一特性更加明显。正如计算机图形学一样,直到近几年,图像处理仍然局限在一些实验室里使用,只有这些地方才能提供昂贵的图像处理计算机来满足处理大量高分辨率图像的需要。随着价格低廉的高性能计算机和诸如数码相机及扫描仪这样的图像采集设备的出现,我们已经看到图像处理技术在向公众领域转移。经典的图像处理技术很平常地被图像设计人员用来处理图片和生成图像,比如修复图片的缺陷、改变色彩、对比度等,或者通过图像边缘增强这样的处理来改变整个图片的外观。目前图像处理的主流

3、应用是图像的压缩,即通过互联网进行传递或在可视电话和视频会议中进行动态视频图像的压缩。可视电话是当今结合计算机图像和传统图像处理的技术,以期产生很高压缩比的交叉领域之一。所有这一切都是图像的“数字表达”这一不可抗拒的发展趋势的组成部分。事实上,20世纪最强大、应用最广泛的图像形式电视图像,也将不可避免的融入数字领域。数字图像及其处理技术之所以发展的如此迅速并获得广泛的应用,与其自身的优点是息息相关的。1. 再现性好数字图像处理与模拟图像处理的根本不同在于,它不会因图像的存储、传输或复制等一系列变换操作而导致图像质量的退化。只要图像在数字化时准确地表现了原稿,则数字图像处理过程始终能保持图像的再

4、现。2. 处理精度高按目前的技术,几乎可将一幅模拟图像数字化为任意大小的二维数组,这主要取决于图像数字化设备的能力。现代扫描仪可以把每个像素的灰度等级量化为16位甚至更高,这意味着图像的数字化精度可以达到满足任一应用需求。对计算机而言,不论数组大小,也不论每个像素的位数多少,其处理程序几乎是一样的。换言之,从原理上讲不论图像的精度有多高,处理总是能实现的,只要在处理时改变程序中的数组参数就可以了。回想一下图像的模拟处理,为了要把处理精度提高一个数量级,就要大幅度地改进处理装置,这在经济上是极不合算的。3. 适用面宽图像可以来自于多种信息源,它们可以是可见光图像,也可以是不可见的波谱图像(例如x

5、射线图像、射线图像、超声波图像或红外图像等)。从图像反映的客观实体尺度看,可以小到电子显微镜图像,大到航空照片、遥感图像甚至天文望远镜图像。这些来自不同信息源的图像只要被变换为数字编码形式后,均是用二维数组表示的灰度图像(彩色图像也是由灰度图像组合成的,例如rgb图像由红、绿、蓝三个灰度图像组合而成),因而均可用计算机来处理。即只要针对不同的图像信息源,采取相应的图像信息采集措施,图像的数字处理方法可适用于任何一种图像。4. 灵活性高图像处理大体上可分为图像的像质改善、图像分析和图像重建三大部分,每一部分均包含丰富的内容。由于图像的光学处理从原理上讲只能进行线性运算,这极大地限制了光学图像处理

6、能实现的目标。而数字图像处理不仅能完成线性运算,而且能实现非线性处理,即凡是可以用数学公式或逻辑关系来表达的一切运算均可用数字图像处理实现。鉴于数字图像自身的特点,对其进行处理也不是一步就能完成的过程。可将它分成诸多步骤,必须一个接一个地执行这些步骤,直到提取出有用的数据。而这些步骤中,数据的存储、表示又占有相当重要的地位,可以说,这是图像处理中最基本的技术。因此,掌握不同格式图像的编码解码、读写、显示等方法是必不可少的。为什么会需要如此众多不同类型的图像文件格式呢?简单的回答就是因为有太多不同类型的图像以及众多不同需求的应用。完整一些的回答还要考虑到市场份额、所有权以及在图像工业中缺乏的必要

7、协调。但是,已经有一些标准的文件格式被开发出来。许多其他图像类型可以通过图像转换软件很容易地转换成这些文件格式,如本设计最终开发出的软件就可以将图像在bmp、pcx、tga、gif及jpeg之间互相转换。与计算机图像相关的一个领域就是计算机图形学。计算机图形学是计算机科学的一个特殊领域,它指的是通过计算机对可视数据进行再现,这包括为显示或打印生成计算机图像,以及为输出到监视器、打印机、照相机或其他能提供图像的设备上生成和处理的任何图像(真实的或人造的)。可以认为计算机图形学是计算机图像技术的一部分,图形设计师所使用的许多工具也正在被计算机图像专业人士所采用。在计算机图形学中,图像数据的类型被分

8、为两个主要种类:矢量和位图。矢量图像是指仅通过存储关键点来表达线条、曲线和形体的方法。这些关键点足以对形体进行定义,而将它变成图像的过程称之为渲染。当图像被渲染之后,它可以被认为是位图格式,其中每一个像素都具有与之相关的特定值。位图图像(也称之为光栅图像)可由图像模型i(r, c)来表示,其中包含像素数据以及某些文件格式存储的相应的亮度值。尽管有些文件被压缩,但仍属于位图图像的范畴,通常这些类型的图像包含头信息和原始图像数据。文件头必须包含的信息为:(1)行数(高);(2)列数(宽);(3)每像素位数;(4)文件类型。此外,对于某些复杂的文件格式,文件头还必须包含有关所使用的压缩类型的信息,以

9、及创建图像所需要的其他必要的参数。本设计所讨论和处理的图像均为位图图像。第2章 软件开发平台及编程模式在系统的设计与开发中,软件开发平台及编程模式是关键,下面介绍一下开发平台的选择、microsoft visual c+及编程模式。2.1 开发平台的选择在windows环境下,目前比较流行的可视化开发工具主要有:visual c+、visual basic、c+ builder、delphi、power builder及jbuilder等。而本软件采用microsoft visual c+ 6.0作为开发工具,并使用mfc application framework作为本软件的基本架构。采用c

10、+来进行图像编程的主要原因是,与java和c#等现代编程语言相比,c+在程序运行的效率、内存使用的可控性和编程的灵活性上具有优势。图像处理需要处理大量的图像数据,经常使用复杂、费时的算法,因此图像处理程序的效率非常重要。c+代码被编译成汇编语言,可以直接在处理器上运行,效率很高。而java被编译成字节码,c#被编译成中间语言,都是不能在处理器上执行的,必须经过java虚拟机或.net通用语言运行时的jit编译之后才能执行,因此效率较低。故从运行效率的角度看,采用c+进行图像编程比较合适。对庞大的图像数据进行处理时需要使用大量的内存,而计算机的物理内存容量往往是有限的,因此需要有效地控制内存的使

11、用。c+直接控制内存的分配和释放,这虽繁琐,且加大了编程的负担,但却能有效地控制内存的使用。java和c#引进了垃圾收集机制,将开发人员从内存管理的繁杂任务中解放出来,不再需要直接控制内存的分配和释放。但是,无效内存的收集和释放只能周期性地进行,难以达到有效地使用内存。同样的运算,使用java和c#所需的内存比使用c+所需的内存要多,即内存的使用率较低。所以,从内存的使用效率来看,采用c+进行图像处理编程更合适。c+中大量使用指针,使得编程的灵活性很高,这虽然增加了程序出错的可能性,但是便于程序员施展编程技巧来提高程序的效率。java完全取消了指针,c#极大地限制了指针的使用,这都限制了程序员

12、施展技巧。因此,使用c+进行图像处理编程具有更大的灵活性。而在以c+为核心语言的可视化编程工具中,microsoft visual c+ 6.0以其自身许多优异的特性而获得了最为广泛的应用。鉴于以上原因,本设计使用microsoft visual c+ 6.0作为软件的开发平台。2.2 microsoft visual c+及编程模式简介1. visual c+可视化编程visual c+的资源编辑器能以所见即所得(what you see is what you get)的形式直接编辑程序的用户界面,为所有资源分配id标识号。classwizard能把对话框模板与生成的类定义或与已有的类代码

13、连接起来,为菜单项、控制等资源生成空的处理函数模板,创建消息映射条目,并将资源id与处理函数连接起来。通过使用appwizard,程序员的编程工作便简化为用资源编辑器直观的设计界面,完善对话框类代码,在空的处理函数模板处填写响应用户操作的代码,这是一种比较完善的可视化编程方法。但产品名“visual c+”也容易误导人,让人认为自己使用的是一个与microsoft visual basic类似的完全可视化的系统。然而,使用visual c+,开发人员必须真正地阅读和编写c+代码。visual c+向导可以节省时间和提高精度,但是,程序员也必须理解向导产生的代码,并且,最重要的是,还必须理解mf

14、c库的结构和windows操作系统的内部工作方式。2. mfc(microsoft foundation classes)应用程序框架应用程序框架的一种定义是:提供一般应用程序需要的全部面向对象软件组件的集成集合。c+流行的一个原因是它可以用类库扩充。类库是可在应用程序中使用的有关c+类的集合。应用程序框架是类库的超集。一般的类库只是一种孤立的类的集合,用来嵌入在任何程序中,但是,应用程序框架却定义了程序的结构。自从mfc库发布以来,mfc已经成为主要的windows类库。使用mfc类库构建应用程序具有以下优点:l mfc库是c+的microsoft windows api。l 应用程序框架生

15、成的应用程序使用了标准的结构,具有标准化的用户接口,这对具有标准用户界面的win32程序来说,可以极大的减轻程序员的负担,使程序员不必过多地考虑界面,可把主要精力放在程序设计上,以提高程序设计的效率。l 使用应用程序框架的应用程序不仅小,而且运行速度快,具有很大的灵活性。mfc封装了win32 sdk中的几乎所有函数,能实现win32系统的任何功能。l visual c+工具降低了编码的复杂性。l mfc库应用程序框架有丰富的特性,如:windows api的c+接口、通用的(非windows所特有的)类、“共用根对象”类层次结构、流线式多文档界面(mdi)应用程序支持等。l 强大的功能。除封

16、装了大部分的win32 sdk函数外,mfc还提供了应用程序本身的数据和操作及activex、ole、internet、winsock、dao(data access objects)、odbc(open database connectivity)等操作类。mfc框架的核心是文档/视图结构(document-view architecture),这是一个很好用、但又往往较难以入门的功能。简单的说,文档/视图结构就是将数据和对数据的观察或数据的表现(显示)相分离。文档仅处理数据的实际读、写操作,视图则是显示和处理数据的窗口,视图可以操作文档中的数据。3. win32编程编写visual c+程

17、序实际上就是一个构造类和把类实例化的过程。由于windows 95/98/me/nt/2000是pc平台中应用最广泛的操作系统,而microsoft力图用一个叫做win32的标准32位应用程序接口作为对这几个操作系统的共同开发接口,所以经常采用win32来代表microsoft的32位windows操作系统,因此visual c+主要用于针对win32的应用程序开发。win32具有抢先式多任务、多线程和线性寻址内存管理等特征,win32编程的基本要求包括:l 应用程序的执行独立于硬件设备。l 应用程序具有图形用户界面。l 能在windows 95/98/me和windows nt/2000/x

18、p之间透明移植,并可移植到支持windows nt/2000的risc硬件平台。l 高性能的抢先式多任务和多线程管理。l 高级的多媒体支持。l 通过ole 2技术实现多个应用程序的对象定位。microsoft为进行win32编程提供了一套名为win32 sdk的应用程序编程接口,其中包括上千个win32系统函数。visual c+包括一套叫做mfc(microsoft foundation class library)的c+类库,其中定义了进行win32编程所需要的各种类。有的类封装了大部分的win32 sdk中应用程序的编程接口函数;有的类封装的则是应用程序本身的数据和操作;还有的类封装了a

19、ctivex、ole和internet编程特性以及winsock网络特性和dao(data access objects)、odbc(open database connectivity)数据访问功能。win23 sdk和mfc是实现win32编程的主要工具。visual c+的appwizard工具能自动生成应用程序框架,该框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。运用visual c+的资源编辑器(resource editor)能直观地设计程序的用户界面,而classwizard能把用户界面和程序代码连接起来。程序员要做的就是用mfc类实现框架中未完成的应用程序的特定功能

20、部分。所以使用visual c+可以实现win32的可视化程序设计。4. 消息映射在使用visual c+进行win32程序设计时,消息映射是一个非常重要的概念。windows应用程序是消息驱动的,应用程序不能直接得到用户所做的操作,如鼠标按键、键盘输入和窗口移动等。这些操作由操作系统管理,操作系统检测到操作事件后,便向相关的应用程序发送消息,应用程序响应这些消息来完成用户的操作。(1)消息windows中的消息是操作系统与应用程序之间、应用程序与应用程序之间、应用程序各对象之间相互控制与传递信息的方式。消息的基本格式如下:message wparam lparammessage是消息名称;w

21、param是与消息相关的word型参数;lparam是与消息相关的long型参数。消息主要有以下3类。l windows系统消息:windows系统向窗口发送的消息,由窗口(window)或视图(view)进行响应处理。这类消息包括除wm_command消息之外的名称以wm_开始的其他消息。l 控制通知消息:控制或子窗口传给父窗口的wm_command通知的消息。l 命令消息:在响应用户接口操作时,将产生wm_command命令消息。其参数指定了用户接口的标识号,如菜单项和按钮等id号。(2)消息映射过程在使用appwizard创建应用程序时,mfc应用程序框架设置了相应的消息处理函数来响应消

22、息,以完成相应的操作。消息处理函数是某些类(通常是窗口类)的成员函数和程序员在其中编写响应消息时应进行操作的代码。框架将消息和它们的处理函数连接起来就是消息映射。消息映射使应用程序在接收到消息时调用对应的消息处理函数来响应和处理消息。classwizard在创建新类时将为其创建一个消息映射,并为每个类能响应的消息和命令增加对应的处理函数。在源代码中,消息映射开始于begin_message_map宏,结束于end_message_map宏,中间由一系列预定义的被称为“条目宏”的宏组成。其基本格式如下:begin_message_map (classname, parentclassname)/

23、afx_msg_map (classname)条目宏1条目宏2条目宏3/afx_msg_mapend_message_map ()其中classname为拥有消息映射的当前类名,parentclassname为当前类的父类名。条目宏定义了类所处理的消息与其对应的函数。常用的条目宏类型如表2.1所示。表2.1 消息映射条目宏消息类型宏格式说明windows消息on_wm_xxxxwm_xxxx为windows消息名命令on_command(id,function)id为命令标识号,function为处理函数名更新命令on_update_command_ui(id,function)id为命令标识

24、号,function为处理函数名控制通知on_xxxx(id,function)id为控制标识号,function为处理函数名用户定义消息on_message(id,function)id为消息标识号,function为处理函数名用户注册消息on_registered_message(id,function)id为消息标识号,function为处理函数名windows消息的处理函数在cwnd类中进行了预定义,类库以消息名为基础定义这些处理函数的名称,且mfc要求所有消息处理函数声明为afx_msg类型。例如,消息wm_paint的处理函数在cwnd类中的声明如下:afx_msg void on

25、paint();通过classwizard在派生类中用同样的原型定义处理函数并为该函数生成消息映射条目,然后由程序员编写处理函数代码,并在派生类中覆盖了其父类的消息处理函数。在有些情况下,必须在派生类的消息处理函数中调用其父类的消息处理函数,使windows和基类能对消息进行处理。classwizard将在生成的处理函数中建议是否应调用父类的消息处理函数及调用的次序。除此之外,用户定义和注册的消息、命令和控制通知都没有默认的处理函数,需要在定义时声明,一般根据其id名称来为函数命名。第3章 图像格式分析在前面曾提到,用数字来表示图像有两种不同的方式,即矢量图和位图(又称为栅格、光栅图像或像素图

26、)。在具体的实现上,不同的厂家,在不同的系统上和不同的软件中又采用不同的图像表示方式,即以不同的图像格式来表示数字图像。因此,一个通用的图像处理软件应该能支持多种不同的图像格式,至少应能支持常用的几种图像格式。本设计所实现的图片浏览软件支持以下几种图像格式:bmp、pcx、tga、jpeg、gif。这几种图像格式均为在图像处理领域及实际应用中广泛使用的图像格式。由于图像质量的提高是建立在图像数据量增大的基础上的,而图像数据量的增大将不可避免地降低图像处理的速度,并且给存储和传递带来困难。因此,如何有效地控制数字图像的存储量已成为数字图像处理的一项重要课题。数据压缩技术是控制数据量的基本技术。所

27、谓数据压缩,就是用更少的数据位存储相同容量的信息,目的是更高效地存储信息。各种图像格式都可以采用一种,甚至多种不同的数据压缩算法来压缩数据量,因此图像格式和压缩算法是密切相关的。而开发图像处理软件也应首先了解图像的编码及解码方法。3.1 图像的编码和解码能够对数据进行压缩并大大减少其数据量是因为数据存在大量的数据冗余,即存在冗余的、可预测的和不必要的数据。数据量(d)与其所表达的信息量(i)一般并不相等,它们之间存在如下关系:i=d-dudu0其中,du代表数据的冗余量,如冗余量du=0,则不需要也不能对数据进行有效压缩。即,需要并能够对数据进行有效压缩的条件是du0。而图像数据中广泛存在着数

28、据冗余。数据冗余一般有4种形式,即统计冗余、信息熵冗余、结构冗余、知识冗余。利用冗余进行图像数据压缩包括两个相反的过程。l 数据编码:即对原始图像数据进行编码,以减小其数据量。l 数据解码:即把编码压缩的图像数据还原成原始的表示形式。由于数据编码和数据解码是互逆的过程,只要研究好数据编码就能处理好数据解码。根据冗余类型的不同,人们提出了不同的数据编码方法,根据不同的出发点可把数据编码方法进行不同的分类。(1)以对编码数据在解码后能否完全一致的还原为原始数据为标准,可将数据编码方法划分为如下两类。l 无失真编码(可逆编码):编码数据进行解码后的数据与编码前的原始数据完全相同,没有任何失真。l 有

29、失真编码(不可逆编码):编码数据进行解码后的数据与编码前的数据有一定的偏差或失真,但在视觉效果上基本相同。(2)根据数据编码的实现原理可以把数据编码划分为预测编码、变换编码、信息熵编码、亚抽样与内插编码、矢量量化编码、基于神经网络的编码、分频带编码、结构编码、基于知识的编码和混合编码等10类。其中,信息熵编码中的哈夫曼编码(huffman coding)、lzw(lempel ziv welch compression)编码、游程长度编码(run length coding)和算术编码(arithmetic coding)都是常用的无失真图像编码方式。由于本设计并未涉及到上述所有的编码算法,故

30、在此不再进行一一说明,在后面的内容中会对使用到的算法及其实现进行详细论述。3.2 bmp图像bmp图像,即通常所说的位图(bitmap),是windows系统中最为常见的图像格式。windows 3.0以前的版本只支持与设备相关位图ddb(device dependent bitmap)。ddb是一种内部位图格式,它显示的图像依计算机显示系统的设置不同而不同,因此一般不存储为文件,与通常所说的bmp图像不同。在windows.h中,结构体bitmap定义了ddb位图的类型、宽度、高度、颜色格式和像素位值等,代码如下:typedef struct tagbitmap int bmtype;/位图

31、类型,必须设为0 int bmwidth; /位图宽度 int bmheight;/位图高度 int bmwidthbytes;/位图中每一扫描行中的字节数 byte bmplanes;/颜色层数 byte bmbitspixel;/每一像素所占的位数 void far*bmbits; /存放像素值内存块的地址bitmap;ddb中不包括颜色信息,显示时是以系统的调色板为基础进行像素的颜色映射的。windows只能保证系统调色板的前20种颜色稳定不变,所以ddb只能保证正确显示少于20色的位图。windows sdk提供标准的ddb位图操作函数;mfc中定义了cbitmap类来说明ddb位图,

32、其中封装了与ddb位图操作相关的数据结构和函数。windows 3.1以上版本提供了对设备无关位图dib(device independent bitmap)的支持。dib位图可以在不同的机器或系统中显示位图所固有的图像。相对于ddb而言,dib是一种外部位图格式,经常存储为常见的以bmp为后缀的位图文件(有时也以dib为后缀)。因此,通常所说的bmp图像,即是dib位图。bmp位图文件包括4部分,即位图文件头结构bitmapfileheader、位图信息头结构bitmapinfoheader、位图颜色表rgbquad和位图像素数据,bmp位图文件的结构如图3.1所示。位图文件头结构bitma

33、pfileheader位图信息头结构bitmapinfoheader位图颜色表rgbquad位图像素数据图3.1 bmp位图文件的结构下面介绍bmp文件头、bmp位图信息头、颜色表这3个结构体在windows.h中的定义。1. bmp文件头bmp文件头含有bmp文件的类型、文件的大小、位图文件的保留字、位图数据距文件头的偏移量等信息。定义如下:typedef struct tagbitmapfileheader uint bftype;/位图文件的类型,必须为bm dword bfsize;/位图文件的大小,以字节为单位 uint bfreserved1;/位图文件保留字,必须为0 uint

34、bfreserved2;/位图文件保留字,必须为0 dword bfoffbits;/位图数据距文件头的偏移量,以字节为单位 bitmapfileheader;2. bmp位图信息头bmp位图信息头用于说明位图的尺寸等信息,定义如下:typedef struct tagbimapinfoheader dword bisize; /本结构所占用字节数 long biwidth; /位图的宽度,以像素为单位 long biheight; /位图的高度,以像素为单位 word biplanes; /目标设备的级别,必须为1 word bibitcount; /每个像素所需的位数,必须是1(双色)、

35、/4(16色)、8(256色)或24(真彩色)之一 dword bicompression; /位图压缩类型,必须是 0(不压缩)、 /1(bi_rle8压缩类型)或2(bi_rle压缩类型)之一 dword bisizeimage; /位图的大小,以字节为单位 long bixpelspermeter; /位图水平分辨率,每米像素数 long biypelspermeter; /位图垂直分辨率,每米像素数 dword biclrused; /位图实际使用的颜色表中的颜色数 dword biclrimportant; /位图显示过程中重要的颜色数 bitmapinfoheader;3. 颜色表

36、颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个rgbquad类型的结构,且定义一种颜色,定义如下:typedef struct tagrgbquad byte rgbblue;/蓝色的亮度(值范围为0255) byte rgbgreen;/绿色的亮度(值范围为0255) byte rgbred;/红色的亮度(值范围为0255) byte rgbreserved;/保留,必须为0 rgbquad;位图信息头和颜色表组成位图信息,bitmapinfo结构定义如下:typedef struct tagbitmapinfo bitmapinfoheader bmiheader; rgbq

37、uad bmicolorsi; bitmapinfo;颜色表中rgbquad结构数据的个数由bibitcount来确定,当bibitcount=1、4、8时,分别有2、16、256个表项;当bibitcount=24时,没有颜色表项。位图数据记录了位图的每一个像素值,记录顺序是在扫描行内从左到右、扫描行之间从下到上。位图的一个像素值所占的字节数如下:l 当bibitcount=1时,8个像素占1个字节。l 当bibitcount=4时,2个像素占1个字节。l 当bibitcount=8时,1个像素占1个字节。l 当bibitcount=24时,1个像素占3个字节。windows规定一个扫描行所

38、占的字节数必须是4的倍数(即以long为单位),不足的以0填充,一个扫描行所占的字节数计算方法如下:datasizeperline=(biwidthbibitcount+31)/8这是本设计中的一个关键点,无论对图像进行何种变换,都要进行扫描行的4字节对齐。除了上述的windows bmp以外,还有一种与其结构相似,但不完全相同的另一种bmp图像,即os/2采用的bmp。其与windows bmp的主要区别是位图信息结构(信息头结构和颜色表结构)不同。而它们的图像位数据的存储方式是完全一样的。本设计只讨论windows系统下的bmp图像,故对os/2使用的bmp不进行详细分析。3.3 pcx图

39、像pcx是zsoft公司研制的一种常用图像格式,也是在pc机上使用时间最久的一种位图格式。pcx的最新版本支持24位色彩(256色的调色板或全24位rgb),图像的大小可达64k64k个像素。pcx采用游程长度编码来压缩数据,但是有些情况下压缩效率不高,尤其是对于扫描图像或视频图像。pcx存在许多的版本,其文件头中的一个代码标识了文件所支持的zsoft产品版本,不同版本的图像特点如表3.1所示。表3.1 不同pcx版本的图像特点版本号图像特点0基本的单色(2色)或4色图像1基本的单色(2色)或4色图像,另加16位色图像2基本的单色(2色)或4色图像,另加24位调色板的256色以及全24位rgb

40、色图像3基本的单色(2色)或4色图像,4基本的单色(2色)或4色图像5基本的单色(2色)或4色、256色图像以及多平面真彩色图像1. 文件结构及文件头pcx图像由3个部分组成,即文件头、位图数据和一个多达256种色彩的调色板。pcx文件的文件头为固定的128字节。其中包含版本号、被打印或扫描图像的分辨率(单位为每英寸点数)、大小(单位为像素数)、每扫描行字节数、每像素位数和彩色平面数等信息。文件还可能包括一个调色板以及表明该调色板是灰度还是彩色的一个代码。文件的核心部分是位图数据。位图数据以类似于packbits压缩法的游程长度压缩形式记录,像素值通常是单字节的索引值,指向调色板中的位置。如果

41、版本号为5,则文件末尾处还有一个单一的位平面和一个rgb值的256色调色板,3种原色各占1个字节。pcx格式图像的文件头结构如表3.2所示。表3.2 pcx文件头结构起始字节字节数内容解释01zsoft标志10(0x0a),zsoft pcx文件的标志11版本号0:pc paintbrush 2.51:pc paintbrush 2.8,带调色板21编码1:pcx游程长度编码31位/像素每个平面的位/像素值,可能值为1、2,、4或848图像大小图像边界极限为xmin、ymin、xmax、ymax,以像素为单位122水平分辨率打印时,x方向的每英寸点数142垂直分辨率打印时,y方向的每英寸点数1

42、648文件头调色板16色的“ega/vga”头调色板641保留字节zsoft保留,为0651平面彩色/灰度平面数。pcx图像可以是单彩色,也可以具有多个彩色平面662每行字节数每个色彩平面的每行字节数,即存储未压缩图像的一个扫描行所需的字节数,总是偶数682调色板解释1:彩色或黑白2:灰度702视频屏幕大小x视频输出的水平像素数-1722视频屏幕大小y视频输出的垂直像素数-17454全空直到文件结束02. 对pcx进行解码的关键因为在一个pcx文件中可以用到几种不同的记录方法,因此其中必须包含所用方法的标志。在对pcx进行解释时,单靠读取版本号是不够的,最可靠的标志是每像素的位数(文件头的第3

43、个字节)和色彩平面数(文件头的第65个字节),这两个标志与图像色彩数的对应关系如表3.3所示。表3.3 pcx数据的解释每像素的位数色彩平面数解释11单色124色138色1416色214色2416色4116色81256色8316.7兆色平面数说明是否使用了调色板。多于一个平面则没有调色板。如果使用了调色板,则可以由版本号和每像素位数决定pcx图像所使用的调色板类型。3. pcx图像数据的存储如果没有使用调色板,则数据是实际的像素值;否则是调色板表项的索引值。当是实际的像素值时,它们按色彩平面和扫描行存储。其存储格式为:第0行 rrrrrrggggggbbbbbb第1行 rrrrrrgggggg

44、bbbbbb第n行 rrrrrrggggggbbbbbb如果有两个平面,那么色彩是任选的;如果有3个平面,其颜色为rgb;如果有4个平面,则颜色信息包含rgb和光强。光强位只是给像素一种名义上的较高亮度。当使用调色板时,数据指调色板的索引值,它们构成一个完整的图像平面,即不会被分解为单独的色彩平面。数据将按如下的简单方式排列(i是调色板中的索引值):第0行 iiiiiiiiiiiii第1行 iiiiiiiiiiiii第n行 iiiiiiiiiiiiii的长度取决于每像素的位数,如每像素位数为4,则i就是半个字节长。pcx的编码是以最大64个重复单元为一组进行压缩的,不论要记录的是何种类型的数据

45、,都使用同样的游程长度压缩算法。在扫描行中有编码间隔标志,但是,在一个扫描行中的色彩平面之间没有间隔标志。同样,也没有分隔符来标识一个扫描行结束。4. pcx图像的调色板任何pcx文件,如果像素位数超过1但又只有一个色彩平面,则都需要使用调色板。pcx图像由3种不同的调色板实现。版本代码为5的文件最容易确认。如果有一个色彩平面,则它们会在文件结尾处使用256色的“vga”调色板。其他的基于调色板的文件均使用头调色板,而头调色板又有两种可能的实现,即ega和cga。三种不同的调色板介绍如下。(1)位于文件末尾的256色“vga”调色板256色的调色板从文件末尾(eof)前768个字节开始,而且以

46、十进制码12(十六进制0c)开始(7682561字节3,每个r、g和b都是1个字节)。因此,值为n的像素指向调色板中的“eof-7683n”处;后面3个字节分别为该像素红、绿、蓝的值。(2)16色的“ega/vga”头调色板头调色板位于第16第63字节,共48个字节,数据按3元组组织,具有16组3字节数据,每个字节分别对应r、g和b。对于为ega建立的文件,每种原色只可以有4级,所以每个字节提供的256个值的范围被分成4个区域。每个区域与相应的级相对应:063对应第0级、64127对应第1级、128192对应第2级、193254对应第3级。(3)“cga”调色板这种调色板现已过时,在pcx的版

47、本5及更高的版本中不再使用。这中方法只需要字节16和字节19的最高位数据。另外,版本5或更高版本的pcx文件能够支持24位真彩色的pcx文件,其色彩平面为3个位平面。3.4 tga图像tga格式是truevision公司设计并负责解释的图像格式。tga也包含了多种变体,tga文件的第三个字节用来区别不是tga的文件。该字节的值(二进制整数)及对应的文件类型如下。l 0:文件中没有图像数据。l 1:未压缩的,颜色表图像。l 2:未压缩的,rgb图像。l 3:未压缩的,黑白图像。l 9:游程长度(runlength)编码的颜色表图像。l 10:游程长度(runlength)编码的rgb图像。l 1

48、1:压缩的,黑白图像。l 32:使用huffman、delta和runlength编码的颜色表图像。l 33:使用huffman、delta和runlength编码的颜色映射图像,四叉树类型处理1. 数据类型1:未压缩的颜色表(color-mapped)图像tga未压缩颜色表图像格式的说明如表3.4所示。表3.4 tga未压缩颜色表图像格式说明偏移(字节)长度(字节)描述01图像信息字段(见本子表的后面)的字符数。本字段是1字节无符号整型,指出了图像格式区别字段长度,其取值范围是0到255,当它为0时表示没有图像的信息字段11颜色表的类型。该字段为表示对应格式1的图像而包含一个二进制121图像

49、类型码。该字段总为1,这也是此类型为格式1的原因35颜色表规格,颜色表首址32颜色表首元表项的整型(低位-高位)索引52颜色表的长度。颜色表的表项总数,整型(低位-高位)71颜色表表项的位(bit)数。16代表16位tga、24代表24位tga、32代表32位tga810图像规格82图像x坐标的起始位置。图像左下角x坐标的整型(低位-高位)值102图像y坐标的起始位置。图像左下角y坐标的整型(低位-高位)值122图像宽度。以像素为单位,图像宽度的整型(低位-高位)值142图像高度。以像素为单位,图像高度的整型(低位-高位)值161图像每像素存储占用位(bit)数171图像描述符字节bits 3

50、0:每像素的属性位(bit)数bit 4:保留,必须为0bit 5:屏幕起始位置标志0:原点在左下角1:原点在左上角truevision图像必须为0bits 76:交叉数据存储标志00:无交叉01:两路奇/偶交叉10:四路交叉11:保留18可变图像信息字段。包含一个自由格式的,长度是图像记录块偏移0处的字节中的值。它常常被忽略(即偏移0处值为0),其最大可以含有255个字符。如果需要存储更多信息,可以放在图像数据之后(续表)偏移(字节)长度(字节)描述可变可变颜色表数据。起始位置由前一个字段的大小决定;其长度由单项数据大小和数据项数目决定(在前面相应的说明字段中给出),每项是2字节、3字节或4

51、字节,字节中没有使用的位(bit)被认为是属性位(1)4字节表项中,字节1表示blue,字节2表示green,字节3表示red,字节4表示属性(2)3字节表项中各字节依次对应blue、green、red(3)2字节表项中,两个字节分解成如下形式:arrrrrgg gggbbbbb,但是,由于低位在前,高位在后的存储顺序,从文件中读出表项时,将先读入gggbbbbb而后读入arrrrrgg,a表示属性位可变可变图像数据字段。该字段给出了(高度)(宽度)个颜色表项索引,每个索引以整数个字节的形式存储(典型的例子如1或2个字节)所有的数据都没有符号,对于2字节表项而言,低位字节是先存储的2. 数据类

52、型2:未压缩的无颜色表rgb图像tga未压缩的无颜色表rgb图像格式的说明如表3.5所示。表3.5 tga未压缩的无颜色表rgb图像格式说明偏移(字节)长度(字节)描述01图像信息字段(见本子表的后面)的字符数。本字段是1字节无符号整型,指出了图像格式区别字段的长度,其取值范围是0到255,当它为0时表示没有图像的信息字段11颜色表类型。该字段的内容或者为0或者为1;0表示没有颜色表,1表示颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略21图像类型码。该字段总为2,这也是此类型为格式2的原因35颜色表规格。如果颜色表类型字段为0则被忽略;否则描述如下32颜色表首址。颜色表首元入口的整型

53、(低位-高位)索引52颜色表的长度。颜色表的表项总数,整型(低位-高位)71颜色表表项的位(bit)数。16代表16位tga、24代表24位tga、32代表32位tga810图像规格82图像x坐标起始位置。图像左下角x坐标的整型(低位-高位)值102图像y坐标起始位置。图像左下角y坐标的整型(低位-高位)值122图像宽度。以像素为单位,图像宽度的整型(低位-高位)值142图像高度。以像素为单位,图像高度的整型(低位-高位)值161图像每像素存储占用位(bit)数。它的值为16、24或32等,决定了该图像是tga 16、tga24、tga 32等(续表)偏移(字节)长度(字节)描述171图像描述

54、符字节bits 30:每像素对应的属性位的位数;对于tga 16,该值为0或1;对于tga 24,该值为0;对于tga 32,该值为8bit 4:保留,必须为0bit 5:屏幕起始位置标志0:原点在左下角1:原点在左上角truevision图像必须为0bits 76:交叉数据存储标志00:无交叉01:两路奇/偶交叉10:四路交叉11:保留18可变图像信息字段。包含一个自由格式的,长度是图像记录块偏移0处的字节中的值。它常常被忽略(即偏移0处值为0),注意其最大可以含有255个字符。如果需要存储更多信息,可以放在图像数据之后可变可变颜色表数据。如果颜色表类型为0,则该域不存在,否则越过该域直接读

55、取,图像颜色表规格中描述了每项的字节数,为2、3、4之一可变可变图像数据域。这里存储了(宽度)(高度)个像素,每个像素中的rgb色值;该色值包含整数个字节(1)3字节表项中各字节依次对应blue、green、red。(2)2字节表项中,两个字节分解成如下形式:arrrrrgg gggbbbbb,但是,由于低位在前,高位在后的存储顺序,从文件中读出表项时,将先读入gggbbbbb而后读入arrrrrgg;a表示属性位(3)4字节表项包含了分别代表blue、green、red及属性的四个字节。(由于硬件上的原因)有的时候tga 24类型的图像也像tga 32类型的图像那样存储3. 数据类型9:带颜色表的游程长度(runlength)编码图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论