图像的显示保存处理

上传人:豆浆 文档编号:31362771 上传时间:2018-02-07 格式:DOC 页数:14 大小:57.50KB
返回 下载 相关 举报
图像的显示保存处理_第1页
第1页 / 共14页
图像的显示保存处理_第2页
第2页 / 共14页
图像的显示保存处理_第3页
第3页 / 共14页
图像的显示保存处理_第4页
第4页 / 共14页
图像的显示保存处理_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《图像的显示保存处理》由会员分享,可在线阅读,更多相关《图像的显示保存处理(14页珍藏版)》请在金锄头文库上搜索。

1、尺寸信息,图像中各个像素点的亮度信息等等,有了这些数据,开发人员就可以对图像施加各种处理算法,进行相应的处理。这一点需要读者清楚。BMP格式的图像文件又可以分为许多种类,如真彩色位图、256 色位图,采用RLE(游程编码)压缩格式的 BMP 位图等等。由于在实际的工程应用和图像算法效果验证中经常要处理的是 256 级并且是没有压缩的 BMP 灰度图像,例如通过黑白采集卡采集得到的图像就是这种格式,所以我们在整个讲座中范例所处理的文件格式都是 BMP 灰度图像。如果读者对这种格式的位图能够作到熟练的操作,那么对于其余形式的 BMP 位图的操作也不会很困难。BMP 灰度图像作为 Windows 环

2、境下主要的图像格式之一,以其格式简单,适应性强而倍受欢迎。正如我们在上一讲中介绍过的那样,这种文件格式就是每一个像素用 8bit 表示,显示出来的图像是黑白效果,最黑的像素的灰度(也叫作亮度)值为 0,最白的像素的灰度值为 255,整个图像各个像素的灰度值随机的分布在 0 到 255 的区间中,越黑的像素,其灰度值越接近于 0,越白(既越亮)的像素,其灰度值越接近于 255;与此对应的是在该文件类型中的颜色表项的各个 RGB 分量值是相等的,并且颜色表项的数目是 256 个。结合这些问题,下面我们针对性的给出了操作灰度 BMP 图像时的部分函数实现代码及注释。一、 BMP 位图操作首先我们回顾

3、一下上讲中的重要信息:BMP 位图包括位图文件头结构 BITMAPFILEHEADER、位图信息头结构 BITMAPINFOHEADER、位图颜色表 RGBQUAD 和位图像素数据四部分。处理位图时要根据文件的这些结构得到位图文件大小、位图的宽、高、实现调色板、得到位图像素值等等。这里要注意的一点是在 BMP 位图中,位图的每行像素值要填充到一个四字节边界,即位图每行所占的存储长度为四字节的倍数,不足时将多余位用 0 填充。有了上述知识,可以开始编写图像处理的程序了,关于在 VC 的开发平台上如何开发程序的问题这里不再赘述。在开发该图像处理程序的过程中,笔者没有采用面向对象的方法,虽然面向对象

4、的方法可以将数据封装起来,保护类中的数据不受外界的干扰,提高数据的安全性,但是这种安全性是以降低程序的执行效率为代价的,为此,我们充分利用了程序的文档视图结构,在程序中直接使用了一些 API 函数来操作图像。在微软的 MSDN 中有一个名为 Diblook 的例子,该例子演示了如何操作 Dib 位图,有兴趣的读者可以参考一下,相信一定会有所收获。启动 Visual C+,生成一个名为 Dib 的多文档程序,将 CDibView类的基类设为 CscrollView 类,这样作的目的是为了在显示位图时支持滚动条,另外在处理图像应用程序的文档类(CDibDoc.h)中声明如下宏及公有变量:最后将程序

5、的字符串表中的字符串资源 IDR_DibTYPE 修改为:nDibnDibnDib Files(*.bmp;*.dib)n.bmpnDib.DocumentnDib Document。这样作的目的是为了在程序文件对话框中可以选择 BMP 或 DIB 格式的位图文件。 1、读取灰度 BMP 位图可以根据 BMP 位图文件的结构,操作 BMP 位图文件并读入图像数据,为此我们充分利用了 VC 的文档视图结构,重载了文挡类的 OnOpenDocument()函数,这样用户就可以在自动生成程序的打开文件对话框中选择所要打开的位图文件,然后程序将自动调用该函数执行读取数据的操作。该函数的实现代码如下所示

6、:上面的方法是通过 CFile 类对象的操作来读取位图文件的,它需要分析位图中的文件头信息,从而确定需要读取的图像长度。这种方法相对来说有些繁琐,其实还可以以一种相对简单的方法读取位图数据,首先在程序的资源中定义 DIB 类型资源,然后添加位图到该类型中,将图像数据以资源的形式读取出来,这时候就可以根据所获取的数据中的位图信息结构来获取、显示图像数据了。下面的函数实现了,该函数的实现代码如下所示:2、 灰度位图数据的存储为了将图像处理后所得到的像素值保存起来,我们重载了文档类的 OnSaveDocument()函数,这样用户在点击 Save 或 SaveAs子菜单后程序自动调用该函数,实现图像

7、数据的存储。该函数的具体实现如下:二、调色板的操作通过上面的操作,我们已经可以获取图像中的数据了,现在的又一个问题是如何在窗口中显示出图像数据。灰度图像要正确显示,必须实现逻辑调色板和系统调色板。首先我们介绍一下,该结构定义如下:可以通过 CDC:SelectPalette()、CDC:RealizePalette()或相应的 API函数来实现上述的两个步骤。在实现调色板的过程中,通过在主框架类中处理Windows 定义的消息 WM_QUERYNEWPALETTE 、WM_PALETTECHANGED 及视图类中处理自定义消息 WM_DOREALIZE(该消息在主框架窗口定义如下:#defin

8、e WM_REALIZEPAL (WM_USER+101))来实现调色板的操作。当系统需要处理调色板的变化时,将向程序的主窗口发送 WM_QUERYNEWPALETTE 、WM_PALETTECHANGED,例如当某一窗口即将激活时,主框架窗口将收到WM_QUERYNEWPALETTE 消息,通知该窗口将要收到输入焦点,给它一次机会实现其自身的逻辑调色板;当系统调色板改变后,主框架窗口将收到WM_PALETTECHANGED 消息,通知其它窗口系统调色板已经改变,此时每一窗口都应该实现其逻辑调色板,重画客户区。由于上述的调色板变更消息是发往主框架窗口的,所以我们只能在主窗口中响应这两个消息,然

9、后由主框架窗口通知各个视窗,使得程序激活时能自动装载自己的调色板。我们定义的用户消息 WM_REALIZEPAL 用于主框架窗口通知视窗它已经收到调色板变更消息,视窗应该协调其调色板。下面我们给出了各个消息的响应处理函数的具体实现代码和注释: 注:读者可以从后面的显示部分的实现看出我们在显示时实现了逻辑调色板。上述的处理相对来说比较繁琐复杂,可能对于初学者来说也比较难于理解,所以这样作的好处是在取灰度位图时可以不再考虑文件中的颜色表信息,提高了文件读取速度,笔者在开发一个基于机器泳醯南钅渴辈捎玫木褪钦庵址椒 吮冉下獾男 ?/p三、图像的显示显示 DIB 位图数据可以通过设备上下文 CDC 对象

10、的成员函数 CDC:Bitblt()或 CDC:StretchBlt()来实现,也可以通过 API 函数SetDIBBitsToDevice()或 StretchDIBBits()来实现,函数中具体所用到的各个参数的意义可以参考 MSDN。其中 StretchDIBBits()和 CDC:StretchBlt()可以将图像进行放大和缩小显示。当从文档中装入位图文件时, CDIBView 类的OnInitialUpdate 函数将被调用,因此可以在该函数中实现对视图尺寸的设置,用于正确的显示位图,然后就可以在视图类的 OnDraw()函数中正确的显示位图了。这两个函数的具体实现代码分别如下所示:

11、 四、 小结在本期讲座里我们主要介绍了如何操作灰度位图,它具有较强的代表性,同时为后续的图像处理编程的学习作了必要的准备工作,经过学习,对于如何操作其它类型的 BMP 格式的图像文件,可以达到举一反三的作用。 VC 数字图像处理编程讲座之四BMP 图像显示的特效操作上期讲座中我们主要讲述了 BMP 图像数据的存取、图像的显示和调色板的操作等内容,在上面的学习基础上,我们可以进一步深化,学习并掌握图像特效显示技术。有了这种技术,可以用来在今后的项目开发中美化我们的软件界面,提高软件的视觉效果。在如今的商业软件中,几乎每一幅图像的显示都采用了图像特效显示,例如读者比较熟悉的 Windows 的屏幕

12、保护程序就采用了各种各样的图像特效显示,使人感到眼花缭乱和耳目一新。专业图像处理软件更是提供了丰富的显示方式供用户使用,可以方便的在程序中实现图像的特效显示,如 PhotoShop 、Authorware 等。本节主要介绍如何实现图像的浮雕、雕刻、百页窗、旋转、扫描、栅条、马赛克、和渐显渐隐显示等效果。通过这期讲座的学习,读者朋友们也可以自己动手制作拥有特效显示效果的软件了。图像的显示我们讲过主要有 BitBlt()、SetDIBitsToDevice()和StretchDIBits()等函数。需要读者注意的是,在特效显示时,并不是每个显示函数都适宜,BitBlt()函数主要是用来显示设备相关

13、位图(DDB),SetDIBitsToDevice()和 StretchDIBits()两个函数用来显示设备无关位图(DIB)。由于我们讲座里处理的是设备无关位图,所以我们主要关心的是后两个函数的应用,其中 SetDIBitsToDevice()使用起来较死板,远不如 StretchDIBits()用的灵活,并且对大多数的特效显示无能为力,所以为了实现图像的特效显示效果,需要使用 StretchDIBits ()函数来显示图像,具体什么原因,我想可能是微软在实现这些函数时使用的方法不同吧。这些函数如何使用,各个参数的含义,可以参考微软的 MSDN。实现图像的特殊效果的显示的基本思路是要么是操作

14、图像的像素,要么是对图像分块按一定的方向或次序,分阶段的显示或擦除对应的图像块。对于第二种显示的思路,其中的要点是:1.划分图像块;2.确定图像块的操作次序;3.显示或清除对应的图像块;4.在两个连续显示的图像块之间插入一个固定的延迟。其中图像块的划分决定了图像的显示方式,图像块的显示顺序决定了显示的方向和细分的依据。不同的效果决定了不同的分块方法和显示次序,我们将在后面的各种特效显示中介绍如何分块和决定次序。为了使图像的显示过程明显的表现出来,实现显示的特效,就需要在图像块的依此显示中插入固定的延迟。也许读者朋友会想到利用 sleep()函数或用 Settime()来实现延迟,由于Windo

15、ws 是个基于消息的多任务操作系统,这些方法所产生的延迟时间对于图像的显示来说是不精确的,为了实现与机器无关的更精确的时间延迟,可以采用 timeGetTime()函数来产生微秒级的延迟。使用这个函数时为了编译不产生错误,要在连接设置中引入 Winmm.lib 库,并要包含头文件 Mmsystem.h。这里我们首先给出一个延迟函数,它用来实现固定时间的延迟:void DelayTime(DWORD time)DWORD BeginTime ,EndTime;BeginTime=timeGetTime();/得到当前的系统时间、单位为微秒;doEndTime=timeGetTime();/再次得

16、到当前的系统时间;while(EndTime-BeginTime)一、操作位图的像素实现显示的特效我们首先介绍直接操作图像中的像素的灰度值来实现图像显示的特效、这里我们主要介绍如何实现图像的浮雕和雕刻效果。经常看电视的朋友们不知注意到没有,有些电视连续剧在每集片头或片尾部分都有显示一些特殊效果的图像,比如前一阵子中央一套放的长征和康熙王朝,这些特效称为图像的浮雕效果和图像的雕刻效果,经过这些特效处理后的图像增强了观众们的视觉效果,它们看上去仿佛是使用 3D 技术作的,这也许就是为什么这种技术那么流行的原因吧。其实,我们完全可以用一些简单的数字图像处理算法来实现这些看似复杂高深的显示效果。下面以一个标准的 Lena 灰度图像为原图,给出了处理后的效果图,同时给出了 VC 开发平台上的部分实现源代码。1浮雕图像浮雕图象效果是指图像的前景前向凸出背景。所谓的浮雕概念是指标绘图像上的一个像素和它左上方的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号