图像特效显示算法研究与实现设计.docx

上传人:b****5 文档编号:6598899 上传时间:2023-01-08 格式:DOCX 页数:23 大小:384.07KB
下载 相关 举报
图像特效显示算法研究与实现设计.docx_第1页
第1页 / 共23页
图像特效显示算法研究与实现设计.docx_第2页
第2页 / 共23页
图像特效显示算法研究与实现设计.docx_第3页
第3页 / 共23页
图像特效显示算法研究与实现设计.docx_第4页
第4页 / 共23页
图像特效显示算法研究与实现设计.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

图像特效显示算法研究与实现设计.docx

《图像特效显示算法研究与实现设计.docx》由会员分享,可在线阅读,更多相关《图像特效显示算法研究与实现设计.docx(23页珍藏版)》请在冰豆网上搜索。

图像特效显示算法研究与实现设计.docx

图像特效显示算法研究与实现设计

摘要

随着计算机的飞速发展,数字图像技术的应用领域也越来越广泛。

它现在已经和我们的生活息息相关,无论是在科研还是教育等领域都发挥着重要的作用。

而图像特效显示仅仅是数字图像技术的一个分支。

图像特效显示在我们的生活中也很常见,例如Windows7系统的屏保就是一个简单的特效显示的例子。

因此研究图像特效显示对计算机图形图像技术的发展能起到推动的作用。

本论文主要阐述了基于VisualC++的图像特效显示的原理和方法,分别对一些常见的图像特效显示的算法做了研究与实现,主要研究的图像特效算法有马赛克、百叶窗、栏栅、渐显、图像翻转、图像锐化、图像反色、图像灰度化以及冒泡等。

同时本论文还对软件的设计以及实现过程做了详细的说明,而且还介绍了一些有关DIB(设备无关位图文件)的相关知识。

关键词:

MFC;特效显示;GDI;VisualC++;图形图像;GDI

Abstract

Withtherapiddevelopmentofcomputer,digitalimagetechnologyapplicationsaremoreandmorewidely.Nowitisinrelationshipwithourlifeclosely,bothinscientificresearchandeducationandotherfieldsareplayinganimportantrole.Butspecialdisplaypicturejustisabranchofdigitalimagetechnology.Imageeffectsshowisalsoverycommoninourlife,suchasWindows7systemscreensaverisasimpleexampleshowneffects.Sotheimageeffectsaccordingtothedevelopmentofcomputergraphicstechnologywillplayapromoterole.

ThisthesismainlyexpoundstheimageeffectsbasedonVisualc++showstheprincipleandmethodofimagesofsomeofthecommoneffectsshowsthatthealgorithmtodotheresearchandimplementation,mainlystudiesthealgorithmsofimageeffectshaveMosaic,shutter,fence,fadein,turnover,imagesharpening,imagecolorimage,theimagegraysandbubblingetc.Atthesametimethepaperalsodetailedtheprocessofsoftwaredesignandimplementationoftheinstructions,butalsointroducedsomeoftheDIB(device-independentbitmapfile).

KeyWords:

MFC;Specialeffectsdisplay;GDI;Visualc++;Graphicimages;GDI

第一章前言

1.1数字图像处理的研究内容以及应用领域

数字图像处理的英文名称是“DigitalImageProcessing”。

通常所说的数字图像处理是指用计算机进行处理,因此也称为计算机图像处理(ComputerImageProcessing)。

数字图像处理技术是一个跨学科的领域。

随着计算机科学技术的不断发展,图像处理和分析逐渐形成了自己的科学系统,新的处理方法层出不穷,尽管其发展历史不长。

总的来说数字图像处理包括以下几个方面点运算,几何变换,图像增强,图像复原图像重建,图像形态学处理,图像分割,图像编码,图像匹配等等。

而对于图像处理的应用领域也是越来越广泛,已经渗透到一般工业、航天、医疗保健、交通、刑侦等各个领域,在国民经济中发挥着越来越大的作用[1]。

1.2数字图像概述

数字图像可以看成一个矩阵,或一个二维数组,这是在计算机上表示的方式。

形象的说一幅数字图像就像纵横交错的棋盘,棋盘行和列的数目就表示图像的大小,棋盘的格子就是图像的基本元素,称为像素。

而对于彩色图像,数字图像的显示必须从三原色RGB的概念说起。

众所周知,自然界中基本所有的颜色都可以由红绿蓝(R、G、B)三原色组合而成。

有的颜色含有红色成分多一些,其他成分少一些。

针对含有红色成分的多少,可以人为地分成0到255共256个等级,0级表示不含红色成分,255级表示含有100%的红色成分。

同样,绿色和蓝色也可以被分成256级。

这样,根据红、绿、蓝各种不同的组合我们就能表示出256*256*256(约1600万)种颜色[2]。

当一幅图中每个像素被赋予不同的RGB值时,就能呈现出五彩缤纷的颜色,这就形成了彩色图像。

1.3图像特效显示的概念及研究概括

静态图像显示就是把一幅图像输出到显示屏区域,该区域会很迅速的呈现出整副图像,而对于图像的特效显示,则把图像以像素为单位,以一定规律顺序分部分的输出到显示区域,在输出的过程中还加入一定的时间延迟,在人眼的视觉中就会产生一个连续变幻并逐渐形成一幅完整图像的效果。

除此之外也可以在显示图像时将图像的每个像素点的色彩从一个色彩连续的变化到另外的一个色彩。

现如今对马赛克、扫描、栅条、百页窗、渐显渐隐、图像翻转、冒泡显示等效果都是比较流行的图像特效显示,其算法不仅相对简单而且视觉效果也很美观,因此广泛的应用于数码、广告、影视、多媒体等大部分与图像显示相关的领域。

图像特效显示变化灵活多样,在设计时更是可以灵活的运用程序的控制,实现更多创新的想法,这样使用程序算法灵活的控制特效显示便成了我们主要的设计工作。

而对于某些特效显示,如扫描算法是没有确定算法的,只要实现扫描过程的视觉特效即可,对这些常用特效也可通过与其他特效的组合成别的特效显示。

1.4DIB简介

DIB英文名为“DeviceIndependentBitmap”,即设备无关位图,因此DIB就是一种文件格式,它的存在是为了保证用某个应用程序创建的图形可以被其它应用程序装载或显示。

顾名思义,DIB是与设备无关的,它的与设备无关性主要体现在DIB的颜色模式与设备无关[3]。

例如,一个256色的DIB即可以在真彩色显示模式下使用,也可以在16色模式下使用。

256色以下(包括256色)的DIB拥有自己的颜色表,像素的颜色独立于系统调色板。

对于调色板的概念本论文也有相应的介绍。

由于DIB不依赖于具体设备,因此可以用来永久性地保存图象。

除此之外,DIB一般是以后缀名为.BMP的文件格式保存在磁盘中,有时后缀名也可以是.DIB。

运行在不同输出设备下的应用程序可以通过DIB来交换图象。

而本论文用的就是DIB。

与BorlandC++下的框架类库OWL不同,MFC未提供现成的类来封装DIB。

尽管Microsoft列出了一些理由,但没有DIB类的确给MFC(本论文的程序就是用MFC开发的,本论文对MFC也有相应的介绍)用户带来很多不便。

用户要想使用DIB,首先应该了解DIB的结构。

在内存中,一个完整的DIB由两部分组成:

一个BITMAPINFO结构和一个存储像素阵列的数组。

BITMAPINFO描述了位图的大小,颜色模式和调色板等各种属性[4],其定义如下:

typedefstructtagBITMAPINFO{

BITMAPINFOHEADERbmiHeader;

RGBQUADbmiColors[1];//颜色表、调色板

}BITMAPINFO;

RGBQUAD结构用来描述颜色,其定义如下:

typedefstructtagRGBQUAD{

BYTErgbBlue;//蓝色的强度

BYTErgbGreen;//绿色的强度

BYTErgbRed;//红色的强度

BYTErgbReserved;//保留字节,为0

}RGBQUAD;

RGBQUAD结构体中的颜色顺序是BGR,而不是平时所称的RGB。

BITMAPINFOHEADER结构包含了DIB的各种信息,其定义如下:

typedefstructtagBITMAPINFOHEADER{

DWORDbiSize;//该结构的大小

LONGbiWidth;//位图的宽度(以像素为单位)

LONGbiHeight;//位图的高度(以像素为单位)

WORDbiPlanes;//必须为1

WORDbiBitCount//每个像素的位数(1、4、8、16、24或32)

DWORDbiCompression;//压缩方式,一般为0或BI_RGB(未压缩)

DWORDbiSizeImage;//以字节为单位的图象大小(仅用于压缩位图)

LONGbiXPelsPerMeter;//以目标设备每米的像素数来说明位图的水平分辨率

LONGbiYPelsPerMeter;//以目标设备每米的像素数来说明位图的垂直分辨率

DWORDbiClrUsed;/*颜色表的颜色数

DWORDbiClrImportant;//重要颜色的数目,若该值为0则所有颜色都重要

}BITMAPINFOHEADER;

DIB与DDB(设备相关位图文件,英文名“DeviceDependentBitmap”)不同,DIB的字节数组是从图象的最下面一行开始的逐行向上存储的,也即等于把图象倒过来然后在逐行扫描。

另外,字节数组中每个扫描行的字节数必需是4的倍数,如果不足要用0补齐[5]。

前面说过DIB可以存储在*.BMP或*.DIB文件中。

DIB文件是以BITMAPFILEHEADER结构开头,BITMAPFILEHEADER结构定义如下:

typedefstructtagBITMAPFILEHEADER{

WORDbfType;//文件类型,必须为"BM"

DWORDbfSize;//文件的大小

WORDbfReserved1;//为0

WORDbfReserved2;//为0

DWORDbfOffBits;//存储的像素阵列相对于文件头的偏移量

}BITMAPFILEHEADER;

紧随BITMAPFILEHEADER结构的是一个BITMAPINFOHEADER结构,然后是RGBQUAD结构组成的颜色表,即调色板,文件最后存储的是DIB的像素阵列。

DIB的颜色信息储存在自己的颜色表中,因此程序一般要根据自己的颜色表为DIB创建逻辑调色板。

同时在输出一幅DIB之前,程序应该将其逻辑调色板选入到相关的设备上下文并同步到系统调色板,然后再调用相关的GDI函数(如:

:

SetDIBitsToDevice或:

:

StretchDIBits)输出DIB。

在输出过程中,GDI函数会把DIB转换成DDB。

这项工作主要包括以下两步,首先将DIB的颜色格式转换成与输出设备相同的颜色格式,然后将DIB像素的逻辑颜色索引转换称系统调色板索引。

前面已经说过,由于MFC未提供DIB类,用户在使用DIB时将面临繁重的WindowsAPI编程任务,使用起来很不方便。

而VisualC++提供了一个高层次的API,简化了DIB的使用,而在本论文中,在网上找到了一个的Cdib类,对DIB的API进行了良好的封装,这样就更加简化了DIB的使用。

1.5调色板

调色板也叫做颜色表,就是前面RGBQUAD结构体。

为了保证Windows基本显示界面的一致性,Windows保留了一个20种颜色的内部系统调色板,用来绘制窗口的图标、边界等通用界面。

该调色板在所有的显示设置中都保持不变。

在16色的显示系统中,系统调色板通过16种颜色的抖动来产生其余4种颜色。

在256色的显示系统中,Windows也保持20种颜色的次序,其余236种颜色由当前的调色板分配[6]。

需要注意的是,真彩色不需要调色板,其中的像素值就是24位的颜色值。

16色系统通常采用Windows的内部系统调色板,一般不直接操作调色板。

所以通常,仅在256色显示系统中操作调色板。

在调色板显示系统中,每一幅图像都有自己的调色板,而每一个活动窗口或应用程序都根据自己的需要操作当前的调色板,但是对调色板的操作将影响整个显示系统。

这将导致如下的结果,即如果两个窗口或者应用程序使用了不同的调色板,每一时刻都将只有一个窗口或应用程序的显示是正确的,另一个将被强制使用不同的调色板而显示出错误的颜色。

通常是当前活动窗口或应用程序对当前调色板具有较高的控制优先级。

在窗口中显示的每一个图像的调色板都保存在内存中,称为逻辑调色板,显示系统当前使用的调色板称为硬件调色板或者系统调色板,在任一时刻,仅有一个系统调色板,由它决定了当前屏幕上实际的颜色显示。

1.6VisualC++简介

VisualC++(简称VisualC++、MSVC、VC++或VC)是微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。

VisualC++整合了便利的除错工具,特别是整合了微软视窗程式设计(WindowsAPI)、三维动画DirectXAPI,Microsoft.NET框架。

自从VisualC++诞生以来,凭借着C++语言的强大功能、良好的开发环境支持以及与Windows操作系统的血缘关系、一直是Windows操作系统环境下最主要的开发工具之一。

使用VisualC++可以完成各种各样的应用程序的开发,涵盖了底层软件到上层面向用户的软件,而且这些开发出的产品与Windows操作系统最具有亲和力。

如果说掌握了VC,那么就等于进入了Windows编程的自由王国[7]。

而本论文用到的正式VisualC++。

1.7MFC简介

MFC英文称“MicrosoftFoundationClasses”,即微软基础类库,它是以类的形式封装了Windows的API,并且包含了一个应用程序框架,以减少应用程序开发人员的工作量,所以用它能缩短开发程序的时间。

MFC中包含了大量Windows句柄封装的类以及很多Windows的内建控件和组件的封装类[8]。

MFC还提供一组通用的可重用的类库供开发人员使用,大部分类均从CObject直接或间接派生,只有少部分类例外。

MFC应用程序的总体结构通常由开发人员从MFC派生的几个类外加一个称为“CWinApp”类对象(应用程序对象)组成。

同时MFC提供了AppWizard(应用程序向导)自动生成框架。

MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎。

VC++是Windows下开发人员使用的专业C++SDK(英文为“StandardSoftWareDevelopKit”,即专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包。

所以可以这样说,MFC是WinAPI与C++的结合,是微软对API(英文为“ApplicationProgramInterface”,即应用程序接口)函数的专用C++封装。

我们知道Windows是一个提供应用程序接口编程的操作系统,它的出现确实方便了许多开发人员,而对于传统的win32开发(直接使用Windows的接口函数API)对开发人员来说非常的困难,因为API函数众多,并且名称很乱,记忆不是很方便。

自从MFC的出现,就很好的改变了这种局面。

MFC是面向对象程序设计,它将传统的API进行了分类封装,并且为你创建了程序的一般框架。

所以说MFC是微软封装了的API。

1.8图形设备接口简介

图形设备接口,即GDI(英文为“GraphicsDeviceInterface”),它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。

在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开图形设备接口,我们利用图形设备接口所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。

图形设备接口的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发组开发的工作。

图形设备接口(GDI)提供了一系列的函数和相关的结构,应用程序可以使用它们在显示器、打印机或其他设备上生成图形化的输出结果。

使用GDI函数可以绘制直线、曲线、闭合图形、路径、文本以及位图图像等等。

所绘制的图形的颜色和风格依赖于所创建的绘图对象,即画笔、笔刷和字体等。

应用程序通过创建设备环境(DC:

英文称“DeviceContext”,本论文对设备环境也有相应的介绍),可以直接向指定的设备进行输出。

设备环境是一个GDI管理的结构。

其中包含一些有关设备的信息,比如它的操作方式及当前的选择。

应用程序可使用设备环境函数来创建DC。

GDI将返回一个设备环境句柄,在随后的调用中,该句柄用于表示该设备。

例如,应用程序可以使用该句柄来获取有关该设备性能的一些信息,诸如它的类型(显示器、打印机或其他设备),它的显示界面的尺寸和分辨率等[9]。

1.9设备环境

设备环境(DC)是一个结构,它定义了一系列图形对象及其相关的属性,以及会影响输出结果的绘图方式。

这些图形对象包括:

画笔(用于画直线),画刷(用于绘图和填充),位图(用于屏幕的拷贝或滚动),调色板(用于定义可用的颜色集),剪裁区(用于剪裁和其他操作),路径(用于绘图和画图操作)。

设备环境函数用于对设备环境进行创建、删除或获取信息。

任何显示设备环境的Win32函数所返回的值都是主显示器的DC。

要想获取其它显示器的DC,可使用EnumDisplayMonitors函数。

系统对每个显示器调用回调函数,为该显示器传入一个DC值。

用户可以使用该DC在该显示器上绘图[10]。

1.10本论文的结构

本论文分为五章节,每章的组织和安排如下:

第一章中主要阐述了图形图像的相关概念以及程序的开发环境,分别详细的介绍了DIB文件结构、GDI(图形设备接口)、DC(设备上下文)、调色板等。

第二章中主要介绍了软件的具体实现过程以及软件的界面,同时还介绍了操作软件的方法。

第三章中主要介绍了简单的特效算法的详细设计过程,包括图片翻转(水平翻转,垂直翻转)、图片锐化、图片反色、图片灰度化。

第四章中主要介绍了复杂的特效算法的详细设计过程,包括扫描算法,栏栅算法、渐显算法、百叶窗算法、马赛克算法以及最终的冒泡算法。

第二章软件的具体实现

在本章中,主要介绍了Win32编程的特点,以及软件各个功能的实现,包括软件的启动画面功能、软件的菜单功能、软件的按钮功能等等。

同时本章也讲述了如何将任意一幅图像加载到程序的实现方法,以及介绍了软件的整体界面。

最后还介绍了软件的操作方法。

2.1Win32编程特点

有过Windows编程经验的开发人员都知道,Windows是一个“基于事件、消息驱动”的操作系统。

所以在Windows下执行一段完整的代码,只要操作人员进行了影响窗口的动作(例如点击鼠标按键、拖动窗口、改变窗口大小等)该动作就会触发一个相应的“事件”。

系统每次检测到一个事件时,就会给程序发送一个“消息”,从而使程序可以处理该事件。

每个Windows应用程序都是基于事件和消息的,而且包含一个主事件循环,它不停地、反复地检测是否有用户事件发生。

每次检测到一个用户事件,程序就对该事件做出响应,处理完再等待下一个事件的发生。

Windows下的应用程序不断地重复这一过程,直至用户终止程序,用代码来描述实际上也就是一个消息处理过程的while循环语句。

具体参照如图2.1。

图2.1样式Win32应用程序与消息机制

Win32应用程序与消息的联系可以参照图2.1,Windows操作系统为每一个正在运行的应用程序保持有一个消息队列(消息循环)。

当有事件发生后,Windows并不是将这个激发事件直接送给应用程序,而是先将其翻译成一个Windows消息,然后再把这个消息加入到这个应用程序的消息队列中去。

应用程序需要通过消息循环来接收这些消息,接收到的消息经过主程序的提取判断后调用相应的消息处理函数以完成对事件的处理。

消息队列是系统用来存放各种消息的地方,Windows操作系统有一个消息队列,各个应用程序也有自己的消息队列。

Windows系统把消息发送给窗口过程,窗口过程有4个参数:

窗口句柄、消息标识以及两个叫做消息参数的32位值。

窗口句柄决定消息发送到哪一个窗口,Windows系统则用它来确定向哪一个窗口过程发送消息。

消息标识是一个命名的常量,由它来标识消息的目的。

如果窗口过程接收到一条消息,它就通过消息标识来决定如何处理这条消息。

2.2图像特效显示所用的函数以及原理

前面已经提到,图像的特效显示主要是通过有规律的控制某个像素的显示时机,通过不同像素的显示时间差,在宏观上能实现特效显示,为了形成显示时间差,可以使用函数Sleep来完成。

即特效显示就是通过对一幅图像以像素为单位(有的是以字节为单位)进行控制使其在一定的时间序列上显示到设备(在这里基本是屏幕)上,最终完成整个图像的显示。

在MFC中CDC类可以创建设备上下文对象,CDC类提供了多种处理显示器或打印机等设备的方法。

它能进行绘图操作,设置改变对象的颜色,大小等属性,并且将绘制的图形输出到显示器或打印机等设备上。

CDC类我们可以理解成为一个画板,为GDI(图形设备接口)对象提供显示的空间。

图像的显示在本论文中主要通过CDC中StretchDIBits(程序中有时还用全局的StretchDIBits函数,引用全局函数的方法可以在此函数面前加上作用域运算符“:

”)等函数来完成(StretchDIBits函数在后文会有相应的介绍)。

对于有过GDI编程经验的人可能知道,BitBlt函数也能完成相应的操作,但为什么不用BitBlt函数呢?

这里需要注意的是,对于图像特效显示,并不是所以的贴图函数都适宜,BitBlt函数基本是显示整个一幅图像的,而StretchDIBits函数,可以显示图像的任意一部分,同时StretchDIBits函数也可以进行图像的缩放显示,因此相对BitBlt来说功能很强大。

而BitBlt相对来说就比较死板,基本对大多数的特效显示都行不通。

因此这就是使用StretchDIBits函数而不用BitBlt函数的原因了。

以下就是StretchDIBits函数的介绍(MSDN中可以查到):

函数功能:

该函数将DIB中矩形区域内像素使用的颜色数据拷贝到指定的目标矩形中。

如果目标矩形比源矩形大小要大,那么函数对颜色数据的行和列进行拉伸,以与目标矩形匹配。

如果目标矩形大小要比源矩形小,那么该函数通过使用指定的光栅操作对行列进行压缩[11]。

函数原型声明:

intStretchDIBits(HDChdc,intXDest,intYDest,intnDestWidth,intnDestHeight,intXSrc,intYsrc,intnSrcWidth,intnSrcHeight,CONSTVOID*lpBits,CONSTBITMAPINFO*lpB

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1