Giflib-一个高效的图片加载库

本文介绍如何利用系统自带的giflib库,避免OOM问题,高效加载大体积GIF动画。通过DGifOpenFileName()打开GIF文件,dGifSlurp()初始化,然后遍历获取每帧信息,实现GifBean结构体存储关键数据。最后通过AndroidBitmap绘制到页面上。
摘要由CSDN通过智能技术生成

目前gif动画的加载库有很多,比如:gifView,Glide等都可以进行giff动画的加载,但是用这些gif加载较大的gif时就有可能出现ooM。所以今天我们用系统的giflib库进行gif的加载去避免ooM的出现,在性能上也要比这些gif的加载库要高。
首先这个giflib这个库是我们可以到系统原码里面找搜索giflib就可以找到这个gif库了

作者:依玲之风链接:https://www.jian /2fbb204a51b4来源:简书
找到这个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;//这

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值