日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

DevIL的学习笔记

發(fā)布時(shí)間:2023/12/16 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DevIL的学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

????????最近學(xué)習(xí)DevIL,一個(gè)比較不錯(cuò)的載入多種圖片軟件。我們?cè)趯W(xué)習(xí)界面的時(shí)候,常常需要對(duì)這種那種圖片格式進(jìn)行解碼,同時(shí)在這方面也有許多解決方案,例如獨(dú)立的cxImage、libpng、libjpeg、freeimage、FFmpeg、SOIL;或者嵌入到別的軟件的例如Qt、DirectX。網(wǎng)上說(shuō)cxImage不錯(cuò),不少教材使用著一個(gè)庫(kù),但是cxImage只能在VisualStudio編譯(應(yīng)該可以移植吧,不知道有沒有高手做到了,有時(shí)間肯定要研究一下),而且在VisualStudio編譯配置還比較困難,再者cxImage已經(jīng)停止更新了;SOIL......洗洗睡吧,連tga都載入不了;Qt也有解碼多種圖片的方案,但是離開了Qt就干不了了;至于FFmpeg,學(xué)過(guò)用FFmpeg解碼音頻的讀者應(yīng)該知道有多麻煩,直接使用肯定不好用,而且大部分情況應(yīng)該不會(huì)搞得那么細(xì)吧??傊?#xff0c;DevIL是一個(gè)比較不錯(cuò)的API,尤其對(duì)于學(xué)過(guò)OpenGL的讀者,對(duì)它的風(fēng)格會(huì)感到很親切。

????????我大概的學(xué)習(xí)了一下,發(fā)現(xiàn)問(wèn)題在于全面的資料實(shí)在很難找,沒有像樣的官方資料,如果要深入的了解著一個(gè)軟件,以適應(yīng)各種實(shí)際運(yùn)用的需求,例如控制圖片原點(diǎn)位置的功能,按理說(shuō)DevIL應(yīng)該有,但是官方文檔并沒有介紹,那么應(yīng)該找到它的參考文檔,經(jīng)過(guò)了我不懈的努力,終于找到了一個(gè)詳細(xì)介紹其API的網(wǎng)站:http://www-f9.ijs.si/~matevz/docs/DevIL,雖然網(wǎng)頁(yè)依然很慢,但對(duì)于使用這一API的我已經(jīng)很足夠了。

????? ? 下面介紹以下DevIL:

????? ? DevIL原名為OpenIL,不過(guò)在SGI要求下,變?yōu)榱薉evIL(其實(shí)還是跟Linux-Devil沖突......)。這是一個(gè)強(qiáng)大的圖形處理軟件,可以載入導(dǎo)出多種格式(20多種,有一些還是第一次見面)圖片、圖像處理(ILU模塊、比如濾波)、與其他圖形庫(kù)配合使用(ILUT模塊,例如與OpenGL、DirectX配合)。而且器接口風(fēng)格與OpenGL極其類似,使用起來(lái)就像OpenGL的一個(gè)擴(kuò)展。在大多數(shù)Linux發(fā)行版中都可以看見。在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();}

????? ? 學(xué)過(guò)OpenGL紋理的讀者應(yīng)該知道,載入的紋理有可能原點(diǎn)跟OpenGL設(shè)定的(在左下角)不符,可以這樣設(shè)置,就不用擔(dān)心這個(gè)問(wèn)題了:

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

????? ? 可以通過(guò)ilSetWrite、ilSetRead控制文件輸出輸入,在游戲開發(fā)里面很有用,下面給一個(gè)嵌入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();}

????? ? 這個(gè)樣

轉(zhuǎn)載于:https://my.oschina.net/goodmoon/blog/805121

總結(jié)

以上是生活随笔為你收集整理的DevIL的学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。