使用CxImage库的初体验

转载自:http://blog.csdn.net/mynamelj/article/details/3630630    

   众所周知CxImage库是个功能非常强大的图片处理库,它支大部分常用的图片格式,使用它最主要的理由是它能很好的支持带有Alpha通道的PNG格式图片。之前也尝试过使用微软的ATL::CImage类,这个类也支持大部分的图片格式包括PNG格式的,相比CxImage库而言它,它只是一个轻量级的ATL组件类在Windows平台下只要支持GDI+都可以很方便的使用这个库。

 

       失败的是CImage虽然也支持带Alpha通道的PNG格式图片,但它显示一个带Alpha的PNG图片透明部分会用白色填充而不能很好的跟背景溶合在一起,这是我主要放弃它的原因。我们在做2D游戏时候图像显示的质量是非常关键的,如果拥有一个非常强大的图像处理库来做底层支持的话将会事半功倍。

 

 

       好了,我来说明一下这个CxImage类的简单用法,希望给刚接触CxImage的朋友带来一些帮助,首先我要说明的是在这里我以CxImage 6.0.0.0版为例(各个版本可有能所不同)。官方下载地址是:http://www.xdp.it/cximage/

 

打开工程后可以看到下例这些工程:

- CxImage

- CxImageCrtDll

- CxImageMfcDll

- dome

- domeDll

- jasper

- jbig

- jpeg

- libdcr

- mng

- png

- tiff

- zlib

 

1。首先我们要确定在程序中是希望静态链接还是动态链接,在这里我建议大家使用动态链接,因为这个库有点大,如果使用静态链接的话你的应用程序体积会额外增加1MB多。

 

2。然后确定在MFC中使用还是在CRT环境中使用,这个库专门为你建了这两个工程来创建不同环境中使用的运行时库,跟据你的需求来选择编译CxImageCrtDll还是CxImageMfcDll工程,如果你希望使用静态库链接的话除了这两个工程不需要编译其它的工程都需要编译。并且在引用这个静态库的时候要把这些所有编译过的工程里的*.lib全部拷到你的程里去。

 

3。OK编译完工程后将以下文件拷到你建立的工程里去

先将头文件拷到你的工程里去:

xfile.h、ximacfg.h、ximadef.h、ximage.h、xiofile.h、xmemfile.h

 

使用静态链接需要拷以下文件:

cximage.lib、png.lib、Jpeg.lib、jbig.lib、Tiff.lib、libdcr.lib、jasper.lib、zlib.lib、mng.lib

 

如用动态链接需要拷以下文件:

cximage.lib、cximage.dll

 

4。在你的工程里引用这个库#include "ximage.h"、#pragma comment(lib, "cximage.lib")如果是静态链接拷过来的那些*.lib文件全部要引用进去否则无法链接,在这里有人可能会问既然只包含了"ximage.h"这一个头文件为什么要拷那么多头文件过来呢?这是因为"ximage.h"这个头文件依赖那几个头文件所以必须拷过来。

 

5。现在你就可以使用这个CxImage库了,那我们来加载一幅图片然后将它显示出来吧:

      CxImage  image; // 定义一个CxImage对象

 

      image.Load("Ooopsy.png", CXIMAGE_FORMAT_PNG); // 加载一幅png图片

 

      // 在OnPaint消息里显示出来

      image.Draw(dc.GetSafeHdc(), 0, 0);

 

     以上只介绍最简单的用法,至于基它的功能你就自已尝试,我就不多说了,要是我一下子说完了CxImage开发者就不需要写文档说明了,在它的跟目录下有一个index.htm这就是它的文档起始页,如果你需要的话就自已去看吧!


具体应用技巧

1、打开一张图
可以通过创建一个新的CxImage对象来完成,通过构造函数来打开一张图
CxImage::CxImage(const char * filename, DWORD imagetype)
其中filename是需要打开的文件路径,imagetype是文件类型,支持的类型有:
CXIMAGE_FORMAT_UNKNOWN,CXIMAGE_FORMAT_BMP,CXIMAGE_FORMAT_GIF,CXIMAGE_FORMAT_JPG,CXIMAGE_FORMAT_PNG,CXIMAGE_FORMAT_MNG,CXIMAGE_FORMAT_ICO,CXIMAGE_FORMAT_TIF,CXIMAGE_FORMAT_TGA,CXIMAGE_FORMAT_PCX,CXIMAGE_FORMAT_WBMP,CXIMAGE_FORMAT_WMF,CXIMAGE_FORMAT_J2K,CXIMAGE_FORMAT_JBG,CXIMAGE_FORMAT_JP2,CXIMAGE_FORMAT_JPC,CXIMAGE_FORMAT_PGX,CXIMAGE_FORMAT_PNM,CXIMAGE_FORMAT_RAS,
当然,这么多格式很难记住,我们可以通过如下函数来直接获得文件的格式。
int FindType(const CString& filename)
{
CString ext = filename.Right(filename.GetLength()-filename.ReverseFind('.')-1);
int type = 0;
if (ext == "bmp") type = CXIMAGE_FORMAT_BMP;
#if CXIMAGE_SUPPORT_JPG
else if (ext=="jpg"||ext=="jpeg") type = CXIMAGE_FORMAT_JPG;
#endif
#if CXIMAGE_SUPPORT_GIF
else if (ext == "gif") type = CXIMAGE_FORMAT_GIF;
#endif
#if CXIMAGE_SUPPORT_PNG
else if (ext == "png") type = CXIMAGE_FORMAT_PNG;
#endif
#if CXIMAGE_SUPPORT_MNG
else if (ext=="mng"||ext=="jng") type = CXIMAGE_FORMAT_MNG;
#endif
#if CXIMAGE_SUPPORT_ICO
else if (ext == "ico") type = CXIMAGE_FORMAT_ICO;
#endif
#if CXIMAGE_SUPPORT_TIF
else if (ext=="tiff"||ext=="tif") type = CXIMAGE_FORMAT_TIF;
#endif
#if CXIMAGE_SUPPORT_TGA
else if (ext=="tga") type = CXIMAGE_FORMAT_TGA;
#endif
#if CXIMAGE_SUPPORT_PCX
else if (ext=="pcx") type = CXIMAGE_FORMAT_PCX;
#endif
#if CXIMAGE_SUPPORT_WBMP
else if (ext=="wbmp") type = CXIMAGE_FORMAT_WBMP;
#endif
#if CXIMAGE_SUPPORT_WMF
else if (ext=="wmf"||ext=="emf") type = CXIMAGE_FORMAT_WMF;
#endif
#if CXIMAGE_SUPPORT_J2K
else if (ext=="j2k"||ext=="jp2") type = CXIMAGE_FORMAT_J2K;
#endif
#if CXIMAGE_SUPPORT_JBG
else if (ext=="jbg") type = CXIMAGE_FORMAT_JBG;
#endif
#if CXIMAGE_SUPPORT_JP2
else if (ext=="jp2"||ext=="j2k") type = CXIMAGE_FORMAT_JP2;
#endif
#if CXIMAGE_SUPPORT_JPC
else if (ext=="jpc"||ext=="j2c") type = CXIMAGE_FORMAT_JPC;
#endif
#if CXIMAGE_SUPPORT_PGX
else if (ext=="pgx") type = CXIMAGE_FORMAT_PGX;
#endif
#if CXIMAGE_SUPPORT_RAS
else if (ext=="ras") type = CXIMAGE_FORMAT_RAS;
#endif
#if CXIMAGE_SUPPORT_PNM
else if (ext=="pnm"||ext=="pgm"||ext=="ppm") type = CXIMAGE_FORMAT_PNM;
#endif
else type = CXIMAGE_FORMAT_UNKNOWN;

return type;
}

2、保存一张图
bool CxImage::Save(LPCWSTR filename, DWORD imagetype=0)
参数和上面是一样的。
3、得到图形数据,以便在OpenGL中使用材质
BYTE* CxImage::GetBits(DWORD row = 0);
4、得到图形大小
long GetSize();
5、得到图形高度和宽度
DWORD CxImage::GetHeight();
DWORD CxImage::GetWidth();
6、得到文件类型
DWORD CxImage::GetType() const;
7、得到最后一个错误
char* CxImage::GetLastError();
8、在界面中绘制出来
long CxImage::Draw(HDC hdc, const RECT& rect, RECT* pClipRect=NULL)
HDC 绘图设备,rect 绘图的区域,确定绘图的左上角和右下角坐标。pClipRect,裁剪区域,一般可以和绘图区域一样大小,除非特殊需要。

在VS2005里面, for循环体里面定义 只在循环体内有效,所以会出现一些i 没有定义的问题
然后把所有生成的Lib最好都放到一个文件夹下,方便使用

我是放到

E:\lib\release
E:\lib\debug

这是官方的帮助对在自己的工程中使用CxImage类库的说明:

Project Settings
|- C/C++
| |- Code Generation
| | |- Use run-time library : Multithreaded DLL (must be the same for
| | | all the linked libraries)
| | |- Struct member alignment : must be the same for all the linked
| | | libraries
| |- Precompiled headers : not using precompiled headers
| |- Preprocessor
| |- Additional Include Directories: ..\cximage
|- Link
|- General
|- Object/library modules: ../png/Debug/png.lib
../raw/Debug/libdcr.lib
../jpeg/Debug/jpeg.lib
../zlib/Debug/zlib.lib
../tiff/Debug/tiff.lib
../jasper/Debug/jasper.lib
../cximage/Debug/cximage.lib ...
                                 
首先:

选项->工具->项目和解决方案->VC++目录

库文件: 增加 : E:\lib\release E:\lib\debug

包含文件: 增加: (your CxImage dir)\CxImage


然后在你的工程中:

项目->属性->配置属性->链接器->输入->附加依赖项:增加:

cximage.lib jpeg.lib png.lib tiff.lib j2k.lib jasper.lib jbig.lib zlib.lib

在项目->属性->配置属性->常规

MFC使用: 在共享DLL中使用MFC

字符集: 使用多字节字符集

在项目->属性->配置属性->C/C++->代码生成

运行时库 : /MD
结构成员对齐: 16字节

预编译头:不使用预编译头

OK,这样子,就可以开始使用CxImage啦


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值