OpenIL(DevIL)- 开发者图像库

来源:互联网 发布:java写个简单的网页 编辑:程序博客网 时间:2024/05/17 08:56

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);
。其它与地方就基本没有变化。
这只是一个简单的使用,此库文件还有许多功能,比较实现锐化等等功能,大家可以参考库手册。我也会有以后的学习中更新对此库的学习。

 

链接地址:http://blog.csdn.net/weiqubo/article/details/7075826

原创粉丝点击