首页IT科技vc++开发游戏(【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类)

vc++开发游戏(【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类)

时间2025-05-05 04:29:16分类IT科技浏览4481
导读:为了解决这个问题,这节笔记我们将系统的学习MFC和ATL中新增一个图像处理的类,它就是华丽而强大的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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
怎么优化网站性能(如何提高网站优化seo) 怎么采集其他网站内容(怎样采集需要登陆的网页内容-登录查看内容采集软件)