概述
OpenIL(DevIL)CxImage和
OpenIL都两个对图片读取的库,前者是一个开源库,功能也比较强大,可以读取很多类型的图像文件,比如bmp,jpg,png ,tiff等等。后者也是一个对图片的读取,处理,显示的库文件(似乎不是免费的,我也没有搞懂,不过最关键的是,两个都可以使用就行了),但是,我在VS2008下配置Cxiamge很久都未成功(此库在2005年都停止更新),于是使用
OpenIL。
首先简要介绍一下 OpenIL,现名为DevIL。采用OpenGL风格写的库文件,最近的版本2009年3月发发布的DevIL1.78,且跨平台下载页是 http://openil.sourceforge.net/。最好直接下载其库文件和头文件,也可以下载SDK来自己编译,但是还要下载许多其它的相关库,比较麻烦,而且其中有一个头文件无法找到,不晓得算不算是一个Bug。其中库一共包含三个分别是,ii.dll,ilu.dll,ilut.dll.和OpenGL非常相似,里面的数据类型也是,比如ilint对应glint,ilutinit()对应glutinit(),还要其它许多相似之处。 现在为讲一下在vs2008中的配置: 1,首先将 openIL的所有头文件放在OpenLib/IL/include (你也可以设置其它的文件夹) 2,把所有的Lib文件放在OpengLib/IL/lib下 3,把所有dll文件放在OpenLib/IL/bin下,也可以全部放在C:/WINDOWS/system32下。 其它的也没有特别的要说明了。 然后在vs2008的简单栏里,点击工具,选项-》项目和解决方案-》vc++目录。在右面的显示以下内容的目录设置include,lib,bin文件夹,这样就可以开始我们的编程之旅。。。。 下面是演示一个代码,也是SDK里面的示例。 以下内容是.h文件 #include "StdAfx.h" #include <il/il.h> #include <il/ilu.h> #include <il/ilut.h> //限定处理的最大图像 #define MAX_X 640 #define MAX_Y 480 #pragma comment(lib,"devil.lib") #pragma comment(lib,"ilu.lib") #pragma comment(lib,"ilut.lib") typedef struct{ GLint width,height; unsigned char* pData; GLint bits; GLuint format; GLuint ID; }DIBTEXDATA,*pDIBTEXDATA; class CLoadImage { public: CLoadImage(void); ~CLoadImage(void); GLvoid Init(char * filename); GLvoid HandlDevILError(); //处理错误的信息 GLboolean Setup(char *filename); public://成员变量 DIBTEXDATA m_Dib; GLuint ID; }; 接下来就是.cpp文件 #include "LoadImage.h" CLoadImage::CLoadImage(void) { } CLoadImage::~CLoadImage(void) { if(ID) glDeleteTextures(1,&ID); } GLvoid CLoadImage::HandlDevILError(){ ILenum error=ilGetError(); //获取错误信息 if(error!=IL_NO_ERROR){ do{ MessageBox(::GetActiveWindow(),iluErrorString(error),"Error",MB_OK|MB_ICONERROR); }while ((error=ilGetError())); exit(1); } } GLvoid CLoadImage::Init(char *filename){ if(ilGetInteger(IL_VERSION_NUM)<IL_VERSION|| ilGetInteger(ILU_VERSION_NUM)<ILU_VERSION|| ilGetInteger(ILUT_VERSION_NUM)<ILUT_VERSION) MessageBox(::GetActiveWindow(),"请更新你的devIL库","提示",MB_OK|MB_ICONINFORMATION); ilInit(); //初始化il库 iluInit(); //初始化ilu库 ilEnable(IL_CONV_PAL); //因为opengl不能设置调色板,所以这里事先设置调色板 // ilutEnable(ILUT_OPENGL_CONV);//建立抖动,对那些显卡较差的电脑使用 glEnable(GL_TEXTURE_2D); if(Setup(filename)==0) exit(0); } GLboolean CLoadImage::Setup(char *filename){ ilGenImages(1,&m_Dib.ID); //产生一个主图像 ilBindImage(m_Dib.ID); //绑定图像 if(!ilLoadImage(filename)) //读取图像 HandlDevILError(); //错误处理 m_Dib.width=ilGetInteger(IL_IMAGE_WIDTH); //获取图像宽度和高度 m_Dib.height=ilGetInteger(IL_IMAGE_HEIGHT); if(m_Dib.width>0){ if(m_Dib.width>MAX_X){ m_Dib.width=MAX_X; //超出限定范围则使用最大值 m_Dib.height=(ILuint)(MAX_X/(ILfloat)ilGetInteger(IL_IMAGE_WIDTH)*m_Dib.height); } } if(m_Dib.height>0){ if(m_Dib.height>MAX_Y){ m_Dib.height=MAX_Y; m_Dib.width=(ILuint)(MAX_Y/(ILfloat)ilGetInteger(IL_IMAGE_HEIGHT)*m_Dib.width); } } HandlDevILError(); ilutRenderer(ILUT_OPENGL); //让ILUT执行以OpengL的函数 ID=ilutGLBindTexImage(); //将图像发送到OpenGL ilDeleteImages(1,&m_Dib.ID); return IL_TRUE; } 这就是一个完整的类。 下面结合 OpenIL与OpenGL来应用这个类。 其实此类的功能就是读取并设置图像的显示效果, 1,首先定义一个对象 如: CLoadImage m_Pic; 2,在调用此类的时候只要初始化中传入一个图像文件名 如:m_Pic.Init("003.dds"); 3,我们一般只会使用其它的一个ID 在调用此类后使用纹理的方法也很简单 在使用纹理前使用,如:glBindTexture (GL_TEXTURE_2D, m_Pic.ID); 。其它与地方就基本没有变化。 这只是一个简单的使用,此库文件还有许多功能,比较实现锐化等等功能,大家可以参考库手册。我也会有以后的学习中更新对此库的学习。 |
最后
以上就是有魅力秀发为你收集整理的OpenIL(DevIL)的全部内容,希望文章能够帮你解决OpenIL(DevIL)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复