文档章节

DevIL的学习笔记

 水台良月
发布于 2016/12/13 14:37
字数 1016
阅读 49
收藏 0
点赞 0
评论 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
长沙
couchbase sync_gateway的启动配置json

{ "interface":":4984", "adminInterface":":4985", "log":["REST", "Changes", "CRUD"], "databases":{ "sync_gateway":{ "users": { "GUEST": {"disabled": false, "admin_channels": ["*"......

技术小甜 ⋅ 2017/11/08 ⋅ 0

TCP-IP协议详解(10) TCP滑窗管理

在TCP协议与”流”通信中,我们建立了滑窗(sliding window)的基本概念。通过滑窗与ACK的配合,我们一方面实现了TCP传输的可靠性,另一方面也一定程度上提高了效率。其工作方式如下面的视频所...

炎黄V之怒 ⋅ 04/13 ⋅ 0

缸中大脑——西部世界第二季S02E04 斯芬克斯之谜

S02E04 斯芬克斯之谜The Riddle of the Sphinx 斯芬克斯之谜(Riddle of Sphinx)是出自《俄狄浦斯王》的寓言,即一种动物早晨四条腿,中午两条腿,晚上三条腿走路,腿最多时最无能。俄狄浦斯...

yokomaha ⋅ 05/14 ⋅ 0

3dsMax「世界名椅」建模专题课 | 今晚20:00直播(免费)

作者/活力网May Cheng 欢迎本次专题课的第二把椅子闪亮登场 没错 就是它! 7系列椅子( Model 3107 chair)| 1955 著名的“7系列椅”(Model 3107 chair) 一款诞生于1955年的椅子 现代家具设计...

Uzing ⋅ 03/16 ⋅ 0

我的友情链接

51CTO博客开发 老男孩的linux博客 斩月 抚琴煮酒 xmshuiyong’blog 雷纳科斯的博客 张宇(数据恢复) wangxingxing 马哥教育 Devil 龙哥 阿熊的窝 回忆未来-张宴 虚拟的现实 王伟 展示过去,展...

amwuqd ⋅ 2017/11/22 ⋅ 0

Devil-Linux 1.6.7 发布

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

oschina ⋅ 2014/12/24 ⋅ 4

Devil-Linux 1.6.0 正式版发布

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

红薯 ⋅ 2012/04/13 ⋅ 0

[转]Oracle修改监听口令

oracle 的监听机制 是外部应用程序连接oracle的入口。用oracle提供的lsnrctl 程序进行管理。一般很多人在管理oracle的时候,往往忽略对listener 的安全管理:监听在端口1521(默认端口)上的...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

Devil-Linux 1.6.8 发布,解决 GHOST glibc 漏洞

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

oschina ⋅ 2015/02/02 ⋅ 3

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 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决yum安装报错Protected multilib versions

使用yum安装报错Protected multilib versions原因是因为多个库不能共存,不过更新的话也并不行,但是可以在安装命令后面加上如下一段命令: --setopt=protected_multilib=false 案例: 比如需...

北岩 ⋅ 34分钟前 ⋅ 0

为什么要学习Typescript???

简单来说 目前的typescript就是未来的javascript 为什么?? 这要从ECMA-262标准的第4版说起 对了 我们说的ES5 其实是ECMAScript3.1这个替代性建议被扶正了而已... 那么 第4版标准是什么? 看看...

hang1989 ⋅ 38分钟前 ⋅ 0

linux安装ipfs

一、下载ipfs # cd /usr/local/ipfs/ # wget https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz # tar -zxvf go-ipfs_v0.4.15_linux-amd64.tar.gz 二、安装ipfs # ......

八戒八戒八戒 ⋅ 44分钟前 ⋅ 0

jvm程序执行慢诊断手册

生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长。本文分享,从业多年形成的排查守则。 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步。...

xpbob ⋅ 44分钟前 ⋅ 0

YII2 advanced 高级版本项目搭建-添加API应用以及多应用

一、YII安裝 安裝yii可以用composer安裝,也可以在yii中文社区下载归档文件安装 composer安装就不介绍了,因为要安装composer,比较麻烦,当然安装了composer是最好的,以后安装yii的插件要用...

botkenni ⋅ 45分钟前 ⋅ 0

在jdk1.8的环境下模拟永久代内存溢出

相信不少小伙伴在看深入理解Java虚拟机的时候,作者给我们举例一个demo来发生PermGen space 1、通过List不断添加String.intern(); 2、通过设置对应的-XX:PermSize与-XX:MaxPermSize(更快看到...

虾几把写 ⋅ 今天 ⋅ 0

开发OpenDaylight组件的完整流程

在前面介绍学习了OpenDaylight的几个重要模块后,这里再来介绍下完整开发一个模块的过程。 OSGI的bundles提供被其他OSGI组件调用的服务。这个教程中展示的是Data Packet Service去解析数据包...

wangxuwei ⋅ 今天 ⋅ 0

Java序列化和反序列化

1、什么是序列化和反序列化 序列化:把对象转换为字节序列的过程。 反序列化:把字节序列恢复成对象的过程。 2、被序列化的类需要实现serializable接口,只是为了标注该对象是可以被序列化的...

IT-Mamba ⋅ 今天 ⋅ 0

流式构建原理

流式构建需要达到分钟级的数据更新频率,Kylin采用类似于Spark Streaming的做法,每隔数分钟进行一次微构建。这边的构建需要考虑到一个延迟因素,分布式网络存在延迟等因素,该时间段的数据有...

无精疯 ⋅ 今天 ⋅ 0

在maven项目工程编写solr代码,需要的依赖

solrJ <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents<......

爱运动的小乌龟 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部