目前gif动画的加载库有很多,比如:gifView,Glide等都可以进行giff动画的加载,但是用这些gif加载较大的gif时就有可能出现ooM。所以今天我们用系统的giflib库进行gif的加载去避免ooM的出现,在性能上也要比这些gif的加载库要高。
首先这个giflib这个库是我们可以到系统原码里面找搜索giflib就可以找到这个gif库了
找到这个gif库打开就是c的代码。
我们拿到一个gif的动画图片怎么打开呢?这时我们就要用到系统中的gif_lib.c中的API了,在gif_lib中的有一个方法DGifOpenFileName()就是打开gif动画读取gif的信息的。
//GifFileType是一个保存gif信息的结构体
GifFileType *gifFileType = DGifOpenFileName(gifpath,&err);//调用系统的gif_lib.c的api打开gif,返回的是GifFileType的结构体
dGifSlurp(gifFileType);//进行gif的初始化,拿到gif的详细信息
备注:GifFlieType是一个保存gif天动画的结构体,里面保存着gif的宽高和总帧数等信息
利用DGifOpenFileName()打开gif后我们要对gif信息进行初始化,也是利用gif_lib.c的方法进行初始化,该方法是dGifSlurp();需要传入GifFlieType进行初始化,调用完这个方法后我们的gif动画的信息就读取到GifFlieType的这个结构体中保存了。
下面要创建一个保存gif相关信息的结构体保存从GifFlieType读出的信息
typedef struct GifBean{
//总时间
int total_time;
//当前帧
int current_frame;
//每一帧时间
int frame_duration;
//总帧数
int total_frame;
}GifBean;
//初始化一下GifBean保存gif的信息,为GifBean开劈一个内存空间
GifBean *gifBean = (GifBean *) malloc(sizeof(GifBean));
gifBean->frame_duration = 0;
gifBean->current_frame = 0;
gifBean->total_frame = 0;
gifBean->total_time = 0;
gifFileType->UserData = gifBean;//这