giflib加载GIF
giflib是一款用C语言写的加载GIF库,在性能方面比Glide要好很多,首先来看一下性能对比。
glide加载gif
giflib加载gif
从上图中我们可以看出在CPU使用率上,giflib比glide好很多了,内存占用上giflib比glide也要好一些。那么如何使用giflib尼?
首先需要下载framesequence及giflib(以上网站需要翻墙,请自备梯子)
giflib文件目录如下:
framesequence文件目录如下:
下载完毕后,我们就将framesequence
下的jni目录复制到as的main下,giflib
复制到jni/giflib
目录下。目录结构如下(删除了与webp相关的文件):
这样就可以开始编译so文件了,但是由于giflib使用的是Android.bp
进行编译的(不会呀o(╥﹏╥)o)。所有我就根据Android.bp
来重新写了份Android.mk文件,然后ndk-build
该文件即可。
#
# Copyright (C) 2014 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gif
LOCAL_SRC_FILES := \giflib/dgif_lib.c \giflib/egif_lib.c \giflib/gifalloc.c \giflib/gif_err.c \giflib/gif_hash.c \giflib/openbsd-reallocarray.c \giflib/quantize.cLOCAL_CFLAGS += \-Werror \-Wno-format \-Wno-sign-compare \-Wno-unused-parameter \-DHAVE_CONFIG_H \LOCAL_SDK_VERSION := 8include $(BUILD_STATIC_LIBRARY)include $(CLEAR_VARS)
## Main libraryLOCAL_STATIC_LIBRARIES := gifLOCAL_LDFLAGS := -llog -ljnigraphicsLOCAL_C_INCLUDES := \giflibLOCAL_MODULE := framesequence
LOCAL_SRC_FILES := \BitmapDecoderJNI.cpp \FrameSequence.cpp \FrameSequenceJNI.cpp \FrameSequence_gif.cpp \JNIHelpers.cpp \Registry.cpp \Stream.cppifeq ($(FRAMESEQUENCE_INCLUDE_WEBP),true)LOCAL_C_INCLUDES += external/webp/includeLOCAL_SRC_FILES += FrameSequence_webp.cppLOCAL_STATIC_LIBRARIES += libwebp-decode
endifLOCAL_CFLAGS += \-Wall \-Werror \-Wno-unused-parameter \-Wno-unused-variable \-Wno-overloaded-virtual \-fvisibility=hidden \LOCAL_SDK_VERSION := 8include $(BUILD_SHARED_LIBRARY)
由于没有使用CMake,所以应该在build.gradle下进行如下配置
externalNativeBuild{
ndkBuild{
path “src/main/jni/Android.mk”
}
}
最后我们点击rebuild
即可生成so文件。那么如何使用尼?
在使用之前需要将framesequence
目录下的src里面的所有文件拷贝到as的Java
目录下。然后就可以使用了。使用代码如下(也可以去阅读framesequence
下的示例代码):
FrameSequenceDrawable mDrawable;int mResourceId;// This provider is entirely unnecessary, just here to validate the acquire/release processprivate class CheckingProvider implements FrameSequenceDrawable.BitmapProvider {HashSet<Bitmap> mBitmaps = new HashSet<Bitmap>();@Overridepublic Bitmap acquireBitmap(int minWidth, int minHeight) {Bitmap bitmap =Bitmap.createBitmap(minWidth + 1, minHeight + 4, Bitmap.Config.ARGB_8888);mBitmaps.add(bitmap);return bitmap;}@Overridepublic void releaseBitmap(Bitmap bitmap) {if (!mBitmaps.contains(bitmap)) throw new IllegalStateException();mBitmaps.remove(bitmap);bitmap.recycle();}public boolean isEmpty() {return mBitmaps.isEmpty();}}final CheckingProvider mProvider = new CheckingProvider();//传入资源,设置相关参数InputStream is = getResources().openRawResource(mResourceId);FrameSequence fs = FrameSequence.decodeStream(is);//传入的是InputStreammDrawable = new FrameSequenceDrawable(fs, mProvider);
// mDrawable.setLoopBehavior(LOOP_FINITE);//只播放一次mDrawable.setOnFinishedListener(new FrameSequenceDrawable.OnFinishedListener() {@Overridepublic void onFinished(FrameSequenceDrawable drawable) {Toast.makeText(getApplicationContext(),"The animation has finished", Toast.LENGTH_SHORT).show();}});drawableView.setBackgroundDrawable(mDrawable);
//开始播放mDrawable.start();//暂停播放mDrawable.stop();//裁剪成圆形mDrawable.setCircleMaskEnabled(!mDrawable.getCircleMaskEnabled());
目前giflib加载的都是本地的,那么如何加载线上GIF尼?其实可以把giflib与glide结合起来,由glide负责下载、缓存等的实现,giflib来负责GIF的加载。具体实现可以参考我写的一个demo
giflib加载GIF相关推荐
- giflib加载GIF文件
giflib是一款用C语言写的加载GIF库,在性能方面比Glide要好很多,首先来看一下性能对比. glide加载gif giflib加载gif 从上图中我们可以看出在CPU使用率上,giflib ...
- java 加载gif_android使用giflib加载gif
属于个人所创,转载请标明文章出处: 背景不多说,反正ndk加载gif比java上加载gif好很多很多,主要体现在内存占用与cpu消耗上.使用ndk加载占用内存更小,消耗的cpu更少. 要使用ndk加载 ...
- Android高工面试:用Glide加载Gif导致的卡顿,说一下你的优化思路
前言 Glide图片框架是可以直接加载GIF图的,但是做一个银行合作项目的时候,由于有需要出货页面需要加载一个GIF图,但是发现在使用Glide框架加载Gif图片,明显发现有延迟. 经过查看glide ...
- kotlin Bean加载失败lateinit property has not been initialized
Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...
- Python+OpenCV 图像处理系列(1)— Ubuntu OpenCV安装、图片加载、显示和保存
Ubuntu 16.04 下安装 Opencv sudo apt-get install libopencv-dev sudo apt-get install python-opencv 或者使用 p ...
- tensorflow 1.x Saver(保存与加载模型) 预测
20201231 tensorflow 1.X 模型保存 https://blog.csdn.net/qq_35290785/article/details/89646248 保存模型 saver=t ...
- tensor和模型 保存与加载 PyTorch
PyTorch教程-7:PyTorch中保存与加载tensor和模型详解 保存和读取Tensor PyTorch中的tensor可以保存成 .pt 或者 .pth 格式的文件,使用torch.save ...
- 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...
1. tf.nn.embedding_lookup(W, X) W的维度为[len(vocabulary_list), 128], X的维度为[?, 8],组合后的维度为[?, 8, 128] 代码说 ...
- Nignx集成fastDFS后访问Nginx一直在加载中解决
问题描述: Nginx集成fastDFS后,访问Nginx一直在加载中,得不到页面.查看Nginx的错误日志: 可以看到是fastdfs.conf的配置错误,tracker的ip没有修改: fastd ...
最新文章
- c语言程序设计电大形考作业答案,2016年电大-电大c语言程序设计形成性考核册答案(-).doc...
- Ubuntu16.04 安装Gitlab
- UI设计素材|动画的妙处,有助于吸引你的用户
- php 位运算 负数,php的位运算详解
- 【免费下载】2021年4月热门报告盘点下载
- 【PHP面向对象(OOP)编程入门教程】10.__set(),__get(),__isset(),__unset()四个方法的应用...
- python执行request请求
- _beginThread如何传递多个参数
- 把书本上的字快速弄到电脑上
- node在Fedora 22系统下开发环境搭建
- cmd检查java_如何通过cmd查看java环境
- 微芯科技35.6亿美元购Atmel 芯片业整合潮继续
- python线性回归实例 x轴坐标相同_python深度学习-tensorflow实现一个线性回归的案例...
- 信号采样基本概念 —— 1. 冲激函数
- 【网络】内网访问外网和外网访问内网的原理
- 什么才算好的监控系统?
- 为什么word打字换行的时候突然上一行文字间距变大了?如图
- win mac 双系统 opencore 硬盘引导_一分钟组装Win+Mac通用移动固态硬盘,千万别忽略这个细节...
- 港科夜闻|香港科大冯雁教授专访:人工智能的发展不能脱离人本
- 修复IE不能正常上网的工具
热门文章
- 【企业】米聊败北案例
- 【随心记】Boosting算法随想
- miui开机慢android,游戏启动慢如蜗牛?最新ColorOS跟MIUI带来质的提升
- 各种窗口最小化快捷键详解
- 二分类Logistic回归模型
- android 读取usb 文件,android开发:手机连接电脑读取文件
- 基于ssm网页设计学习网站
- ikbc 时光机 F87 Ctrl 失灵 解决办法
- 起点终点未定的最短路径——ACM_HongKong D题
- 数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)