基于MFC的图片浏览器的设计与实现
概述 1、选题的目的和意义 2、本文所做的主要工作 3、软件开发平台及编程模式 4、图像格式分析 5、软件设计与实现 6、本设计关键技术及难点 7、软件测试与改进思想
选题的目的和意义 图像是现代信息社会中最基本的信息,它使信息变得栩栩如生,更加符合人们的日常交流习惯,因此它成为人类获取和交换信息的主要来源。如今数字图像处理的应用日益广泛,逐步成为信息科学、工程学、医学等许多学科的重要基础,同时作为一种实用技术广泛应用于军事、气象、交通、探矿、水利、农业甚至娱乐等领域。尤其是价格低廉的高性能计算机和诸如数码相机及扫描仪这样的图像采集设备出现后,数字图像处理技术被大量的应用到影视、游戏等公众及娱乐领域,与人类的生活密切相关。 处理信息量巨大,要求处理速度极高,实时产生高质量的图形图像是我们不断的追求目标。因此本选题具有较好好的实用价值和意义。
本文所做的主要工作 1、详细分析了当今流行的各种图像格式的编码与解码方法。 2、利用Microsoft Visual C++ 6.0作为开发工具,使用MFC Application Framework作为软件的基本架构,设计并开发了一个图片浏览器。 3、实现了对BMP、PCX、TGA、JPEG、GIF图像格式的图片进行读、写、显示等基本功能。 4、利用图像处理中一些变换算法,实现了图像的放大、缩小、旋转及百叶窗、马赛克等显示特效。 5、实现了各种图片格式的转换功能。 6、对所开发的软件进行了测试并提出了改进意见。
软件开发平台及编程模式 本软件采用C++来进行图像编程的主要原因是: 1、C++代码被编译成汇编语言,可以直接在处理器上运行,效率很高。 而在以C++为核心语言的可视化编程工具中,Microsoft Visual C++ 6.0以其自身许多优异的特性而获得了最为广泛的应用。鉴于以上原因,本设计使用Microsoft Visual C++ 6.0作为软件的开发平台。
图像格式分析 用数字来表示图像有不同的格式。因此一个通用的图像处理软件应该能支持多种不同的图像格式。本设计所实现的图片浏览软件支持以下几种在图像处理领域及实际应用中使用的图像格式:BMP、PCX、TGA、JPEG、GIF。 由于图像质量的提高是建立在图像数据的增大的基础上的,而图像数据量的增大将不可避免地减低图像处理的速度,并且给存储和传递带来困难。因此,如何有效地控制数字图像的存储量已成为数字图像处理的一项重要课题。数据压缩技术是控制数据量的基本技术。各种图像格式都可以采用一种,甚至多种不同的数据压缩算法来压缩数据量,因此图像格式和压缩算法是密切相关的。而开发图像处理软件也应首先了解图像的编码及解码方法。
BMP图像 1、位图文件头结构 BITMAPFILEHEADER 2、位图信息头结构 BITMAPINFOHEADER BMP图像即我们通常所说的“位图”,是Windows系统中最为常见的图像格式。经常存储为我们常见的BMP为后缀的位图文件。BMP位图文件包括4部分: 1、位图文件头结构 BITMAPFILEHEADER 2、位图信息头结构 BITMAPINFOHEADER 3、位图颜色表 RGBQUAD 4、位图像素数据
PCX图像 PCX是Zsoft公司研制的一种常用图像格式,也是在PC机上使用时间最久的一种位图格式。PCX的最新版本支持24位色彩(256色的调色板或全24位RGB),图像的大小可达64k×64k个像素。PCX采用游程长度编码来压缩数据,但是有些情况下压缩效率不高,尤其是对于扫描图像或视频图像。
TGA图像 0 — 文件中没有图像数据 1 — 未压缩的,颜色表图像 2 — 未压缩的,RGB图像 3 — 未压缩的,黑白图像 TGA包含了多种变体,TGA文件的第三字节用来区别不是的TGA文件。该字节的值(二进制整数)及对应的文件类型如下: 0 — 文件中没有图像数据 1 — 未压缩的,颜色表图像 2 — 未压缩的,RGB图像 3 — 未压缩的,黑白图像 9 — 游程长度(Runlength)编码的颜色表图像 10 — 游程长度(Runlength)编码的RGB图像 11 — 压缩的,黑白图像 32 — 使用Huffman,Delta和Runlength编码的颜色表图像 33 — 使用Huffman,Delta和Runlength编码的颜色映射图像, 四叉树类型处理
JPEG图像 JPEG的全称是Joint Photographic Experts Group,是由专家组制订的用于连续色调(包括灰度和彩色)静止图像的压缩编码标准。JPEG标准的压缩编码算法是“多灰度静止图像的数字压缩编码”。 JPEG标准包括3部分,即编码器、译码器和交换格式。编码器将原始图像的编码压缩成压缩数据,译码器将压缩的图像数据还原成原始图像数据。图像压缩数据以一定的交换格式存储,格式中包括编码过程中采用的码表等。
GIF图像 GIF全称为Graphics Interchange Format,文件由CompuServe公司开发并持有该图形文件格式的版权。GIF图像是基于颜色表存储的,即图像中每一点的存储数据是该点的颜色对应于颜色列表(即调色板)的索引值。GIF图像最多只支持8位存储位,即最多支持256色图像。GIF文件内部分成许多存储块,用来存储多幅图像或者是决定图像表现行为的控制块,可用于实现动画和交互式应用。GIF文件使用LZW压缩算法压缩图像。
软件设计与实现 需求分析 总体设计 软件界面设计 详细设计与实现
功能需求 : 需求分析 1、可以打开BMP、PCX、TGA、JPEG及GIF图像。 2、打开的图像,用户均能另存为任意一种格式,以实现图像格式的转换。 3、实现图片的放大、缩小,还原。 4、可以对图像进行90度、180度旋转。 5、可以直接调用Windows画图程序打开图片并进行编辑。 6、软件提供“上一张”、“下一张”功能。 7、可以进行全屏幕浏览,并提供“幻灯片播放”的功能,自动显示当前文件夹下的所有图像。
需求分析 8、按F11键可以切换全屏、非全屏浏览,同时,在进行全屏幕浏览时按ESC键也可以退出全屏状态。 9、在载入图片时,提供各种显示效果,用户也可以选择让系统随机选择效果。 10、在查看图片时,用户也可以随时显示“水平百叶窗”、“垂直百叶窗”、“马赛克”、“向上扫描”、“向下扫描”效果。 11、在查看图片时,可以选择从当前目录删除该图片,并将其放入系统回收站中。 12、在窗口的用户区右键单击鼠标,则弹出快捷菜单,显示常用操作命令。
性能需求 需求分析 1、硬件平台要求: 2、软件环境要求: 由于本软件为单机软件,不需进行大量的数据读写和数据交换,故对系统硬件配置的要求并不高,只要能够平稳运行Windows操作系统的硬件平台,都能够使用本软件。 2、软件环境要求: 本软件运行平台为Microsoft Windows 98/Me/NT/2000/XP/2003。
总体设计 以MVC(Model-View-Controller)应用程序结构划分的模块如图所示。 Model View Picture Viewer Model View Controller 图像解码、编码模块 图像显示模块 图像变换模块 PCX模块 GIF模块 OnDraw () 全屏浏览模块 状态栏信息显示 图像缩放模块 图像旋转模块 显示特效模块 TGA模块 BMP模块 JPEG模块
软件界面设计 根据软件的需求分析及图片浏览软件的特点,本设计中软件采用单文档界面(SDI),包括标准菜单、工具栏和状态栏。工具栏上为常用菜单命令按钮,如“打开”、“保存”、“上一张”、“下一张”、“放大”、“缩小”、“旋转”等。另外,在全屏显示时提供浮动工具栏,并且在用户区右击鼠标可以弹出快捷菜单。
软件界面设计 软件的整体界面 软件在全屏状态下的浮动工具条及右键菜单 软件菜单及工具栏
详细设计与实现 软件核心数据结构LanImage类设计 分别设计了BMP、 PCX、 TGA、 JPEG、GIF解码、编码模块 图像显示模块 全屏浏览模块 图像缩放模块 图像旋转模块 图像特效显示
详细设计与实现 软件核心数据结构LanImage类设计 图像显示模块 全屏浏览模块 图像缩放模块 图像旋转模块 图像特效显示
详细设计与实现 前面已分析过BMP 、 PCX、 TGA、 JPEG、GIF图像的存储格式,在本设计中,针对不同的格式设计了不同的解码与编码函数。 格式名 解码函数 编码函数 BMP ReadBmp() SaveBmp() PCX ReadPcx() SavePcx() TGA ReadTga() SaveTga() 由于JPEG和GIF的编码较为复杂,并且时间有限,故在本设计的实现过程中,JPEG和GIF的解码、编码模块调用了第三方的读写库。
关键技术及难点 资源的分配和释放 使用JPEG和GIF读写库时缓冲区格式的转换 实现旋转时对内存的位操作 直接对内存中图像数据进行操作实现的特效 右键菜单的实现 浏览功能的实现
关键技术及难点 资源的分配和释放 由于C++中内存资源的分配和释放均由程序员控制,而本程序多处用到了在内存中开辟缓冲区,因此在本设计的实现过程中,对内存的管理便尤为重要。 例如在打开一张新图片时,就要对上一张图片的缓冲区进行释放,否则会造成内存泄漏。但是由于JPEG和GIF调用了第三方的读写库,其使用的内存缓冲区格式与LanImage类中使用的不同,因此,在进行缓冲区的释放时,首先要判断上一张图片是何种格式,即是否使用了第三方的读写库,如果使用了,则应采取不同的资源释放方式。 本文是在LanImage类中加入BOOL型变量m_bReadWithLibSupport来判断是否使用了JPEG和GIF读写库的。
关键技术及难点 使用JPEG和GIF读写库时缓冲区格式的转换 在使用JPEG和GIF读写库时,其解码后的数据缓冲区格式是不同的,而图像的显示都是通过LanImage::Draw()函数实现的。Draw()函数只能读取LanImage类中m_pImage指向的缓冲区。因此,在图像打开时需要进行缓冲区的转换。另外,如果打开的是BMP、TGA、PCX格式的图像,而用户选择保存为JPEG或GIF图像,那么又要将m_pImage指向的缓冲区转换为JPEG和GIF读写库所使用的缓冲区。
关键技术及难点 实现旋转时对内存的位操作 在对单色和4位色图像进行旋转时,需要进行位操作。以单色位图为例,一个字节包含8个像素,那么在旋转90度时,一个字节中的不同位,会变换到不同的扫描行,也就是说要将字节中的位一一取出,计算其位置,并重新放到新字节的合适的位中。
关键技术及难点 直接对内存中图像数据进行操作实现的特效 本文在实现特效时采用了两种完全不同方法。 一种是利用改变Draw()函数参数实现的特效。 另一种即是先在内存中对图像数据变换生成特效过程中的每一帧图像,然后调用Draw()函数直接将其显示出来。 以马赛克效果为例,如果使用Draw()函数实现,由随机函数确定显示哪一块后,则直接将该块显示出来。而使用内存特效,在消隐的过程中,在此时应该将原始图像数据中的该块对应的数据置为白色,而以前已置为白色的数据块仍保持白色不变;在恢复过程中则正相反,是由原始图像数据代替白色数据。
关键技术及难点 右键菜单的实现 利用MFC函数TrackPopupMenu()实现右键菜单。但是,右键菜单的实现关键是如何更新UI界面的问题。例如,对于“缩小”命令,当连续进行缩小,显示比例减为负值时,应该禁用“缩小”命令,此时,右键菜单中该命令项应该变为灰色。对于普通菜单和工具栏,可以接收UPDATE_COMMAND_UI消息,并在该消息的处理函数中改变命令项的状态。而右键菜单是无法接收该消息的,故必须使用其他的方法。本文采用CMenu类中的EnableMenuItem()函数来实现。
关键技术及难点 浏览功能的实现 在打开一幅图片后,可以使用“上一张”、“下一张”命令或按“Page Up”、“Page Down”键浏览当前目录中可支持的图像。 实现该功能应注意的问题是,在打开一幅图片并读取当前目录中可支图像列表后,如果用户对该目录中的图片进行了删除或向该目录中加入了新的图片,那么在使用“上一张”、“下一张”命令时,应该重新读取文件表。
软件测试与改进思想 1、5种图像格式的解码和显示是否正常。 2、特效是否适合所有大小和颜色深度的图像,图像边界处是否正确处理。 3、几种格式的互相转换,尤其是BMP、TGA、PCX和JPEG或GIF之间的转换。 4、内存分配和释放是否正确,有无内存泄漏。
软件测试与改进思想 本文以实现了需求分析中要求的全部功能,并且按照预期的目标生成了一个完整实用的图像浏览软件。但是由于时间有限,本软件的不足也在所难免,主要有以下几方面需要改进: (1)GIF图像不支持动画。 (2)在保存为PCX图像时只能以8位即256色深度保存。 (3)浏览当前目录中所有图像的功能目前使用静态数组保存文件名,这样如果当前目录中支持的图像文件数超过了数组上限,那么多出的图片将不能使用“上一张”、“下一张”的功能来浏览。
感谢各位老师!