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

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

时间2025-08-03 21:23:50分类IT科技浏览5742
导读:为了解决这个问题,这节笔记我们将系统的学习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
王建军_百度百科 vi命令查找字段(VIM字符集编码设置_icewater_新浪博客)