毕业设计论文基于mfc的图片浏览器的设计与实现管理资料.docx
- 文档编号:16270869
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:89
- 大小:299.89KB
毕业设计论文基于mfc的图片浏览器的设计与实现管理资料.docx
《毕业设计论文基于mfc的图片浏览器的设计与实现管理资料.docx》由会员分享,可在线阅读,更多相关《毕业设计论文基于mfc的图片浏览器的设计与实现管理资料.docx(89页珍藏版)》请在冰点文库上搜索。
毕业设计论文基于mfc的图片浏览器的设计与实现管理资料
第1章绪论
图像处理源自于二战中的摄影侦察。
当时,处理操作是通过光学方法来完成的,判读工作则是由专门精于此道并能确定炸弹袭击结果的人员来做。
随着20世纪60年代后期卫星图像的出现,更多基于计算机的工作便开展起来。
彩色合成的卫星图像,有时的确漂亮的让人吃惊,它们已经成为人类视觉文化和对我们这个行星进行认知的一个组成部分。
1980年1月《科学美国人》发表了一幅被称之为“Plume2”的著名图像,它是1979年3月5日通过宇宙飞船旅行者1号在木星的卫星上探测到的8次火山爆发中的第二次。
这幅图像在星际探险图像中是一个里程碑,人们第一次在宇宙中看到了正在爆发的火山。
它也是图像处理领域的一次伟大胜利。
卫星图像以及宇宙探测器所获取的图像直到近年来才大量应用图像处理技术。
在这些技术中,对计算机图像进行数字化处理以得到想要获得的效果,比如使图像的某一部分或某一特性更加明显。
正如计算机图形学一样,直到近几年,图像处理仍然局限在一些实验室里使用,只有这些地方才能提供昂贵的图像处理计算机来满足处理大量高分辨率图像的需要。
随着价格低廉的高性能计算机和诸如数码相机及扫描仪这样的图像采集设备的出现,我们已经看到图像处理技术在向公众领域转移。
经典的图像处理技术很平常地被图像设计人员用来处理图片和生成图像,比如修复图片的缺陷、改变色彩、对比度等,或者通过图像边缘增强这样的处理来改变整个图片的外观。
目前图像处理的主流应用是图像的压缩,即通过互联网进行传递或在可视电话和视频会议中进行动态视频图像的压缩。
可视电话是当今结合计算机图像和传统图像处理的技术,以期产生很高压缩比的交叉领域之一。
所有这一切都是图像的“数字表达”这一不可抗拒的发展趋势的组成部分。
事实上,20世纪最强大、应用最广泛的图像形式——电视图像,也将不可避免的融入数字领域。
数字图像及其处理技术之所以发展的如此迅速并获得广泛的应用,与其自身的优点是息息相关的。
1.再现性好
数字图像处理与模拟图像处理的根本不同在于,它不会因图像的存储、传输或复制等一系列变换操作而导致图像质量的退化。
只要图像在数字化时准确地表现了原稿,则数字图像处理过程始终能保持图像的再现。
2.处理精度高
按目前的技术,几乎可将一幅模拟图像数字化为任意大小的二维数组,这主要取决于图像数字化设备的能力。
现代扫描仪可以把每个像素的灰度等级量化为16位甚至更高,这意味着图像的数字化精度可以达到满足任一应用需求。
对计算机而言,不论数组大小,也不论每个像素的位数多少,其处理程序几乎是一样的。
换言之,从原理上讲不论图像的精度有多高,处理总是能实现的,只要在处理时改变程序中的数组参数就可以了。
回想一下图像的模拟处理,为了要把处理精度提高一个数量级,就要大幅度地改进处理装置,这在经济上是极不合算的。
3.适用面宽
图像可以来自于多种信息源,它们可以是可见光图像,也可以是不可见的波谱图像(例如X射线图像、射线图像、超声波图像或红外图像等)。
从图像反映的客观实体尺度看,可以小到电子显微镜图像,大到航空照片、遥感图像甚至天文望远镜图像。
这些来自不同信息源的图像只要被变换为数字编码形式后,均是用二维数组表示的灰度图像(彩色图像也是由灰度图像组合成的,例如RGB图像由红、绿、蓝三个灰度图像组合而成),因而均可用计算机来处理。
即只要针对不同的图像信息源,采取相应的图像信息采集措施,图像的数字处理方法可适用于任何一种图像。
4.灵活性高
图像处理大体上可分为图像的像质改善、图像分析和图像重建三大部分,每一部分均包含丰富的内容。
由于图像的光学处理从原理上讲只能进行线性运算,这极大地限制了光学图像处理能实现的目标。
而数字图像处理不仅能完成线性运算,而且能实现非线性处理,即凡是可以用数学公式或逻辑关系来表达的一切运算均可用数字图像处理实现。
鉴于数字图像自身的特点,对其进行处理也不是一步就能完成的过程。
可将它分成诸多步骤,必须一个接一个地执行这些步骤,直到提取出有用的数据。
而这些步骤中,数据的存储、表示又占有相当重要的地位,可以说,这是图像处理中最基本的技术。
因此,掌握不同格式图像的编码解码、读写、显示等方法是必不可少的。
为什么会需要如此众多不同类型的图像文件格式呢?
简单的回答就是因为有太多不同类型的图像以及众多不同需求的应用。
完整一些的回答还要考虑到市场份额、所有权以及在图像工业中缺乏的必要协调。
但是,已经有一些标准的文件格式被开发出来。
许多其他图像类型可以通过图像转换软件很容易地转换成这些文件格式,如本设计最终开发出的软件就可以将图像在BMP、PCX、TGA、GIF及JPEG之间互相转换。
与计算机图像相关的一个领域就是计算机图形学。
计算机图形学是计算机科学的一个特殊领域,它指的是通过计算机对可视数据进行再现,这包括为显示或打印生成计算机图像,以及为输出到监视器、打印机、照相机或其他能提供图像的设备上生成和处理的任何图像(真实的或人造的)。
可以认为计算机图形学是计算机图像技术的一部分,图形设计师所使用的许多工具也正在被计算机图像专业人士所采用。
在计算机图形学中,图像数据的类型被分为两个主要种类:
矢量和位图。
矢量图像是指仅通过存储关键点来表达线条、曲线和形体的方法。
这些关键点足以对形体进行定义,而将它变成图像的过程称之为渲染。
当图像被渲染之后,它可以被认为是位图格式,其中每一个像素都具有与之相关的特定值。
位图图像(也称之为光栅图像)可由图像模型I(r,c)来表示,其中包含像素数据以及某些文件格式存储的相应的亮度值。
尽管有些文件被压缩,但仍属于位图图像的范畴,通常这些类型的图像包含头信息和原始图像数据。
文件头必须包含的信息为:
(1)行数(高);
(2)列数(宽);(3)每像素位数;(4)文件类型。
此外,对于某些复杂的文件格式,文件头还必须包含有关所使用的压缩类型的信息,以及创建图像所需要的其他必要的参数。
本设计所讨论和处理的图像均为位图图像。
第2章软件开发平台及编程模式
在系统的设计与开发中,软件开发平台及编程模式是关键,下面介绍一下开发平台的选择、MicrosoftVisualC++及编程模式。
开发平台的选择
在Windows环境下,目前比较流行的可视化开发工具主要有:
VisualC++、VisualBasic、C++Builder、Delphi、PowerBuilder及JBuilder等。
而本软件采用MicrosoftVisualC++,并使用MFCApplicationFramework作为本软件的基本架构。
采用C++来进行图像编程的主要原因是,与Java和C#等现代编程语言相比,C++在程序运行的效率、内存使用的可控性和编程的灵活性上具有优势。
图像处理需要处理大量的图像数据,经常使用复杂、费时的算法,因此图像处理程序的效率非常重要。
C++代码被编译成汇编语言,可以直接在处理器上运行,效率很高。
而Java被编译成字节码,C#被编译成中间语言,都是不能在处理器上执行的,,因此效率较低。
故从运行效率的角度看,采用C++进行图像编程比较合适。
对庞大的图像数据进行处理时需要使用大量的内存,而计算机的物理内存容量往往是有限的,因此需要有效地控制内存的使用。
C++直接控制内存的分配和释放,这虽繁琐,且加大了编程的负担,但却能有效地控制内存的使用。
Java和C#引进了垃圾收集机制,将开发人员从内存管理的繁杂任务中解放出来,不再需要直接控制内存的分配和释放。
但是,无效内存的收集和释放只能周期性地进行,难以达到有效地使用内存。
同样的运算,使用Java和C#所需的内存比使用C++所需的内存要多,即内存的使用率较低。
所以,从内存的使用效率来看,采用C++进行图像处理编程更合适。
C++中大量使用指针,使得编程的灵活性很高,这虽然增加了程序出错的可能性,但是便于程序员施展编程技巧来提高程序的效率。
Java完全取消了指针,C#极大地限制了指针的使用,这都限制了程序员施展技巧。
因此,使用C++进行图像处理编程具有更大的灵活性。
而在以C++为核心语言的可视化编程工具中,MicrosoftVisualC++。
鉴于以上原因,本设计使用MicrosoftVisualC++。
MicrosoftVisualC++及编程模式简介
1.VisualC++可视化编程
VisualC++的资源编辑器能以所见即所得(Whatyouseeiswhatyouget)的形式直接编辑程序的用户界面,为所有资源分配ID标识号。
ClassWizard能把对话框模板与生成的类定义或与已有的类代码连接起来,为菜单项、控制等资源生成空的处理函数模板,创建消息映射条目,并将资源ID与处理函数连接起来。
通过使用AppWizard,程序员的编程工作便简化为用资源编辑器直观的设计界面,完善对话框类代码,在空的处理函数模板处填写响应用户操作的代码,这是一种比较完善的可视化编程方法。
但产品名“VisualC++”也容易误导人,让人认为自己使用的是一个与MicrosoftVisualBasic类似的完全可视化的系统。
然而,使用VisualC++,开发人员必须真正地阅读和编写C++代码。
VisualC++向导可以节省时间和提高精度,但是,程序员也必须理解向导产生的代码,并且,最重要的是,还必须理解MFC库的结构和Windows操作系统的内部工作方式。
2.MFC(MicrosoftFoundationClasses)应用程序框架
应用程序框架的一种定义是:
提供一般应用程序需要的全部面向对象软件组件的集成集合。
C++流行的一个原因是它可以用类库扩充。
类库是可在应用程序中使用的有关C++类的集合。
应用程序框架是类库的超集。
一般的类库只是一种孤立的类的集合,用来嵌入在任何程序中,但是,应用程序框架却定义了程序的结构。
自从MFC库发布以来,MFC已经成为主要的Windows类库。
使用MFC类库构建应用程序具有以下优点:
λMFC库是C++的MicrosoftWindowsAPI。
λ应用程序框架生成的应用程序使用了标准的结构,具有标准化的用户接口,这对具有标准用户界面的Win32程序来说,可以极大的减轻程序员的负担,使程序员不必过多地考虑界面,可把主要精力放在程序设计上,以提高程序设计的效率。
λ使用应用程序框架的应用程序不仅小,而且运行速度快,具有很大的灵活性。
MFC封装了Win32SDK中的几乎所有函数,能实现Win32系统的任何功能。
λVisualC++工具降低了编码的复杂性。
λMFC库应用程序框架有丰富的特性,如:
WindowsAPI的C++接口、通用的(非Windows所特有的)类、“共用根对象”类层次结构、流线式多文档界面(MDI)应用程序支持等。
λ强大的功能。
除封装了大部分的Win32SDK函数外,MFC还提供了应用程序本身的数据和操作及ActiveX、OLE、Internet、WinSock、DAO(DataAccessObjects)、ODBC(OpenDataBaseConnectivity)等操作类。
MFC框架的核心是文档/视图结构(Document-ViewArchitecture),这是一个很好用、但又往往较难以入门的功能。
简单的说,文档/视图结构就是将数据和对数据的观察或数据的表现(显示)相分离。
文档仅处理数据的实际读、写操作,视图则是显示和处理数据的窗口,视图可以操作文档中的数据。
3.Win32编程
编写VisualC++程序实际上就是一个构造类和把类实例化的过程。
由于Windows95/98/Me/NT/2000是PC平台中应用最广泛的操作系统,而Microsoft力图用一个叫做Win32的标准32位应用程序接口作为对这几个操作系统的共同开发接口,所以经常采用Win32来代表Microsoft的32位Windows操作系统,因此VisualC++主要用于针对Win32的应用程序开发。
Win32具有抢先式多任务、多线程和线性寻址内存管理等特征,Win32编程的基本要求包括:
λ应用程序的执行独立于硬件设备。
λ应用程序具有图形用户界面。
λ能在Windows95/98/Me和WindowsNT/2000/XP之间透明移植,并可移植到支持WindowsNT/2000的RISC硬件平台。
λ高性能的抢先式多任务和多线程管理。
λ高级的多媒体支持。
λ通过OLE2技术实现多个应用程序的对象定位。
Microsoft为进行Win32编程提供了一套名为Win32SDK的应用程序编程接口,其中包括上千个Win32系统函数。
VisualC++包括一套叫做MFC(MicrosoftFoundationClassLibrary)的C++类库,其中定义了进行Win32编程所需要的各种类。
有的类封装了大部分的Win32SDK中应用程序的编程接口函数;有的类封装的则是应用程序本身的数据和操作;还有的类封装了ActiveX、OLE和Internet编程特性以及WinSock网络特性和DAO(DataAccessObjects)、ODBC(OpenDatabaseConnectivity)数据访问功能。
Win23SDK和MFC是实现Win32编程的主要工具。
VisualC++的AppWizard工具能自动生成应用程序框架,该框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。
运用VisualC++的资源编辑器(ResourceEditor)能直观地设计程序的用户界面,而ClassWizard能把用户界面和程序代码连接起来。
程序员要做的就是用MFC类实现框架中未完成的应用程序的特定功能部分。
所以使用VisualC++可以实现Win32的可视化程序设计。
4.消息映射
在使用VisualC++进行Win32程序设计时,消息映射是一个非常重要的概念。
Windows应用程序是消息驱动的,应用程序不能直接得到用户所做的操作,如鼠标按键、键盘输入和窗口移动等。
这些操作由操作系统管理,操作系统检测到操作事件后,便向相关的应用程序发送消息,应用程序响应这些消息来完成用户的操作。
(1)消息
Windows中的消息是操作系统与应用程序之间、应用程序与应用程序之间、应用程序各对象之间相互控制与传递信息的方式。
消息的基本格式如下:
MessagewParamlParam
Message是消息名称;wParam是与消息相关的Word型参数;lParam是与消息相关的Long型参数。
消息主要有以下3类。
λWindows系统消息:
Windows系统向窗口发送的消息,由窗口(Window)或视图(View)进行响应处理。
这类消息包括除WM_COMMAND消息之外的名称以WM_开始的其他消息。
λ控制通知消息:
控制或子窗口传给父窗口的WM_COMMAND通知的消息。
λ命令消息:
在响应用户接口操作时,将产生WM_COMMAND命令消息。
其参数指定了用户接口的标识号,如菜单项和按钮等ID号。
(2)消息映射过程
在使用AppWizard创建应用程序时,MFC应用程序框架设置了相应的消息处理函数来响应消息,以完成相应的操作。
消息处理函数是某些类(通常是窗口类)的成员函数和程序员在其中编写响应消息时应进行操作的代码。
框架将消息和它们的处理函数连接起来就是消息映射。
消息映射使应用程序在接收到消息时调用对应的消息处理函数来响应和处理消息。
ClassWizard在创建新类时将为其创建一个消息映射,并为每个类能响应的消息和命令增加对应的处理函数。
在源代码中,消息映射开始于BEGIN_MESSAGE_MAP宏,结束于END_MESSAGE_MAP宏,中间由一系列预定义的被称为“条目宏”的宏组成。
其基本格式如下:
BEGIN_MESSAGE_MAP(classname,parentclassname)
//{{AFX_MSG_MAP(classname)
条目宏1
条目宏2
条目宏3
…………
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
其中classname为拥有消息映射的当前类名,parentclassname为当前类的父类名。
条目宏定义了类所处理的消息与其对应的函数。
。
消息映射条目宏
消息类型
宏格式
说明
Windows消息
ON_WM_XXXX
WM_XXXX为Windows消息名
命令
ON_COMMAND(ID,Function)
ID为命令标识号,Function为处理函数名
更新命令
ON_UPDATE_COMMAND_UI(ID,Function)
ID为命令标识号,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_msgvoidOnPaint();
通过ClassWizard在派生类中用同样的原型定义处理函数并为该函数生成消息映射条目,然后由程序员编写处理函数代码,并在派生类中覆盖了其父类的消息处理函数。
在有些情况下,必须在派生类的消息处理函数中调用其父类的消息处理函数,使Windows和基类能对消息进行处理。
ClassWizard将在生成的处理函数中建议是否应调用父类的消息处理函数及调用的次序。
除此之外,用户定义和注册的消息、命令和控制通知都没有默认的处理函数,需要在定义时声明,一般根据其ID名称来为函数命名。
第3章图像格式分析
在前面曾提到,用数字来表示图像有两种不同的方式,即矢量图和位图(又称为栅格、光栅图像或像素图)。
在具体的实现上,不同的厂家,在不同的系统上和不同的软件中又采用不同的图像表示方式,即以不同的图像格式来表示数字图像。
因此,一个通用的图像处理软件应该能支持多种不同的图像格式,至少应能支持常用的几种图像格式。
本设计所实现的图片浏览软件支持以下几种图像格式:
BMP、PCX、TGA、JPEG、GIF。
这几种图像格式均为在图像处理领域及实际应用中广泛使用的图像格式。
由于图像质量的提高是建立在图像数据量增大的基础上的,而图像数据量的增大将不可避免地降低图像处理的速度,并且给存储和传递带来困难。
因此,如何有效地控制数字图像的存储量已成为数字图像处理的一项重要课题。
数据压缩技术是控制数据量的基本技术。
所谓数据压缩,就是用更少的数据位存储相同容量的信息,目的是更高效地存储信息。
各种图像格式都可以采用一种,甚至多种不同的数据压缩算法来压缩数据量,因此图像格式和压缩算法是密切相关的。
而开发图像处理软件也应首先了解图像的编码及解码方法。
图像的编码和解码
能够对数据进行压缩并大大减少其数据量是因为数据存在大量的数据冗余,即存在冗余的、可预测的和不必要的数据。
数据量(D)与其所表达的信息量(I)一般并不相等,它们之间存在如下关系:
I=D-du
du≥0
其中,du代表数据的冗余量,如冗余量du=0,则不需要也不能对数据进行有效压缩。
即,需要并能够对数据进行有效压缩的条件是du>0。
而图像数据中广泛存在着数据冗余。
数据冗余一般有4种形式,即统计冗余、信息熵冗余、结构冗余、知识冗余。
利用冗余进行图像数据压缩包括两个相反的过程。
λ数据编码:
即对原始图像数据进行编码,以减小其数据量。
λ数据解码:
即把编码压缩的图像数据还原成原始的表示形式。
由于数据编码和数据解码是互逆的过程,只要研究好数据编码就能处理好数据解码。
根据冗余类型的不同,人们提出了不同的数据编码方法,根据不同的出发点可把数据编码方法进行不同的分类。
(1)以对编码数据在解码后能否完全一致的还原为原始数据为标准,可将数据编码方法划分为如下两类。
λ无失真编码(可逆编码):
编码数据进行解码后的数据与编码前的原始数据完全相同,没有任何失真。
λ有失真编码(不可逆编码):
编码数据进行解码后的数据与编码前的数据有一定的偏差或失真,但在视觉效果上基本相同。
(2)根据数据编码的实现原理可以把数据编码划分为预测编码、变换编码、信息熵编码、亚抽样与内插编码、矢量量化编码、基于神经网络的编码、分频带编码、结构编码、基于知识的编码和混合编码等10类。
其中,信息熵编码中的哈夫曼编码(HuffmanCoding)、LZW(LempelZivWelchCompression)编码、游程长度编码(RunLengthCoding)和算术编码(ArithmeticCoding)都是常用的无失真图像编码方式。
由于本设计并未涉及到上述所有的编码算法,故在此不再进行一一说明,在后面的内容中会对使用到的算法及其实现进行详细论述。
BMP图像
BMP图像,即通常所说的位图(Bitmap),是Windows系统中最为常见的图像格式。
Windows(DeviceDependentBitmap)。
DDB是一种内部位图格式,它显示的图像依计算机显示系统的设置不同而不同,因此一般不存储为文件,与通常所说的BMP图像不同。
,结构体BITMAP定义了DDB位图的类型、宽度、高度、颜色格式和像素位值等,代码如下:
typedefstructtagBITMAP
{
intbmType;//位图类型,必须设为0
intbmWidth;//位图宽度
intbmHeight;//位图高度
intbmWidthBytes;//位图中每一扫描行中的字节数
BYTEbmPlanes;//颜色层数
BYTEbmBitsPixel;//每一像素所占的位数
voidFAR*bmBits;//存放像素值内存块的地址
}BITMAP;
DDB中不包括颜色信息,显示时是以系统的调色板为基础进行像素的颜色映射的。
Windows只能保证系统调色板的前20种颜色稳定不变,所以DDB只能保证正确显示少于20色的位图。
WindowsSDK提供标准的DDB位图操作函数;MFC中定义了CBitmap类来说明DDB位图,其中封装了与DDB位图操作相关的数据结构和函数。
Windows(DeviceIndependentBitmap)的支持。
DIB位图可以在不同的机器或系统中显示位图所固有的图像。
相对于DDB而言,DIB是一种外部位图格式,经常存储为常见的以BMP为后缀的位图文件(有时也以DIB为后缀)。
因此,通常所说的BMP图像,即是DIB位图。
BMP位图文件包括4部分,即位图文件头结构BITMAPFILEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表RGBQUAD和位图像素数据,。
位图文件头结构BITMAPFILEHEADER
位图信息头结构BITMAPINFOHEADER
位图颜色表RGBQUAD
位图像素数据
BMP位图文件的结构
下面介绍BMP文件头、BMP位图信息头、。
1.BMP文件头
BMP文件头含有BMP文件的类型、文件的大小、位图文件的保留字、位图数据距文件头的偏移量等信息。
定义如下:
typedefstructtagBITMAPFILEHEADER
{
UINTbfTyp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 论文 基于 mfc 图片 浏览器 设计 实现 管理 资料