vc++开发游戏(【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类)
为了解决这个问题 ,这节笔记我们将系统的学习MFC和ATL中新增一个图像处理的类 ,它就是华丽而强大的CImage类 。
由于本节笔记是对CImage类的一个非常系统近乎完全的介绍 ,我尽量让它涵盖到了CImage类的所有的属性和类成员 ,所以
篇幅也许比以往的笔记内容都长 ,里面的不少内容是用到的时候才需要掌握或者查阅的 ,并不用强行记忆 。
一 ,概念讲解部分
1.CImage类的定位和概述
首先 ,我们简单介绍一下CImage类的定位。
CImage是MFC和ATL共享的新类 ,它提供了增强的位图支持,包括加载 、保存和转换JPEG ,BMP ,GIF,PNG图像格式的能力 。可以说是微软意识到了CBitmap的不足 ,然后推出了一个CBitmap的增强版 。使用CImage类 ,需在代码头部加入包含atlimage.h文件,即添加代码#include"atlimage.h" 。
由于CImage拥有功能强大的类成员函数的支持 ,它便具有了下列四个比较出彩的特性:
1 、AlphaBlend支持像素级的颜色混合 ,从而实现透明和半透明的效果 。
2 、PlgBlt能使一个矩形区域的位图映射到一个平行四边形区域中 ,而且还可能使用位屏蔽操作 。
3 、TransparentBlt在目标区域中产生透明图像
4 、MaskBlt在目标区域中产生源位图与屏蔽位图合成的效果 。
1 、AlphaBlend支持像素级的颜色混合 ,从而实现透明和半透明的效果 。
2 、PlgBlt能使一个矩形区域的位图映射到一个平行四边形区域中 ,而且还可能使用位屏蔽操作 。
3 、TransparentBlt在目标区域中产生透明图像
4 、MaskBlt在目标区域中产生源位图与屏蔽位图合成的效果 。
2.以CImage类做媒 ,让CBitmap类也能处理丰富的图片格式
解决的思路比较明朗 ,我们采用CImage类的Load函数加载图片 ,之后用Detch取得HBITMAP的句柄 ,然后再将此句柄附加给CBitmap的对象就行了。
这样就实现了让CBitmap类也可以操作JPG/JPEG/GIF/PNG格式的图片 。
具体代码如下:
#include "atlimage.h"<br /> CImage image; //定义一个CBitmap类<br /> image.Load(“filename ”); //filename为要加载的文件地址<br /> HBITMAP hBitmap=image.Detach(); //返回被分离的图片的句柄<br /> CBitmap bmp; // 定义一个bitmap<br /> bmp.Attach(hBitmap); //进行句柄的附加
然后就可以用CBitmap进行余下的操作了 。
3.CImage额外的一些性质
CImage类对于DIB(device-independentbitmap)设备无关位图文件和非DIB都可以处理。我们可以通过Create函数或者CImage::Load来处理DIB部分,用Attach函数来将非DIB部分附加到一个CImage对象上 。
对于以下函数 ,只支持DIB部分的位图文件 ,他们是:
GetBitsGetColorTable,GetMaxColorTableEntries ,GetPitch ,GetPixelAddress,IsIndexed ,SetColorTable 。
我们可以通过CImage类中的IsDIBSection()函数来帮助我们判断一个位图文件是否为DIB部分 ,其定义如下:
bool IsDIBSection( ) const throw( ); //如果返回值为true ,则该文件为DIB;返回flase则不是DIB文件
我们需要注意的是 ,CImage不能被选到一个新的CDC(classofdevice-context设备描述表的类) ,CImage会为图像创建自己的HDC(设备描述表DC的句柄)。因为一个HBITMAP只能被选入到一个HDC中一次 ,也就是说这个与CImage相关的HBITMAP不能被选到一个其他的HDC中 。
如果需要一个CDC ,我们可以从CImage中获取HDC ,然后使用CDC::FromHandle函数 。
4.CImage兼容性的说明
在CImage中 ,有如下兼容性的要求:
只支持WindowsNT4.0以上系统的成员函数:PlgBlt,MaskBlt ,AlphaBlend 。
只支持Windows2000,98以上系统的成员函数:TransparentBlt ,Draw
只支持WindowsNT4.0以上系统的成员函数:PlgBlt,MaskBlt ,AlphaBlend 。
只支持Windows2000,98以上系统的成员函数:TransparentBlt ,Draw
其实由于目前都是WindowsXP以上的操作系统,这个知识点了解一下就行 。
5.CImage类用于贴图的一般的使用方法
使用方法不唯一 ,最常用的方法如下 ,该方法大致分为三部分:
<1>在源文件中添加CImage类的包含文件:
#include"atlimage.h"
<2>定义一个CImage类对象 ,然后调用CImage::Load方法装载一个外部图像文件 。Load方法有如下两种重载:
HRESULT Load(<br /> LPCTSTR pszFileName //包含加载文件名的字符串指针<br /> ) throw( );<br /> HRESULT Load(<br /> IStream* pStream //指向包含加载文件名的流的指针<br /> ) throw();
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!