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

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

时间2025-09-19 13:52:04分类IT科技浏览6402
导读:为了解决这个问题,这节笔记我们将系统的学习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
win11连蓝牙耳机没声音(Win11蓝牙不能用怎么办?Windows11蓝牙无法使用的解决方法)