下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 基于VC图像处理的程序设计论文

基于VC图像处理的程序设计论文.doc

基于VC图像处理的程序设计论文

IT工作者
2012-02-22 0人阅读 举报 0 0 暂无简介

简介:本文档为《基于VC图像处理的程序设计论文doc》,可适用于IT/计算机领域

图像处理的程序设计图像处理的程序设计图像处理的程序设计目录摘要……………………………………………………………………………………Abstract………………………………………………………………………………开发环境VisualC简介………………………………………………为什么使用VC来做图像处理…………………………………………VC各类型文件简介………………………………………………………MFC类库……………………………………………………………………本章小结……………………………………………………………………BMP文件…………………………………………………………………图像处理中的色彩原理……………………………………………………图像文件格式………………………………………………………………BMP文件……………………………………………………………………BMP头信息……………………………………………………………BMP图像数据…………………………………………………………本章小结……………………………………………………………………图像处理DIB的编程……………………………………………………DDB…………………………………………………………………………DIB…………………………………………………………………………DIB的编程………………………………………………………………本章小结…………………………………………………………………编程实现图像复合……………………………………………………图像变换…………………………………………………………………平移…………………………………………………………………旋转…………………………………………………………………图像复合…………………………………………………………………用VC实现图像复合……………………………………………………编辑菜单资源………………………………………………………编辑对话框资源……………………………………………………程序运行界面………………………………………………………实现代码……………………………………………………………图像处理的综合效果………………………………………………程序中的注意点……………………………………………………本章小结…………………………………………………………………总结…………………………………………………………………………………参考文献……………………………………………………………………………英文翻译……………………………………………………………………………致谢…………………………………………………………………………………摘要毫无疑问图像处理已经成为计算机图形学的一个重要方面。图像处理的技术有了长足进步。一幅图像是以像素为基础的我们称之为位图。这篇文章重点讨论位图图像的处理。然后以两幅图像为例演示如何合成图像。第一部分我们对VC有个概括了解。因为图像处理的工程是由VC来实现的。第二部分介绍了位图的概念还讨论了其他的图像文件格式。第三部分是从DDB的定义开始的但是主要讨论的是DIB。我创建了几个DIB函数以方便今后程序的调用。第四部分完全讨论的是位图图像的处理比如旋转和平移。我们用数学形式来来对图像处理进行分析。然后通过透明度的设置来演示图像复合的效果。这一部分还包括用VC实现的代码。关键词:BMP图像复合透明度VC第一章开发环境VisualC简介为什么使用VC来做图像处理VC是最适合用来做图像处理工具了因为使用C语言能很方便的封装各种复杂的图像处理算法并以类的形式表达出来充分利用面向对象技术而且在VC中还可以很方便地使用WindowsGUI的API并利用内建OpenGLSDK以及DirectXSDK来充分支持动画设计当然也可以使用第三方的图形处理库来简化编程另外它支持远程调试这对于图像处理程序的调试时非常重要的。VC各类型文件简介·dsw文件这种类型的文件在VC中是级别最高的称为Workspace文件。在Workspace文件中可以包含多个Project由Workspace文件对它们进行统一的协调和管理。·dsp文件以dsp为扩展名的文件中存放的是一个特定的工程也就是特定的应用程序的有关信息每个工程都对应有一个dsp类型的文件。·clw文件以clw为扩展名的文件是用来存放应用程序中用到的类和资源的信息的这些信息是VC中的ClassWizard工具管理和使用类的信息来源。·readmetxt文件对应每个应用程序有一个readmetxt文件这个文件中列出了应用程序中用到的所有的文件的信息打开并查看其中的内容就可以对应用程序的文件结构有一个基本的认识。·h和cpp文件在应用程序中大量应用的是以h和cpp为扩展名的文件以h为扩展名的文件称为头文件。以cpp为扩展名的文件称为实现文件一般说来h为扩展名的文件与cpp为扩展名的文件是一一对应配合使用的在h为扩展名的文件中包含的主要是类的定义而在cpp为扩展名的文件中包含的主要是类成员函数的实现代码。·rc文件VC中以rc为扩展名的文件称为资源文件其中包含了应用程序中用到的所有的windows资源需注意的是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改。MFC类库Microsoft的基本类库MFC使得开发Windows应用程序比以往任何时候都要容易MFC的英文全称是MicrosoftFundationClassesMFC的本质就是一个包含了许多微软公司已经定义好的对象的类库虽然我们要编写的程序在功能上是千差万别的但从本质上来讲都可以化归为用户界面的设计对文件的操作多媒体的使用数据库的访问等等一些最主要的方面。这一点正是微软提供MFC类库最重要的原因在这个类库中包含了一百多个程序开发过程中最常用到的对象。在进行程序设计的时候如果类库中的某个对象能完成所需要的功能这时我们只要简单地调用已有对象的方法就可以了。我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象这时派生出来的对象除了具有类库中的对象的特性和功能之外还可以由我们自己根据需要加上所需的特性和方法产生一个更专门的功能更为强大的对象。当然也可以在程序中创建全新的对象并根据需要不断完善对象的功能。正是由于MFC编程方法充分利用了面向对象技术的优点它使得我们编程时极少需要关心对象方法的实现细节同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能这使得应用程序中程序员所需要编写的代码大为减少有力地保证了程序的良好的可调试性。需要指出的是MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试可靠性很高这就保证了使用MFC类库不会影响程序的可靠性和正确性。本章小结VisualC一直是Microsoft开发套件中最强大的可视化C语言开发工具本章对VC进行了一些粗略的描述以使我们有个初步了解。第二章BMP文件图像处理中的色彩原理计算机影像的色彩是经由位元(BIT)的计算和组合而来单纯的黑白图像是最简单的色彩结构在计算机上用到1位元的资料虽说只有黑色和白色但仍能透过疏密的矩阵排列将黑与白组合成近似视觉上的灰色调阶。灰阶(Grayscale)的影像共有个阶调看起来类似传统的黑白照片除黑、白二色之外尚有种深浅的灰色电脑必须以位元的资料显示这种阶调。全彩(Fullcolor)是指RGB三色光所能显示的所有颜色每一色光以位元表示各有种阶调三色光交互增减就能显示BIT的万色(**=,)这个数值就是计算机所能表示的最高色彩也就是通称的RGBTureColor。位元色是指具有种阶调或种色彩的影像而我们在常常见到GIF格式的图象文件就是带有种色彩的图象文件。若要把位元的全彩图片转成色的位元通常必须经过索引的步骤(Indexed)也就是在原本位元的万色中先建立颜色分布表(histogram)然后再找出最常用的种颜色定义出新的调色盘最后再以新色盘的色取代原图。让我们看看每一位元色包含多少种颜色:位种颜色位种颜色位种颜色位种颜色位种颜色位万种颜色位万种颜色和级灰度值位亿种颜色和级灰度值图像文件格式BMP格式这是Microsoft开发的位图文件格式为基于Intel处理器的计算机运行MSDOS、Windows、WindowsNT等操作系统所支持甚至有许多的应用程序也支持它。该格式支持位、位、位、位、位、位颜色。BMP格式也是Windows操作系统的画笔程序的固有格式Windows操作系统的许多图像文件如墙纸、图案、屏幕保护程序等的原始图像都是以BMP格式存在的。BMP格式的文件可以用RLE(RunLengthEncoding运行长度编码)的无损失压缩方案进行压缩。该格式是当今应用比较广泛的一种格式。最大的优点就是在PC上兼容度一流就算不装任何看图软件用windows的画笔一样可以看。且储存为bmp格式的图形不会失真。但缺点是该格式文件比较大所以只能应用在单机上不受网络欢迎。其他图像文件格式·GIF格式  该图形格式却在Internet上被广泛地应用原因主要是种颜色已经较能满足主页图形需要而且文件较小适合网络环境传输和使用。·JPEG格式  可以用不同的压缩比例对这种文件压缩其压缩技术十分先进对图像质量影响不大因此可以用最少的磁盘空间得到较好的图像质量。由于它优异的性能所以应用非常广泛而在Internet上它更是主流图形格式。·PCX格式  PCX格式是ZSOFT公司在开发图像处理软件Paintbrush时开发的一种格式存储格式从位到位它是经过压缩的格式占用磁盘空间较少。由于该格式出现的时间较长并且具有压缩及全彩色的能力所以PCX格式现在仍是十分流行。·PSD格式(Photoshop格式)  Adobe公司开发的图像处理软件Photoshop中自建的标准文件格式就是PSD格式在该软件所支持的各种格式中PSD格式存取速度比其它格式快很多功能也很强大。由于Photoshop软件越来越广泛地应用所以这个格式也逐步流行起来。PSD格式是Photoshop的专用格式里面可以存放图层、通道、遮罩等多种设计草稿。·TIFF格式  TIFF格式具有图形格式复杂、存储信息多的特点。DS、DSMAX中的大量贴图就是TIFF格式的。TIFF最大色深为bit可采用LZW无损压缩方案存储。·PNG格式  PNG(PortableNetworkGraphics)是一种新兴的网络图形格式结合了GIF和JPEG的优点具有存储形式丰富的特点。PNG最大色深为bit采用无损压缩方案存储。著名的Macromedia公司的Fireworks的默认格式就是PNG。·SVG格式(现在最火热的图像文件格式)SVG是ScalableVectorGraphics的首字母缩写含义是可缩放的矢量图形。它是一种开放标准的矢量图形语言可让你设计激动人心的、高分辨率的Web图形页面。该软件提供了制作复杂元素的工具如渐变、嵌入字体、透明效果、动画和滤镜效果并且可使用平常的字体命令插入到HTML编码中。SVG被开发的目的是为Web提供非栅格的图像标准。BMP文件BMP格式文件包含BMP头信息和BMP图像数据两部分。BMP头信息BMP头信息又分为文件头、信息头和调色板。文件头BITMAPFILEHEADER结构在Windowsh中定义:typedefstructtagBITMAPFILEHEADER{UNITbfTypeDWORDbfSizeUNITbfReservedUNITbfReservedDWORDbfOffbits}BITMAPFILEHEADERbfType是BMP文件的标志为固定值“BM”程序可以根据它的值来判断文件是否是一个BMP文件bfSize是文件大小以字节为单位程序可以根据bfSize的值和文件实际大小的比较来判断文件是否有损坏bfReserved和bfReserved是保留字未被使用其值为。bfOffbits是图像数据的偏移量即从文件头开始多少个字节后是图像数据的起始位置程序根据它来找到图像数据的位置。信息头BITMAPINFOHEADER的结构定义为:typedefstructtagBITMAPINFOHEADER{DWORDbiSizeLONGbiWidthLONGbiHeightWORDbiPlanesWORDbiBitCountDWORDbiCompressionDWORDbiSizeImageLONGbiXPelsPerMeterLONGbiYPelsPerMeterDWORDbiClrUsedDWORDbiClrImportant}BITMAPINFOHEADER其中各变量的含义为:biSize表示BITMAPINFOHEADER结构的大小常常为HbiWidth:位图图像的宽度biHeight:位图图像的高度biPlanes表示了最终观察位图图像的目标显示设备的位数它通常不起作用但确是Microsoft所需要的biBitCount定义了位图每像素颜色的位数它可为、、或在Windows中还支持位色增加一个透明度字节biCompression表示位图是否压缩它可取下列值:BIRGB:非压缩类型BIRLE:采用RLE方式压缩BIRLE:采用RLE方式压缩BIBITFIELDS:图像未压缩每个像素由三个分别表示红、绿、蓝色掩膜的DWORD型变量决定BIJPEG:图像是JPEG格式BIPNG:图像是PNG格式。biSizeImage为图像大小的字节数它可由文件头中的其他域计算出需注意的是每排像素必须在位或其倍数上结束如果一排像素到不了位边界上则用“”填充其余位biXPelsPerMeter:图像X方向的分辨率biYPelsPerMeter:图像Y方向的分辨率biClrUsed:图像所使用的颜色数如果不用置为表示所有的颜色都用到如果位图被压缩则必须置为biClrImportant:图像中重要的颜色数通常置为表示所有的颜色都重要BMP文件信息头基本上包含图像的所有重要的信息包括宽度、高度、每像素的位数。其中的biSizeImage可以根据别的信息算出来。最简单的办法就是由BITMAPFILEHEADER结构的bfSize即文件的大小减去bfOffbits即图像数据的起始地址。另外一种方法就是由图像的高度和宽度来计算图像数据的字节数。需注意的是并不是图像的高度乘以宽度乘以表示每像素的字节数就行了因为在BMP的文件格式中规定每行的字节数必须是的整数倍不是的整数倍的要补补齐到的整数倍。因此正确的算法是:biSizeImage=(biWidth*biBitCount)**biHeight其中biWidth*biBitCount是每一行图像占用的位数除以是每行图像占用的字节数。要为字节整数倍所以除以再乘以整数除法自动取整。加是为了取到大于等于图像实际字节数整数倍。调色板RGBQUAD的数据结构定义为:typedefstructtagRGBQUAD{BYTErgbBlue颜色的蓝色分量BYTErgbGreen颜色的绿色分量BYTErgbRed颜色的红色分量BYTErgbReserved保留为}RGBQUADRGBQUAD数据结构是BMP所包含的颜色表接在BITMAPINFOHEADER结构之后含有位图中用到的用到的每种颜色的RGB颜色在位图中有多少颜色就有多少RGBQUAD数据结构项如果biClrUsed的值大于“”则biClrUsed值就是RGBQUAD元素的数目。在RGBQUAD结构定义的颜色值中红色、绿色、蓝色的排列顺序恰好相反如果位图中每个像素点的颜色描述为“FF”则该点的颜色为蓝色。调色板只有在小于位色的图中才有如位色的BMP用一个八位数(~)来表示一个点的颜色值因此需要个调色板把这各值映射到个真彩色的值。因此相应的调色板数目可以由BITMAPINFOHEADER的biBitCount导出计算公式为:调色板数=(short)<<infheadbiCount和BMP有关的数据结构还有BITMAPINFO结构:typedefstructtagBITMAPINFO{BITMAPINFOHEADERbmiHeaderRGBQUADBmiColors}BITMAPINFOBITMAPINFO实际上是两个部分合成的一个结构它的调色板仅仅申请了一个单元此单元仅仅是占位因为颜色数是不固定的。BMP图像数据BMP文件中位图化的图像数据是以连续行的形式存储的并且是以相反的顺序存储即文件读出的第一行是图像的最后一行。图像数据是从左下角到右下角顺序排列的。这和我们通常习惯的xy坐标是一致的即x坐标向右y坐标向上。然而我们在用很多API函数处理BMP文件时并不需要关心像素的顺序只有在自己对图像的数据作处理的时候会用到。在位色的图像中三个字节按顺序分别为蓝、绿、红和一般采用的RGB即红绿蓝相反。本章小结由于图像在计算机中的广泛应用产生了各式各样的图像格式例如最常用的就是Windows下的位图文件BMP。本章就这种最常用的图像格式进行了介绍。并简单介绍了与之相关的色彩原理。第三章图像处理DIB的编程了解了BMP文件的格式后还需要了解在屏幕上显示位图需要什么样的数据结构。Windows中位图有两种格式:一种被称为“设备相关”位图(DeviceDependBitmap即DDB)另一种被称为“设备无关”位图(DeviceIndependBitmap即DIB)。我们主要讨论有关DIB的编程。DDBDDB位图格式是由BITMAP数据类型的结构加上图像数据构成。在Windowsh中BITMAP数据类型的结构定义如下:typedefstructtagBITMAP{intbmTypeintbmWidthintbmHeightintbmWidthBytesBYTEbmPlanesBYTEbmBitsPixelvoidFAR*bmBits}BITMAP其中各变量的含义为:bmType:位图类型应设为bmWidth:位图以像素为单位的宽度bmHeight:位图以像素为单位的高度bmWidthBytes:每行数据的字节数必为偶数bmPlanes:表示设备的色位面(colorplane)数bmBitsPixel:表示一个像素颜色所需要的位数bmBits:指向像素数据的指针。像素数据存放在bmBits指定的内存缓冲区这块内存可单独分配但通常就接在头部数据内存区的后面。DDB位图可以很好地将屏幕上的内容拷贝到内存中又可方便地将它粘贴到屏幕上的其他位置Windows对此类操作提供了广泛的支持。然而它却存在着很严重的问题DDB没有保存位图的调色板这就造成了一个使用的前提:位图必须在同类设备中显示并且此设备在位平面或彩色上与原设备有同样的色彩安排否则色彩可能完全失真。DIBDIB位图格式由三部分构成即BITMAPINFOHEADER(文件信息头)、RGBQUAD(调色板入口)和BITMAPDATA(图像数据)构成。它的结构和BMP文件结构相似它实际就是BMP文件去掉BITMAPFILEHEADER(文件头)也即一个BITMAPINFO结构后面接上调色板再加上图像数据。因此把BMP读入到DIB数据结构中再显示是十分方便的。只要读入BITMAPINFO结构和图像数据就可以了。DIB的编程DIB(IndependentBitmap)API函数库中的有些重要函数在以后的程序设计中经常用到现列举如下:FindDIBBits()参数:LPSTRlpbi指向DIB对象的指针返回值:LPSTR指向DIB图像象素起始位置说明:该函数计算DIB中图像象素的起始位置并返回指向它的指针。DIBWidth()参数:LPSTRlpbi指向DIB对象的指针返回值:DWORDDIB中图像的宽度说明:该函数返回DIB中图像的宽度。对于WindowsDIB返回BITMAPINFOHEADER中的biWidth值对于其它返回BITMAPCOREHEADER中的bcWidth值。DIBHeight()参数:LPSTRlpDIB指向DIB对象的指针返回值:DWORDDIB中图像的高度说明:该函数返回DIB中图像的高度。对于WindowsDIB返回BITMAPINFOHEADER中的biHeight值对于其它返回BITMAPCOREHEADER中的bcHeight值。DIBNumColors()参数:LPSTRlpbi指向DIB对象的指针返回值:WORD返回调色板中颜色的种数说明:该函数返回DIB中调色板的颜色的种数。对于单色位图返回对于色位图返回对于色位图返回对于真彩色位图(位)没有调色板返回。对于Windows的DIB,实际颜色的数目可以比象素的位数要少。对于这种情况则返回一个近似的数值。#defineWIDTHBYTES(bits)(((bits))*)本章小结在Windows的编程中彩色图像的显示和处理是一个重要的课题。位图既可以以资源的形式与程序绑在一起也可以以文件的形式从外部装入。联系位图时可以使用API函数。本章就此进行讨论。编程实现图像复合图像变换为了图像复合时变幻出各种效果有时需要图像变换中的平移、旋转等操作来实现。这里讨论的图像变换可以看作图像不动而坐标系变动变动后该图像在新的坐标系下具有新的坐标值。通常以点变换作为基础把图像的一系列像素作几何变换后显示新的像素即可产生新的图像。平移·原理在下图中平移前的坐标为(x,y)变换后为(x,y)。tx是水平方向移动的距离ty是垂直方向移动的距离。由图可知:x=xtxy=yty用二维变换矩阵来描述(x,y)和(x,y)之间的关系:xtxxy=tyy反变换可由矩阵的逆来求如下所示:xtxxy=tyy在这里图像中每一个变换后的点都能在原图像中找到相应的点。但是这些变换后的点有可能超出原图像的范围。在程序的实现中将这些点丢弃并在原图像的移出位置让它以白色显示。·编程实现在GraphicsczView类里添加一个成员函数InteMove()来实现这一图像变换功能。但是该函数仅局限于处理BMP图像。具体实现如下:BOOLCGraphicsczView::InteMove(LPSTRlpDIBBits,LONGlWidth,LONGlHeight,LONGlXOffset,LONGlYOffset,WORDcount){指向原图象的指针LPSTRlpSrcLPSTRlpDstLPSTRlpNewDIBBitsHLOCALhNewDIBBits循环变量LONGiLONGjLONGkLONGiLONGjintsif(count==)s=elseif(count==)s=elseif(count==)s=elses=图象每行的字节数LONGlLineBytesif(s==||s==){lLineBytes=WIDTHBYTES(lWidth**s)}else{lLineBytes=WIDTHBYTES(lWidth*s)}inttagintlWidthif(count==){tag=lWidth=lWidth}else{tag=lWidth=lLineBytes}hNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight)if(hNewDIBBits==){returnFALSE}lpNewDIBBits=(char*)LocalLock(hNewDIBBits)for(i=i<lHeighti){for(j=j<lWidthj){lpDst=(char*)lpNewDIBBitslLineBytes*ij*tagi=ilYOffsetj=jlXOffsetif((j>=)(j<lWidth)(i>=)(i<lHeight)){lpSrc=(char*)lpDIBBitslLineBytes*ij*tagfor(k=k<tagk){*(lpDstk)=*(lpSrck)}}else{for(k=k<tagk)*((unsignedchar*)lpDstk)=}}}memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight)LocalUnlock(hNewDIBBits)LocalFree(hNewDIBBits)returntrue}·效果图我们用一幅BMP图像的平移来演示图像平移前后的情形。图平移前的图像图平移后的图像旋转·原理我们这里讨论的旋转是以图像的中心为旋转点进行旋转的。旋转后图像的大小并未发生改变但是显示区域却有可能改变。有两种显示方法一种是增大图像的显示区域使旋转后的图像能完全显示出来如图另一种方法是按原图像的区域显示将区域之外的图像截掉。原图像旋转后露出的空白区域以白色填充如图。图原图像图完全显示图截图显示下面讨论旋转的算法:如下图所示点(x,y)旋转θ角后到达点(x,y)。由图可知:x=xcos(θ)ysin(θ)y=xsin(θ)ycos(θ)用二维变换矩阵来描述(x,y)和(x,y)之间的关系:反变换可由矩阵的逆来求如下所示:上面讨论的是以原点为中心进行的旋转。如要按坐标系中的某一点进行旋转。则需将平移变换与旋转变换结合起来考虑实行复合变换。假设以坐标系中的(a,b)为中心进行旋转某点旋转前为(x,y)旋转后为(x,y)旋转后旋转中心变为(c,d)则二维变换矩阵为:EMBEDPBrush反变换可由矩阵的逆来求如下所示:可得:x=xcos(θ)ysin(θ)ccos(θ)dsin(θ)ay=xsin(θ)ycos(θ)csin(θ)dcos(θ)b在以图像为中心进行旋转且不扩大显示区域的实现中a、b、c、d分别为:EMBEDPBrushEMBEDPBrushEMBEDPBrushEMBEDPBrush。·编程实现在GraphicsczView类里添加一个成员函数InteRotate()来实现这一图像变换功能。但是该函数仅局限于处理BMP图像。具体实现如下:BOOLCGraphicsczView::InteRotate(LPSTRlpDIBBits,LONGlWidth,LONGlHeight,intangle,WORDcount){指向原图象的指针LPSTRlpSrcLPSTRlpDstLPSTRlpNewDIBBitsHLOCALhNewDIBBits循环变量LONGiLONGjLONGkLONGiLONGjLONGlLineBytesfloatRotateAnglefloatsinafloatcosaintsif(count==)s=elseif(count==)s=elseif(count==)s=elses=图象每行的字节数if(s==||s==){lLineBytes=WIDTHBYTES(lWidth**s)}else{lLineBytes=WIDTHBYTES(lWidth*s)}inttagintlWidthif(count==){tag=lWidth=lWidth}else{tag=lWidth=lLineBytes}RotateAngle=(float)(angle*)sina=(float)sin((double)RotateAngle)cosa=(float)cos((double)RotateAngle)hNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight)if(hNewDIBBits==){returnFALSE}lpNewDIBBits=(char*)LocalLock(hNewDIBBits)for(i=i<lHeighti){for(j=j<lWidthj){lpDst=(char*)lpNewDIBBitslLineBytes*ij*tagi=(LONG)(i*cosaj*sina(lHeight)*cosa*(lWidth)*sina*(lHeight)*)j=(LONG)(i*sinaj*cosa(lHeight)*sina*(lWidth)*cosa*(lWidth)*)if((j>=)(j<lWidth)(i>=)(i<lHeight)){lpSrc=(char*)lpDIBBitslLineBytes*ij*tagfor(k=k<tagk){*(lpDstk)=*(lpSrck)}}else{for(k=k<tagk)*((unsignedchar*)lpDstk)=}}}memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight)LocalUnlock(hNewDIBBits)LocalFree(hNewDIBBits)returntrue}·效果图我们用一幅BMP图像的旋转来演示图像旋转前后的情形。图旋转前的图像图旋转后的图像图像复合当物体是透明的时候如玻璃或透明塑料它不但会反射光而且会透射光。所以我们可以透过这种材料可以看到后面的东西。图像复合就是采用这种原理将前景图象作为透明材料覆盖在背景图像上。复合后的图像尺寸以背景图像为准两图像重叠部分显示出透明效果其他部分仍为背景图像超出背景图像的部分则被截掉。设复合图象的像素的颜色值为C背景图象的像素的颜色值为C前景图象的像素的颜色值为C透明度为K(≤K≤)。并且以图为背景图像以图为前景图像各种效果的实现如下:图背景图像图前景图像.Normal实现:C=C*KC*(K)效果:在Normal(普通)合成模式下合成图像的显示与不透明度的设置有关。当透明度为也就是完全不透明时着色的像素将完全由所用的前景色代替如图当透明度为也就是完全透明时着色的像素将完全由所用的背景色代替。当透明度介于两者之间时显示的程度取决于透明度的设置前景色与背景色互相渗透。我们看一下透明度为时得到的效果如图:图Normal模式Behind实现:C=C*KC效果:通过对背景图像的透明度设置与前景图像复合。也就是在前景图像的背后着色从而显示出变换效果。当透明度为也就是完全不透明时着色的像素将完全由所用的前景色代替如图当透明度大于背景图像的像素逐渐溶入到前景图像两者相混合从而使前景图像背后的像素颜色显示出来。当达到时背景图像完全显现。我们看一下透明度分别为和时得到的效果如图及图:图透明度图透明度Screen实现:如C≠则C=C*KC*(K)否则C=。效果:如果前景图象的像素的颜色值不为满值则复合图像为两者的加权和否则其像素值为满值。这种模式与运用遮光工具的效果相似。其效果可以通过透明度来控制。当透明度为也就是完全不透明时着色的像素将完全由所用的前景色代替如图图透明度图透明度图和演示了透明度分别为和时的情况。可以看到背景图像的有些颜色被屏蔽掉了从而幻化出一种特殊效果形成一种别致的镂空花纹。Add实现:如K=则C=C否则C=C*C。效果:该图像能把图像上的背景颜色与前景颜色结合起来产生比两种颜色都深的第三种颜色形成一种光线穿透图像的幻灯片效果。它采用了将背景色与前景色的数值相乘然后再除以便得到了叠加后图像的颜色值。例如红色与黄色的叠加色是橙色红色与绿色的叠加色是褐色红色与蓝色的叠加色是紫色等。当透明度为也就是完全不透明时着色的像素将完全由所用的前景色代替如图当透明度大于如图所示:图Add模式Subtract实现:如K=则C=C否则C=(CC)*K。效果:复合图像为两者的像素值的差产生一种反相效果有点象照片的曝光。当透明度为也就是完全不透明时着色的像素将完全由所用的前景色代替如图我们再看一下透明度分别为和时得到的效果如图及图:图透明度为图透明度为用VC实现图像复合工程名称:Graphicscz功能:将两幅BMP图像复合形成不同的艺术效果。编辑菜单资源双击ResourceView面板中的Menu项展开菜单资源选择IDRMAINFRAME在右边的编辑区中打开菜单资源添加“图像复合”菜单项其中包括如下菜单命令:IDCaptionIDCOPENBCKGROUND打开背景IDCOPENFOREROUND打开前景IDCDISPLAYBACK显示背景IDCDISPLAYFORE显示前景IDCOVERLAP复合编辑对话框资源在ResourceView面板中右击“Dialog”资源。在打开的快捷菜单中选择“InsertDialog”命令新建一个对话框资源。将新建对话框资源ID改为“IDDDIALOGOVERLAP”然后在对话框中添加如下资源:复合类型选择:类型IDCaptionGroupboxIDCSTATIC复合类型选择RadiobuttonIDCRADIONORMAL(将Group勾上)NormalRadiobuttonIDCRADIOBEHINDBehindRadiobuttonIDCRADIOSCREENScreenRadiobuttonIDCRADIOADDAddRadiobuttonIDCRADIOSUBTRACTSubtractStatictextIDCSTATIC不透明度:EditBoxIDCEDITOPACITYStatictextIDCSTATIC前景图像设置:类型IDCaptionGroupboxIDCSTATIC前景图像设置StatictextIDCSTATIC是否需平移StatictextIDCSTATICX轴:EditBoxIDCEDITXOFFSETStatictextIDCSTATICY轴:EditBoxIDCEDITYOFFSETStatictextIDCSTATIC是否需旋转StatictextIDCSTATIC旋转角度:EditBoxIDCEDITROTATE启动类向导(ClassWizard),创建CDlgOverlap类关联IDDDIALOGOVERLAP资源在“MFCClassWizard”窗口中选择“MemberVariable”属性页为IDCRADIONORMAL和IDCEDITOPACITY增加成员变量mOpacity和m​type类型均为int。程序运行界面主界面编译工程文件Graphicsczdsp你可以看到如图所示的界面。图主界面图像复合当选择完背景图像和前景图像点击菜单中的“复合”可得如图所示的界面:图图像复合对话框实现代码修改Doc文件·为CGraphicsczDoc类增加处理函数Attributespublic:HDIBGetHDIB()const{returnmhDIB}CPalette*GetDocPalette()const{returnmpalDIB}CSizeGetDocSize()const{returnmsizeDoc}Operationspublic:HDIBmhDIBHDIBmhDIBHDIBmhDIBHDIBmhDIBnCPalette*mpalDIBCSizemsizeDoc·对GraphicsczDoccpp的修改CGraphicsczDoc::CGraphicsczDoc(){TODO:addonetimeconstructioncodeheremhDIB=mpalDIB=msizeDoc=CSize(,)}CGraphicsczDoc::~CGraphicsczDoc(){if(mhDIB!=)::GlobalFree((HGLOBAL)mhDIB)if(mpalDIB!=)deletempalDIB}为菜单资源增加处理函数①在“ClassWizard”对话框中选择“CGraphicsczDoc”类分别为IDCOPENBCKGROUND、IDCOPENFOREROUND、增加COMMAND事件处理函数。·OnOpenBackground函数选择“图像复合”菜单的“打开背景”选项时触发该函数。用于打开背景图像。voidCGraphicsczDoc::OnOpenBackground(){TODO:AddyourcommandhandlercodehereCStringstrPathname获取文件名CFileDialogdlg(TRUE,"bmp","*bmp")dlgDoModal()strPathname=dlgGetPathName()打开DIB文件CFilefileCFileExceptionfeif(!fileOpen(strPathname,CFile::modeRead|CFile::shareDenyWrite,fe)){CStringllll="打开出错!"MessageBox(,ll,,MBOK)}mhDIB=mhDIBn=::ReadDIBFile(file)至此打开DIB文件}·OnOpenForeground函数选择“图像复合”菜单的“打开前景”选项时触发该函数。用于打开前景图像。voidCGraphicsczDoc::OnOpenForeground(){……mhDIB=::ReadDIBFile(file)}与OnOpenBackground函数基本相似只需将文件句柄改成上述语句。②OnDraw函数当窗口需要重绘时调用该函数。实现如下:voidCGraphicsczView::OnDraw(CDC*pDC){CGraphicsczDoc*pDoc=GetDocument()ASSERTVALID(pDoc)TODO:adddrawcodefornativedatahereBeginWaitCursor()获取DIBHDIBhDIB=pDoc>GetHDIB()判断DIB是否为空if(hDIB!=){LPSTRlpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB)获取DIB宽度intcxDIB=(int)::DIBWidth(lpDIB

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/54

基于VC图像处理的程序设计论文

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利