文档章节

DevIL的学习笔记

 水台良月
发布于 2016/12/13 14:37
字数 1016
阅读 55
收藏 0

        最近学习DevIL,一个比较不错的载入多种图片软件。我们在学习界面的时候,常常需要对这种那种图片格式进行解码,同时在这方面也有许多解决方案,例如独立的cxImage、libpng、libjpeg、freeimage、FFmpeg、SOIL;或者嵌入到别的软件的例如Qt、DirectX。网上说cxImage不错,不少教材使用着一个库,但是cxImage只能在VisualStudio编译(应该可以移植吧,不知道有没有高手做到了,有时间肯定要研究一下),而且在VisualStudio编译配置还比较困难,再者cxImage已经停止更新了;SOIL......洗洗睡吧,连tga都载入不了;Qt也有解码多种图片的方案,但是离开了Qt就干不了了;至于FFmpeg,学过用FFmpeg解码音频的读者应该知道有多麻烦,直接使用肯定不好用,而且大部分情况应该不会搞得那么细吧。总之,DevIL是一个比较不错的API,尤其对于学过OpenGL的读者,对它的风格会感到很亲切。

        我大概的学习了一下,发现问题在于全面的资料实在很难找,没有像样的官方资料,如果要深入的了解着一个软件,以适应各种实际运用的需求,例如控制图片原点位置的功能,按理说DevIL应该有,但是官方文档并没有介绍,那么应该找到它的参考文档,经过了我不懈的努力,终于找到了一个详细介绍其API的网站:http://www-f9.ijs.si/~matevz/docs/DevIL,虽然网页依然很慢,但对于使用这一API的我已经很足够了。

        下面介绍以下DevIL:

        DevIL原名为OpenIL,不过在SGI要求下,变为了DevIL(其实还是跟Linux-Devil冲突......)。这是一个强大的图形处理软件,可以载入导出多种格式(20多种,有一些还是第一次见面)图片、图像处理(ILU模块、比如滤波)、与其他图形库配合使用(ILUT模块,例如与OpenGL、DirectX配合)。而且器接口风格与OpenGL极其类似,使用起来就像OpenGL的一个扩展。在大多数Linux发行版中都可以看见。在apt中软件名称为libdevil-dev。

        下面介绍一下基本使用方法。

#include <IL/il.h>
#include <iostream>
#include <cassert>

int main(){

    ILuint image;
    ILint width,height,type,format;
    ilInit();
    ilGenImages(1,&image);
    ilBindImage(image);
    assert(ilLoadImage("test.jpg"));
    ilGetIntegerv(IL_IMAGE_WIDTH,&width);
    ilGetIntegerv(IL_IMAGE_HEIGHT,&height);
    ilGetIntegerv(IL_IMAGE_TYPE,&type);
    ilGetIntegerv(IL_IMAGE_FORMAT,&format);
    cerr<<"Image Width:"<<width<<"\nImage Height:"<<height<<"\n";
    cerr<<"Image Type:";
    switch (format){
    case IL_RGB:cerr<<"RGB";break;
    case IL_RGBA:cerr<<"RGBA";break;
    case IL_BGR:cerr<<"BGR";break;
    case IL_BGRA:cerr<<"BGRA";break;
    case IL_COLOR_INDEX:cerr<<"Color Index";break;
    default:cerr<<"Other";break;
    }
    cerr<<"\nImage Type:";
    switch (type){
    case IL_UNSIGNED_BYTE:cerr<<"Unsigned Byte";break;
    case IL_BYTE:cerr<<"Byte";break;
    case IL_UNSIGNED_SHORT:cerr<<"UNisgned Short";break;
    case IL_SHORT:cerr<<"Short";break;
    case IL_UNSIGNED_INT:cerr<<"Unsigned Int";break;
    case IL_INT:cerr<<"Int";break;
    case IL_FLOAT:cerr<<"FLoat";break;
    case IL_DOUBLE:cerr<<"Double";break;
    default:cerr<<"Other";break;
    }
    cerr<<"\n";

    void * data=ilGetData();
    //载入data......

    ilBindImage(0);
    ilDeleteImges(1,&image);
    ilShutDown();

}

        学过OpenGL纹理的读者应该知道,载入的纹理有可能原点跟OpenGL设定的(在左下角)不符,可以这样设置,就不用担心这个问题了:

    ilEnable(IL_ORIGIN_SET);
    ilOriginFunc(IL_ORIGIN_LOWER_LEFT);//or IL_ORIGIN_UPPER_LEFT

        可以通过ilSetWrite、ilSetRead控制文件输出输入,在游戏开发里面很有用,下面给一个嵌入PHYSFS的例子:

#include <physfs.h>
#include <IL/il.h>
#include <cassert>
#include <iostream>
#include <string>

ILint PHYSFS_getc(PHYSFS_File * file){
	if (!PHYSFS_eof(file)){
		char ch;
		PHYSFS_read(file,&ch,sizeof(char),1);
		return ch;
	}
	return 0;
}

ILint PHYSFS_putc(ILubyte ch,PHYSFS_File * file){
	return PHYSFS_write(file,&ch,sizeof(ILubyte),1);
}

ILint PHYSFS_cread(void * buffer,ILint objSize,ILint objCount,PHYSFS_File * file){
	return PHYSFS_read(file,buffer,objSize,objCount);
}

ILint PHYSFS_cwrite(void * buffer,ILint objSize,ILint objCount,PHYSFS_File * file){
	return PHYSFS_write(file,buffer,objSize,objCount);
}

ILint PHYSFS_cseek(PHYSFS_File * file,ILint offset,ILint flag){
	PHYSFS_sint64 length=PHYSFS_fileLength(file);
	PHYSFS_sint64 pos=0;
	switch (flag){
	case IL_SEEK_SET:pos=0;break;
	case IL_SEEK_CUR:return (ILint)PHYSFS_tell(file);
	case IL_SEEK_END:pos=length;break;
	}
	return PHYSFS_seek(file,pos);
}

int main(int argc,char * argv[]){

	using namespace std;
	
	ilInit();
	PHYSFS_init(argv[0]);

	PHYSFS_addToSearchPath(".",true);
	PHYSFS_setWriteDir(".");
	
	ilSetRead(
		(fOpenRProc)PHYSFS_openRead,
		(fCloseRProc)PHYSFS_close,
		(fEofProc)PHYSFS_eof,
		(fGetcProc)PHYSFS_getc,
		(fReadProc)PHYSFS_cread,
		(fSeekRProc)PHYSFS_cseek,
		(fTellRProc)PHYSFS_tell);
		
	ilSetWrite(
		(fOpenWProc)PHYSFS_openWrite,
		(fCloseWProc)PHYSFS_close,
		(fPutcProc)PHYSFS_putc,
		(fSeekWProc)PHYSFS_cseek,
		(fTellRProc)PHYSFS_tell,
		(fWriteProc)PHYSFS_cwrite);
	
	ILuint image;
	ilGenImages(1,&image);
	ilBindImage(image);
	assert(ilLoadImage("src.jpg"));
	ilSaveImage("dst.jpg");
	ilBindImage(0);
	ilDeleteImages(1,&image);
	
	PHYSFS_deinit();
	ilShutDown();
	
}

        这个样

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 5
码字总数 7666
作品 0
长沙
私信 提问
Devil-Linux 1.6.7 发布

Devil Linux 1.6.7 发布,此版本包括大量的软件更新,更多内容请看更新日志。此版本现已提供下载: devil-linux-1.6.7-x86_64.tar.bz2 devil-linux-1.6.7-x86_64-server.tar.bz2 devil-linux...

oschina
2014/12/24
2.7K
4
Devil-Linux 1.6.8 发布,解决 GHOST glibc 漏洞

Devil-Linux 1.6.8 发布,此版本是稳定版本,包括大量的软件更新,解决了 GHOST glibc 漏洞 (CVE-2015-0235)。详情请看更新日志。 此版本现已提供下载: devil-linux-1.6.8-x86_64.tar.bz2 d...

oschina
2015/02/02
1K
3
Devil-Linux 1.6.0 正式版发布

Devil-Linux是一份特别的Linux发行,它用于防火墙和路由器场合。Devil-Linux的目标是拥有一份小巧、可定制的而且安全的 Linux。Devil-Linux将来会远远不只是一套普通的路由器,我们将提供很多...

红薯
2012/04/13
504
0
在你的Ubuntu Linux桌面上嵌入终端窗口

除了我们曾经介绍过的 Tilda 和 Yakuake 终端具有嵌入桌面的效果之外,使用 Devil’s Pie 这个小程序你同样可以将终端窗口嵌入到你的 Linux 桌面。 下面就以 GNOME Terminal 为例来说明嵌入到...

范堡
2009/05/08
886
0
Devil Linux 1.6 RC2 发布

Devil Linux 1.6 RC2 发布,该版本使用 3.2.4 版本内核,升级 MySQL 到 5.5.20 ,修复了一些已报告的问题等。 Devil-Linux是一份特别的Linux发行,它用于防火 墙和路由器场合。Devil-Linux的...

红薯
2012/02/08
254
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot与pageHelper版本问题

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version></parent> <dependency>......

WALK_MAN
3分钟前
0
0
PHP开发支付宝微信个人免签支付接口实例

这是一个PHP开发支付宝微信个人免签支付接口实例,支付宝微信即时到帐接口,使用原生支付宝即时到帐接口修改而来,即可实现多接口收款功能,开发只需要按照支付宝即时到帐接口开发即可,减少...

sucaihuo
7分钟前
1
0
《孩子,你慢慢来》的读书笔记与读后感2600字

《孩子,你慢慢来》的读书笔记与读后感2600字: 龙——保护儿童的思维: 今天读《孩子,你慢慢来》龙这一节,安安的妈妈是中国人,她在安安两岁的时候就认识到安安有着固执的个性。安安正是处...

原创小博客
19分钟前
2
0
kubernetes每个节点创建一个服务的Pod

1. 问题场景 希望一个worker节点上仅部署同样的服务一个. 比如: kubernets有三个worker节点,三个节点部署N个副本的api服务, 为了提高服务效率希望加入缓存,需要为三个节点个部署一个redis服务...

jimmywa
22分钟前
4
0
搭建Git服务器

Git本身是没有服务器和客户端的区别,但是如果我们要共享git仓库时,就需要ssh、http,它们就有服务器和客户端的区别。 Windows平台下搭建Git服务器 1、在自己电脑搭建Git服务器,且只有自己...

国仔饼
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部