收藏 分销(赏)

分形理论在计算机图形学中的应用.doc

上传人:二*** 文档编号:4745679 上传时间:2024-10-11 格式:DOC 页数:49 大小:1.74MB
下载 相关 举报
分形理论在计算机图形学中的应用.doc_第1页
第1页 / 共49页
本文档共49页,全文阅读请下载到手机保存,查看更方便
资源描述
分形理论在计算机图形学中的应用【完整版】 (文档可以直接使用,也可根据实际需要修订后使用,可编辑放心下载) 学院理学学士学位论文 分形理论在计算机图形学中的应用 ----位图与矢量图形变换 目录 目录 I 摘要 II ABSTRACT III 第一章 分形概论 1 1.1 什么是分形 1 1.2 分形的应用 1 1.3本文选题的背景 2 第二章 分形相关理论问题 3 2.1 Julia集 3 2.2 逃逸时间算法的根本思想 4 2.3 逃逸时间算法绘制Julia集与Mandelbrot集 4 2.4 分形图形着色方案 6 2.5 Julia集与Mandelbrot集图形的矢量变换 7 2.6 二维元胞自动机生成分形图案 10 2.7 Gumowski-Mira公式 11 2.8 分形图形的位图操作 11 第三章 毕业设计结果和分析 23 3.1 程序概况 23 3.2程序说明 27 3.3 补充说明 31 参考文献 32 致 谢 33 APPENDIX 34 附录 40 摘要 分形是一门几何学科,它研究的是欧氏空间的一类子集,但很难对它下一个确切的定义。可以简单地说,如果一个对象的局部与整体具有自仿射变换关系,我们就可以称它为分形。自分形之父曼德勃罗〔Benoit Mandelbrot〕在1975年出版专著?分形对象:形、机遇与维数?,标志着分形理论正式诞生以来。分形已经广泛应用于物理、化学、生物、医学、计算机科学等诸多领域,而本文着眼于分形理论与计算机知识的结合。 因为分形图形有极强的艺术性,绘制得当,可以产生非常漂亮的图片,因此可以用于装饰,包装,服装等需要艺术图案的场所。本文重点介绍了分形图形的重要生成算法——逃逸时间算法,并且详细说明了使用逃逸时间算法生成Julia集与Mandelbrot集的算法过程。另外,本文也详细说明了分形图形的一种着色方案,它可以使分形图形的着色过程更富有过渡性,从而使图形具有更强的美感。本文还详细说明了分形图形在计算机图形学相关理论上的应用,比方分形图形的矢量移动,旋转,缩放,以及对分形图形进行相关特殊变换,此外,还可修改图形的参数,修改图形的颜色等等。本文还涉及了元胞机自动图案的生成以及Gumowski-Mira分形,生成了经典的三翅鹰图形,并且实现了对其色彩的编辑功能。 因为分形图形展示的是数学与艺术的成果,它日益受到人们的重视,甚至引发了分形是不是艺术的讨论,随着时间的流逝,分形是一种艺术已经为人们所成认,分形与计算机的结合也越来越紧密,计算机图形学中已经专门引入了分形算法,以生成自然景观等。另外,分形在其它学科的应用也日益广泛,可见,分形在今后会得到更大的开展,有更广阔的应用空间。 关键词:分形,矢量变换,Julia集,Mandelbrot集,逃逸时间算法 ABSTRACT Fractal is a geometrical subject. It studies a subset of Euclidean geometry and can't be defined exactly. Say in a simple way, if one part of an object is affine with another part of this, we can say this object is a fractal. From 1975 Benoit Mandelbrot published his works Fractal: Form, Chance and Dimension, the theory of fractal is wildly used in physics, chemistry, biology, medicine, computer science etc. And this topic dedicate for the use of fractal theory in computer. Because the beauty of the fractal picture, if drawing in a good way, you can get a perfect picture, so the picture can be used for dress, porcelain, and so on. This topic point of the escaping time algorithm is the main way of drawing the fractal picture, but also show a new way to render the fractal picture in detail, it can give the picture more smoothly color change, thereby it give the picture more aesthetic feeling. Further, this topic explain the use of computer graphics theory in the fractal picture's creating, for example the vector move, circumvolve, zoom in, zoom out, and other vector transformation. In addition, picture parametric can be changed and picture colour can also be changed .this topic involved the Gumowski-Mira fractal, two dimension Cellular Automata fractal. Fractal unfurl an new world buildup with math and arts, Along with time flying, people think over fractal more and more, even brought an argument that fractal drawing is or not an art. All think fractal picture is an art production today, and also, fractal is used more and more in computer science. The computer graphics even add a new fractal algorithm to create nature sight. Aside, fractal theory used wider and wider in other subjects. We can say, fractal theory will use wider and deeper. Key Words: Fractal, Julia set, Mandelbrot set, Vector transformation, Escaping time algorithm 第一章 分形概论 1.1 什么是分形 什么是分形呢?很难给分形下一个确切的定义。严格地而且正式地去定义分形是一件非常复杂而且困难的事情。但是,有一些不太正规的定义却可以帮助我们理解分形的含义。在这些定义中,最为流行的一个定义是:分形是一种具有自相似特性的现象、图像或者物理过程。也就是说,在分形中,每一组成局部都在特征上和整体相似,只仅仅是变小了一些而已。分形在英文中为fractal,是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的。这个词意为不规那么的,破碎的,分数的。曼德勃罗想用此词来描述自然界中传统欧氏几何不能描述的一大类复杂不规那么的几何对象,例如,曲折的海岸线,起伏的山脉,变幻的浮云,纵横的血管等,它们有一个共同的特点就是极不规那么或极不光滑,直观而粗略地说,这些对象都是分形。分形作为几何对象,是破碎的,不规那么的,但不是所有破碎的,不规那么的形状都是分形,分形一般还具有自相似性,一个对象的局部与整体有自仿射变换关系,我们也可以称之为分形。 1.2 分形的应用 分形几何学已在自然界与物理学中得到了应用。如在显微镜下观察落入溶液中的一粒花粉,会看见它不间断地作无规那么运动〔布朗运动〕,这是花粉在大量液体分子的无规那么碰撞下表现的平均行为。布朗粒子的轨迹,由各种尺寸的折线连成。只要有足够的分辨率,就可以发现原以为是直线段的局部,其实由大量更小尺度的折线连成。这是一种处处连续,但又处处无导数的曲线。这种布朗粒子轨迹的分维是2,大大高于它的拓扑维数1。 在某些电化学反响中,电极附近成绩的固态物质,以不规那么的树枝形状向外增长。受到污染的一些流水中,粘在藻类植物上的颗粒和胶状物,不断因新的沉积而生长,成为带有许多须须毛毛的枝条状,就可以用分维。 自然界中更大的尺度上也存在分形对象。一枝粗干可以分出不规那么的枝杈,每个枝杈继续分为细杈……,至少有十几次分支的层次,可以用分形几何学去测量。当然,还有海岸线的长度到底是多少这个问题也用到分形。 有人研究了某些云彩边界的几何性质,发现存在从 1公里到1000公里的无标度区。小于 1公里的云朵,更受地形概貌影响,大于1000公里时,地球曲率开始起作用。大小两端都受到一定特征尺度的限制,中间有三个数量级的无标度区。分形存在于这中间区域。 近几年在流体力学不稳定性、光学双稳定器件、化学震荡反映等试验中,都实际测得了混沌吸引子,并从实验数据中计算出它们的分维。学会从实验数据测算分维是最近的一大进展。分形几何学在物理学、生物学上的应用也正在成为有充实内容的研究领域。 1.3本文选题的背景 分形几何,这门新的数学分支一创立,就日益受到各国学者的重视,在过去的十几年里,分形科学已有了很大的开展。她在纯数学、物理学、材料科学、地质勘探、疾病诊断、股价预测以及计算机和信息科学等许多领域中,都得到了广泛的应用。并且由于分形几何方法的引入,使一些原已死寂的老学科方向焕发了新的生机,也使一些正蓬勃开展的新学科获得了巨大的推动力。分形几何与计算机科学的结合就是一个明显的例证。一方面,分形理论推动了计算机绘图方法的迅速开展,使计算机在信息压缩及模仿自然现象中的各种奇妙图形发挥了重要的作用;另一方面,计算机的应用也大大地推动了分形理论的开展,并且由于模拟分形图成功而展现出优美的分形图像,迅速提高了分形这门新兴科学的声望,扩大了她的影响。目前用计算机绘制分形图是如此流行,以致不仅使绘制分形的算法理论与程序设计已成为一个独立的研究方向,同时绘制的分形图也已成了一种相当时髦的艺术形式。并且分形图形已经开始应用在包装,服装,陶瓷装饰上面。分形理论已经极广泛地应用在计算机图形学中,许多的计算机游戏与虚拟现实中大量应用到分形理论。 第二章 分形相关理论问题 2.1 Julia集 Julia集是分形中的一个经典集合,它的根本函数形式为:,其中Z与C都为复数。先考虑C=0的情况,Z是复数,即Z=x+yi,那么有: 我们还可以定义复数z=x+yi的绝对值,即:,而|Z|恰好相反是从原点到Z的距离。 下面讨论的一些性质,假设此方程以点,且开始迭代,那么有: 因此,在区域中,,这意味着对的每一个一次迭代,即,都会使z向靠0的方向移动,可以说此时z向0收敛。 当时,通过上面的计算,可以得知,此时z会趋向于。 当时,很显然,z是平面单位圆上的点。 于是,我们发现,复平面上可分为两个区域,一个区域合落在其中的点向0收敛,而另一个区域合落在其中的点向逃逸,它们的分界线便是。 然而,当时,它向一个区域收敛,而不是向一个点收敛,被吸进去的点会遍历整个区间,我们称这个区间为混沌区。与此同时,分割混沌区和向逃逸的分界线不再是的单位圆,它将是一个不规那么、不光滑的分界线。 Julia集图形:见图。 2.2 逃逸时间算法的根本思想 根据上述想法,我们将吸引域的概念进一步扩展。如图2.2所示,假设有一个充分大的整数N,当未逃逸区域M中的初始点a经过小于N次迭代就到达未逃逸区域M的边界,甚至超出了边界,我们就认为点a逃逸出去了;而如果经过N次迭代后,a的轨迹仍未到达M的边界,我们就认为a是A上的点,用这样的方法描绘出A的边界图形,这就是逃逸时间算法的根本思想。逃逸区M’ 收敛区域A 未逃逸区M 逃逸边界 图 2.3 逃逸时间算法绘制Julia集与Mandelbrot集 1, 从逃逸时间算法的角度来看,Julia集的内部收敛于某一个点或者几个点,而Julia集的外部随着逃逸时间t的增加将发散至,其逃逸边界就是Julia集。Julia集的逃逸时间算法如下: 假设绘图窗口的宽度为width,高度为height。 选定参数,,,M=100,maxTime=200,令: 其中C表示复数上一个点,,,,表示参数窗口大小,M表示逃逸边界值,maxTime表示循环可以执行的最大次数。对所有的点,完成如下步骤的循环: 令,,t=0。 根据以下的迭代过程从算出,计数t=t+1。 计算: 如果,那么转到步骤。 如果,且,那么转至步骤。 如果,转到步骤。 对点着色,并转至下一步,再头从做步骤。着色方案将在下面作详细介绍。 Julia集图形:见图。 2, 绘制Mandelbrot集:设Z=x+yi,C=p+qi,C的取值范围为: 假设绘图窗口的宽度为width,高度为height。,逃逸半径M=100,maxTime=200,对绘图窗口中所有的点,,完成如下步骤。 令 利用下式从得到,计数k=k+1 计算: 如果,那么转到步骤。 如果,且,那么转至步骤。 如果,转到步骤。 对点着色,转至下一点,步骤。 读完所有参数空间的点〔p,q〕,结束循环。 Mandelbrot集图形:见图。 2.4 分形图形着色方案 RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。目前的显示器大都是采用了RGB颜色标准,目前的电脑一般都能显示32位颜色,约有一百万种以上的颜色。在数字视频中,对 RGB 三基色各进行 8 位编码就构成了大约16.7万种颜色,这就是我们常说的真彩色。我们对分形图形进行着色也使用这种色彩模型。 颜色设置:我们根据逃逸时间算法的循环次数来给分形图着色,假定k为循环次数,也就是上面所说的逃逸时间,time为颜色锐化值,m_nRed,m_nGreen,m_nBlue为R,G,B的初始值,有如下结果: k *= time; red = k + m_nGreen; green = k +m_nBlue; blue = k + m_nRed; 下面对求得的red,green,blue三个值进行变换。因为程序绘图时使用24位真彩色,所以R,G,B三个值的大小都不应该超过8位的最大值,即255,而这个8位的最大值,用16进制表示就是0xFF。如果R,G,B中的任何一个值大于0xFF,就对其进行^0xFF的位运算。然后再将根据上述步骤求得的R、G、B,用函数RGB(R,G,B)换成色彩,从而实现对Julia集的着色。用计算机语言来表示就是这样: if ((red & 0x1FF) > 0xFF) red = red ^ 0x1FF; if ((green & 0x1FF) > 0xFF) green = green ^ 0x1FF; if ((blue & 0x1FF) > 0xFF) blue = blue ^ 0x1FF; 上面的red,green,blue分别表示RGB颜色模型中的R,G,B。red,green,blue与0x1FF进行&运算表示取这三个值的最低九个位,&运算在这里表示按位与运算符,它对运算符两边的数字的每一个位进行计算,如果两个位都为1的话,那么运算结果就为1,否那么为0。^运算在这里表示按位异或运算符,它对运算符两边的数字的每一个位进行计算,如果两个位不同的话,那么运算结果就为1,否那么为0。这个算法主要是为了平滑分形图形的色彩变化,让图形看起来更有美感。 2.5 Julia集与Mandelbrot集图形的矢量变换 1, Julia集与Mandelbrot集的矢量移动:在逃逸时间算法中,一共有两个窗口,一个是绘图窗口,一个是参数窗口,其中绘图窗口的大小与位置相对来说是固定的,因为它对应的是窗口的分辨率。实际上,Mandelbrot集是将参数C走遍参数窗口的所有值,经过逃逸时间算法的运算最终在绘图窗口中画出图来,那么参数窗口的大小和位置就决定了所绘Mandelbrot集的放大区域。如果要对窗口中的图形进行移动,我们可以选择使用移动参数窗口的方法来实现。只要将鼠标移动的位置大小转换成参数窗口移动的位置大小就可以了。令,,xMin,yMin,xMax,yMax代表参数窗口值,oldPoint表示鼠标移动前的位置,newPoint表示鼠标移动后的位置。那么就可以得到如下式子: 经过实验证明,这个方法对Julia集与Mandelbrot集都适用。 图形矢量移动前后效果比照参见图与图3.1.8。 2, Julia集与Mandelbrot集的矢量放大:先说明对Mandelbrot集的放大,Mandelbrot集是将参数C走遍参数窗口的所有值,经过逃逸时间算法的运算最终在绘图窗口中画出图来,由此可知,参数窗口的大小和位置就决定了所绘Mandelbrot集的放大区域。,,,,其中,,可以得出: 从而可得: 用计算机语言来描述就是: 这样我们只要将得到的(xMin,yMin),(xMax,yMax)代替原来的参数窗口值就可以实现对窗口的放大了。 Julia集的放大原理与Mandelbrot集的放大原理相同,就不再赘述了。 图形的矢量放大前后效果比照见图与图3.1.9。 3, Julia集的旋转: 由计算机图形学可知,在二维平面上按指定位置旋转,需要经过三个步骤: 1、平移对象使移动点位置移到坐标原点。 2、绕坐标原点旋转。 3、平移对象使基准点回到其原始位置。将其写成矩阵形式如下: 转换成式子如下: 将这个式子应用到Julia集绘制算法中,这里假定绕屏幕的中点旋转,屏幕的宽度为width,高度为height,用坐标表示为(width/2,height/2),从前面绘制Julia集的方法中可知以下两个步骤: ,。 根据以下的迭代过程从算出,计数t=t+1。 这里只需要修改的值,所以可得: 再将获得的,进行,的运算,得到新的。再将进行下一步运算即可实现对Julia集的旋转。图形的矢量旋转前后效果比照见图与图3.1.12。 4, 将Julia集压缩到Mandelbrot集的收敛区域,要将Julia集压缩到Mandelbrot集收敛区域中,需要先对前面绘制Julia集算法中提到的进行Mandelbrot集算法变换,然后再进行Julia集算法变换。又因为逃逸时间算法绘制Julia集和绘制Mandelbrot集的步骤都是一样的,差异只表达在步骤,即由计算出这一步。即要在前面提到的绘制Julia集的计算机算法步骤后面添加以下几步算法: 令t1=-0.7,t2=,i=0,t3=t4=0,N=10进行如下循环。 计数i=i+1。 如果i<N,返回步骤,否那么。 返回值,回到算法步骤继续进行运算。 算法的效果图参见图。 2.6 二维元胞自动机生成分形图案 元胞分布在二维欧氏几何平面上规那么划分的网格点上,那么称它为二维元胞自动机。为了使用二维元胞自动机绘图,假定有一个的网络,其左上角的格子为〔0,0〕,右下角的格子为〔a-1,a-1〕,这样主要是为了对应计算机的屏幕坐标。且每个格子的初始状态均为0,即F(x,y)=0,设,将此网格的中心局部点为中心,将以外的点分成假设干层次,紧靠的8个点为第一层,紧靠第一层外面的16点为第二层,紧靠第二层外面的24个点为第三层,以此类推,一直到最外面一层。 此网格共有a/2层,设k为层数,从k=1到k=a/2,进行如下循环: 设第k层中任意点为,那么判断其临近8点的现有状态;如果 那么 否那么 当每一层中所有点判断完结后,进行下一步。 对的点着色。 k=k+1,返回到步骤,直至循环结束。 图形参见:图。 2.7 Gumowski-Mira公式 1980年,工作在 CERN 的物理学家 Gumowski, I. 和 Mira, C. 尝试计算模拟根本粒子轨迹(The trajectories of elementary particles) 在加速器 (Accelerator) 中的行为。他们使用了这组方程: 其中的函数F(x)是他们所考虑的模型,其中一个主要的模型他们使用了: 其中a是一个参数,通常在-1和1之间,b是一个非常敏感的常数,通常非常接近于1.0。如果b有一个轻微增长到1.001,轨迹会膨胀,或者螺旋向外至无限; 如果b有一个轻微的减小,比方0.999, 那么轨迹会收缩至奇异吸引子 (The attractor points)。最后一个重要的影响因素是初始值,典型的初始值X和Y在 -20和 20 之间。 下面是绘制Gumowski-Mira分形图的算法: 假定a=-0.4,b=0.93,i=0,x=1,y=1。 进行计算: 如果i<1000, 对点(x*20,y*20)着色,返回步骤。 如果, 结束循环。 图形参见:图。 2.8 分形图形的位图操作 1, 图形的保存:图形的保存可以分为三个步骤,先获取用户想要将图形保存为的文件名,然后再将当前客户区的图形拷贝成位图,最后将位图写入文件。 获取文件名可以使用CFileDialog类,初始化CFileDialog类后,使用类成员函数DoModal()显示对话框。然后使用类成员函数GetFileName()就可以获得用户输入的文件名。 将当前客户区域拷贝为位图操作比拟复杂,这里只能将其简略化后再加以描述。要将当前客户区域拷贝为位图,需要先获取当前窗口的句柄,这个可以使用函数HWND GetSafeHwnd( ) const;得到。然后需要确定当前客户区域的大小,而这个可以使用函数void GetClientRect( LPRECT lpRect ) const;得到,函数中的参数lpRect表示客户区域的大小。为了拷贝客户区的图形到内存,我写了一个函数CopyClientRectToDIB(HWND hander,CRect rect),其中的hander为当前窗口的句柄,rect表示客户区域的大小。在函数中,因为这里要将客户区坐标转换为屏幕坐标(如欲深入了解,请参见?Windows编程?第五章--图形根底),所以要先用函数void ClientToScreen( LPRECT lpRect ) const将显示区域坐标转换为屏幕坐标。得到需要的客户区域lpRect后,将lpRect指向的区域拷贝成Bitmap,使用BitBlt(HDC,int,int,int,int,HDC,int,int,unsigned long);可以到达要求。最后将指向位图的句柄返回。 将位图保存到磁盘,这个操作比拟简单,创立一个使用用户输入的文件名的文件,然后将图形写入文件即可。 2, 位图的复制和剪切。位图的复制和剪切原理是相同的,它们不同点在于剪切的时候需要在将选定区域复制后将其重画为白色区域。复制图形区域为位图上面我们已经介绍过了,这里不再赘述,而重画选定区域也只需要一个Rectangle()函数就可以实现。 3, 位图的粘贴,使用BitBlt()函数就可以实现。 附相关代码如下: 图片保存函数: void CFractalView::OnFileSave() { CFileDialog dlg(TRUE, NULL, "*.bmp",OFN_HIDEREADONLY ,"Bmp Files(*.bmp)|*.bmp"); if(dlg.DoModal()==IDOK) { CRect NowRect; GetClientRect(&NowRect); HANDLE hDib = G.CopyClientRectToDIB(GetSafeHwnd(), NowRect); G.SaveDIB(hDib,dlg.GetFileName()); } } 拷贝客户区函数: HDIB CGlobal::CopyClientRectToDIB(HWND hWnd, LPRECT lpRect) { HDIB hDIB = NULL; // handle to DIB // check for a valid window handle if (!hWnd) return NULL; POINT pt1, pt2; // convert client coords to screen coords pt1.x = lpRect->left; pt1.y = lpRect->top; pt2.x = lpRect->right; pt2.y = lpRect->bottom; ClientToScreen(hWnd, &pt1); ClientToScreen(hWnd, &pt2); lpRect->left = pt1.x; lpRect->top = pt1.y; lpRect->right = pt2.x; lpRect->bottom = pt2.y; // get the DIB of the client area by calling // CopyScreenToDIB and passing it the client rect hDIB = CopyScreenToDIB(lpRect); // return the handle to the DIB return hDIB; } HDIB CGlobal::CopyScreenToDIB(LPRECT lpRect) { HBITMAP hBitmap; // handle to device-dependent bitmap HPALETTE hPalette; // handle to palette HDIB hDIB = NULL; // handle to DIB // get the device-dependent bitmap in lpRect by calling // CopyScreenToBitmap and passing it the rectangle to grab hBitmap = CopyScreenToBitmap(lpRect); // check for a valid bitmap handle if (!hBitmap) return NULL; // get the current palette hPalette = GetSystemPalette(); // convert the bitmap to a DIB hDIB = BitmapToDIB(hBitmap, hPalette); // clean up DeleteObject(hPalette); DeleteObject(hBitmap); // return handle to the packed-DIB return hDIB; } HBITMAP CGlobal::CopyScreenToBitmap(LPRECT lpRect) { HDC hScrDC, hMemDC; // screen DC and memory DC HBITMAP hBitmap, hOldBitmap; // handles to deice-dependent bitmaps int nX, nY, nX2, nY2; // coordinates of rectangle to grab int nWidth, nHeight; // DIB width and height int xScrn, yScrn; // screen resolution // check for an empty rectangle //MessageBox((HWND)AfxGetApp()->GetMainWnd(),"122","123",NULL); if (IsRectEmpty(lpRect)) return NULL; // create a DC for the screen and create // a memory DC compatible to screen DC hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); hMemDC = CreateCompatibleDC(hScrDC); // get points of rectangle to grab nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; // get screen resolution xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); //make sure bitmap rectangle is visible if (nX < 0) nX = 0; if (nY < 0) nY = 0; if (nX2 > xScrn) nX2 = xScrn; if (nY2 > yScrn) nY2 = yScrn; nWidth = nX2 - nX; nHeight = nY2 - nY; // create a bitmap compatible with the screen DC hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); // select new bitmap into memory DC hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // bitblt screen DC to memory DC BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); // select old bitmap back into memory DC and get handle to // bitmap of the screen hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); // clean up DeleteDC(hScrDC); DeleteDC(hMemDC); // return handle to the bitmap return hBitmap; } 位图格式转换函数: HDIB CGlobal::BitmapToDIB(HBITMAP hBitmap, HPALETTE hPal) { BITMAP bm; // bitmap structure BITMAPINFOHEADER bi; // bitmap header LPBITMAPINFOHEADER lpbi; // pointer to BITMAPINFOHEADER DWORD dwLen; // size of memory block HANDLE hDIB, h; // handle to DIB, temp handle HDC hDC; // handle to DC WORD biBits; // bits per pixel // check if bitmap handle is valid if (!hBitmap) return NULL; // fill in BITMAP structure, return NULL if it didn't work if (!GetObject(hBitmap, sizeof(bm), (LPBYTE)&bm)) return NULL; // if no palette is specified, use default palette if (hPal == NULL) hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE); // calculate bits per pixel biBits = bm.bmPlanes * bm.bmBitsPixel; // make sure bits per pixel is valid if (biBits <= 1) biBits = 1; else if (biBits <= 4) biBi
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 初中其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服