【vc++精品源码栏目提醒】:网学会员为需要vc++精品源码的朋友们搜集整理了图像的显示保存处理 - 其它资料相关资料,希望对各位网友有所帮助!
尺寸信息,图像中各个像素点的亮度信息等等,有了这些数据,开发人员就可以对图像施加各种处理算法,进行相应的处理。
这一点需要读者清楚。
BMP 格式的图像文件又可以分为许多种类,如真彩色位图、256 色位图,采用 RLE游程编码压缩格式的 BMP 位图等等。
由于在实际的工程应用和图像算法效果验证中经常要处理的是 256 级并且是没有压缩的 BMP 灰度图像,例如通过黑白采集卡采集得到的图像就是这种格式, 所以我们在整个讲座中范例所处理的文件格式都是BMP 灰度图像。
如果读者对这种格式的位图能够作到熟练的操作,那么对于其余形式的 BMP 位图的操作也不会很困难。
BMP 灰度图像作为 Windows 环境下主要的图像格式之一,以其格式简单,适应性强而倍受欢迎。
正如我们在上一讲中介绍过的那样,这种文件格式就是每一个像素用 8bit 表示,显示出来的图像是黑白效果,最黑的像素的灰度(也叫作亮度)值为 0,最白的像素的灰度值为 255,整个图像各个像素的灰度值随机的分布在0 到 255 的区间中,越黑的像素,其灰度值越接近于 0,越白(既越亮)的像素,其灰度值越接近于 255;与此对应的是在该文件类型中的颜色表项的各个 RGB 分量值是相等的,并且颜色表项的数目是 256 个。
结合这些问题,下面我们针对性的给出了操作灰度 BMP 图像时的部分函数实现代码及注释。
一、 BMP 位图操作 首先我们回顾一下上讲中的重要信息:BMP 位图包括位图文件头结构 BITMAPFILEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表 RGBQUAD 和位图像素数据四部分。
处理位图时要根据文件的这些结构得到位图文件大小、位图的宽、高、实现调色板、得到位图像素值等等。
这里要注意的一点是在 BMP 位图中,位图的每行像素值要填充到一个四字节边界,即位图每行所占的存储长度为四字节的倍数, 不足时将多余位用0 填充。
有了上述知识,可以开始编写图像处理的程序了,关于在 VC 的开发平台上如何开发程序的问题这里不再赘述。
在开发该图像处理程序的过程中,笔者没有采用面向对象的方法, 虽然面向对象的方法可以将数据封装起来, 保护类中的数据不受外界的干扰,提高数据的安全性,但是这种安全性是以降低程序的执行效率为代价的,为此,我们充分利用了程序的文档视图结构,在程序中直接使用了一些API 函数来操作图像。
在微软的 MSDN 中有一个名为 Diblook 的例子,该例子演示了如何操作 Dib 位图,有兴趣的读者可以参考一下,相信一定会有所收获。
启动 Visual C,生成一个名为 Dib 的多文档程序,将 CDibView 类的基类设为CscrollView 类,这样作的目的是为了在显示位图时支持滚动条,另外在处理图像应用程序的文档类(CDibDoc.h)中声明如下宏及公有变量: 最后将程序的字符串表中的字符串资源 IDR_DibTYPE 修改为:nDibnDibnDibFiles.bmp.dibn.bmpnDib.DocumentnDib Document。
这样作的目的是为了在程序文件对话框中可以选择 BMP 或 DIB 格式的位图文件。
1、读取灰度 BMP 位图 可以根据 BMP 位图文件的结构,操作 BMP 位图文件并读入图像数据,为此我们充分利用了 VC 的文档视图结构,重载了文挡类的OnOpenDocument()函数,这样用户就可以在自动生成程序的打开文件对话框中选择所要打开的位图文件,然后程序将自动调用该函数执行读取数据的操作。
该函数的实现代码如下所示: 上面的方法是通过 CFile 类对象的操作来读取位图文件的,它需要分析位图中的文件头信息,从而确定需要读取的图像长度。
这种方法相对来说有些繁琐,其实还可以以一种相对简单的方法读取位图数据, 首先在程序的资源中定义 DIB 类型资源,然后添加位图到该类型中,将图像数据以资源的形式读取出来,这时候就可以根据所获取的数据中的位图信息结构来获取、显示图像数据了。
下面的函数实现了,该函数的实现代码如下所示:2、 灰度位图数据的存储 为了将图像处理后所得到的像素值保存起来,我们重载了文档类的 OnSaveDocument()函数,这样用户在点击 Save 或 SaveAs 子菜单后程序自动调用该函数,实现图像数据的存储。
该函数的具体实现如下:二、调色板的操作 通过上面的操作,我们已经可以获取图像中的数据了,现在的又一个问题是如何在窗口中显示出图像数据。
灰度图像要正确显示,必须实现逻辑调色板和系统调色板。
首先我们介绍一下,该结构定义如下: 可以通过 CDC::SelectPalette、CDC::RealizePalette或相应的 API 函数来实现上述的两个步骤。
在实现调色板的过程中,通过在主框架类中处理 Windows定义的消息 WM_QUERYNEWPALETTE 、WM_PALETTECHANGED 及视图类中处理自定义消息 WM_DOREALIZE(该消息在主框架窗口定义如下:define WM_REALIZEPALWM_USER101)来实现调色板的操作。
当系统需要处理调色板的变化时,将向程序的主窗口发送 WM_QUERYNEWPALETTE 、WM_PALETTECHANGED,例如当某一窗口即将激活时,主框架窗口将收到 WM_QUERYNEWPALETTE 消息,通知该窗口将要收到输入焦点,给它一次机会实现其自身的逻辑调色板;当系统调色板改变后,主框架窗口将收到 WM_PALETTECHANGED 消息,通知其它窗口系统调色板已经改变,此时每一窗口都应该实现其逻辑调色板,重画客户区。
由于上述的调色板变更消息是发往主框架窗口的, 所以我们只能在主窗口中响应这两个消息,然后由主框架窗口通知各个视窗, 使得程序激活时能自动装载自己的调色板。
我们定义的用户消息 WM_REALIZEPAL 用于主框架窗口通知视窗它已经收到调色板变更消息,视窗应该协调其调色板。
下面我们给出了各个消息的响应处理函数的具体实现代码和注释: 注:读者可以从后面的显示部分的实现看出我们在显示时实现了逻辑调色板。
上述的处理相对来说比较繁琐复杂,可能对于初学者来说也比较难于理解,所以这样作的好处是在取灰度位图时可以不再考虑文件中的颜色表信息, 提高了文件读取速度,笔者在开发一个基于机器泳醯南钅渴辈捎玫木褪钦庵址椒 ǎ ×吮冉下獾男 Ч /pgt三、图像的显示 显示 DIB 位图数据可以通过设备上下文 CDC 对象的成员函数CDC::Bitblt或 CDC::StretchBlt来实现,也可以通过 API 函数SetDIBBitsToDevice或 StretchDIBBits来实现,函数中具体所用到的各个参数的意义可以参考 MSDN。
其中 StretchDIBBits和 CDC::StretchBlt可以将图像进行放大和缩小显示。
当从文档中装入位图文件时, CDIBView 类的OnInitialUpdate 函数将被调用,因此可以在该函数中实现对视图尺寸的设置,用于正确的显示位图,然后就可以在视图类的 OnDraw()函数中正确的显示位图了。
这两个函数的具体实现代码分别如下所示: 四、 小结 在本期讲座里我们主要介绍了如何操作灰度位图,它具有较强的代表性,同时为后续的图像处理编程的学习作了必要的准备工作,经过学习,对于如何操作其它类型的 BMP 格式的图像文件,可以达到举一反三的作用。
VC 数字图像处理编程讲座之四 BMP 图像显示的特效操作 上期讲座中我们主要讲述了 BMP 图像数据的存取、图像的显示和调色板的操作等内容,在上面的学习基础上,我们可以进一步深化,学习并掌握图像特效显示技术。
有了这种技术,可以用来在今后的项目开发中美化我们的软件界面,提高软件的视觉效果。
在如今的商业软件中,几乎每一幅图像的显示都采用了图
上一篇:
解析Visual Studio 2005中QT配置使用
下一篇:
配电自动化系统计算机网络及其支持软件的体系结构