android之Gif处理(解决OOM问题)

Android开发——优化Glide加载超大gif图 /必须要开启anim!//根据文件头判断是否是gif//DES:此日志主要关注gif图并且设置了不允许动画的地方/*解析方法//进行采样设置//创建解析器构建模式//DES:不含透明层可以加速渲染但是透明的gif会渲染黑色背景//循环一次的则矫正为无限循环null序列化类:>{try{//DES:将resource编码成文件。 阅读详情

Android开源项目:GifView——Android显示GIF动画

作者:ant.cy.liao

主页:http://code.google.com/p/gifview/

下载:http://code.google.com/p/gifview/downloads/list

简介:android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常不能正常显示出来,为此写了这个gifview,其用法和imageview一样

 

使用方法:

1-把GifView.jar加入你的项目。

2-在xml中配置GifView的基本属性,GifView继承自View类,和Button、ImageView一样是一个UI控件。如:

 <com.ant.liao.GifView android:id="@+id/gif2"

       android:layout_height="wrap_content"android:layout_width="wrap_content"

       android:paddingTop="4px" android:paddingLeft="14px"android:enabled="false" />

 

3-在代码中配置常用属性:

   // 从xml中得到GifView的句柄

       gf1 = (GifView) findViewById(R.id.gif1);

       // 设置Gif图片源

       gf1.setGifImage(R.drawable.gif1);

       // 添加监听器

       gf1.setOnClickListener(this);

       // 设置显示的大小,拉伸或者压缩

       gf1.setShowDimension(300, 300);

       // 设置加载方式:先加载后显示、边加载边显示、只显示第一帧再显示

       gf1.setGifImageType(GifImageType.COVER);

 

GifView的Jar包共有四个类:

GifAction.java:

观察者类,监视GIF是否加载成功

package com.ant.liao;

public interface GifAction {

/**

 *gif解码观察者

  *@hide

  *@param parseStatus 解码是否成功,成功会为true         

  *@param frameIndex 当前解码的第几帧,当全部解码成功后,这里为-1         

 */       

  public void parseOk(boolean parseStatus,int frameIndex);

}

 

GifFrame.java

里面三个成员:当前图片、延时、下张Frame的链接。

package com.ant.liao;

import android.graphics.Bitmap;

public class GifFrame {

/**

* 构造函数

* @param im 图片

* @param del 延时

*/       

public GifFrame(Bitmap im, int del){ 

image = im;        

delay = del;    

}          

public GifFrame(String name,intdel){  

imageName = name;        

delay = del;       

}              

/**图片*/     

public Bitmap image;  

/**延时*/       

public int delay; 

/**当图片存成文件时的文件名*/

public String imageName = null;     

/**下一帧*/     

public GifFrame nextFrame = null;

}

 

GifDecoder.java

解码线程类

http://code.google.com/p/gifview/source/browse/trunk/src/com/ant/liao/GifDecoder.java

 

GifView.java

主类,包括常用方法,如GifView构造方法、设置图片源、延迟、绘制等。

http://code.google.com/p/gifview/source/browse/trunk/src/com/ant/liao/GifView.java

 

 

 

Android开源项目:android-gif-drawable——Android显示GIF动画

android-gif-drawable

Views andDrawable for animated GIFs in Android.

项目地址:https://github.com/koral--/android-gif-drawable

Overview

Bundled GIFLibvia JNI is used to render frames. This way should be more efficient thanWebView or Movie classes.
Animation starts automatically and run only if View with attached GifDrawableis visible.

Download

Latest release downloads

Setup

Gradle(Android Studio)

Insert thefollowing dependency to build.gradle file of your project.

dependencies {

   compile 'pl.droidsonroids.gif:android-gif-drawable:1.0.+'

}

 

Note thatMaven central repository should be defined eg. in top-level build.gradle likethis:

buildscript {

   repositories {

       mavenCentral()

   }

}

allprojects {

   repositories {

       mavenCentral()

   }

}

 

Mavendependency

SDK with APIlevel 19 is needed. If you don't have it in your local repository, downloadmaven-android-sdk-deployer and installSDK level 19: mvn install -P 4.4 (from maven-android-sdk-deployer directory).Then add dependency in pom.xml of your project:

<dependency>

   <groupId>pl.droidsonroids.gif</groupId>

   <artifactId>android-gif-drawable</artifactId>

   <version>insert latest version here</version>

    <type>aar</type>

</dependency>

 

Requirements

·        Android 1.6+ (API level 4+)

Building fromsource

·        Android NDKneeded tocompile native sources

Usage

From XML

The simplestway is to use GifImageView (or GifImageButton) like a normal ImageView:

<pl.droidsonroids.gif.GifImageView

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:src="@drawable/src_anim"

   android:background="@drawable/bg_anim"

   />

 

If drawablesdeclared by android:src and/or android:background are GIF files then they willbe automatically recognized as GifDrawables and animated. If given drawable isnot a GIF then mentioned Views work like plain ImageView and ImageButton.

GifTextViewallows you to use GIFs as compound drawables and background.

<pl.droidsonroids.gif.GifTextView

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:drawableTop="@drawable/left_anim"

   android:drawableStart="@drawable/left_anim"

   android:background="@drawable/bg_anim"

   />

 

From Java code

GifImageView,GifImageButton and GifTextView have also hooks for setters implemented. Soanimated GIFs can be set by calling setImageResource(int resId) andsetBackgroundResource(int resId)

GifDrawablecan be constructed directly from various sources:

       //asset file

       GifDrawable gifFromAssets = new GifDrawable( getAssets(),"anim.gif" );

 

       //resource (drawable or raw)

       GifDrawable gifFromResource = new GifDrawable( getResources(),R.drawable.anim );

 

       //byte array

       byte[] rawGifBytes = ...

       GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );

 

       //FileDescriptor

       FileDescriptor fd = new RandomAccessFile( "/path/anim.gif","r" ).getFD();

       GifDrawable gifFromFd = new GifDrawable( fd );

 

       //file path

       GifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" );

 

       //file

       File gifFile = new File(getFilesDir(),"anim.gif");

       GifDrawable gifFromFile = new GifDrawable(gifFile);

 

       //AssetFileDescriptor

       AssetFileDescriptor afd = getAssets().openFd( "anim.gif" );

       GifDrawable gifFromAfd = new GifDrawable( afd );

 

       //InputStream (it must support marking)

       InputStream sourceIs = ...

       BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH);

       GifDrawable gifFromStream = new GifDrawable( bis );

 

       //direct ByteBuffer

       ByteBuffer rawGifBytes = ...

       GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );

 

 

InputStreamsare closed automatically in finalizer if GifDrawable is no longer needed so youdon't need to explicitly close them. Calling recycle() will also closeunderlaying input source.

Note that allinput sources need to have ability to rewind to the begining. It is required tocorrectly play animated GIFs (where animation is repeatable) since subsequentframes are decoded on demand from source.

Animationcontrol

GifDrawableimplements an Animatable and MediaPlayerControl so you can use its methods andmore:

·        stop()- stops the animation, can becalled from any thread

·        start()- starts the animation, canbe called from any thread

·        isRunning()- returns whetheranimation is currently running or not

·        reset()- rewinds the animation, doesnot restart stopped one

·        setSpeed(float factor)- sets newanimation speed factor, eg. passing 2.0f will double the animation speed

·        seekTo(int position)- seeksanimation (within current loop) to given position (in milliseconds)Only seeking forward is supported

·        getDuration()- returns duration ofone loop of the animation

·        getCurrentPosition()- returnselapsed time from the beginning of a current loop of animation

UsingMediaPlayerControl

Standardcontrols for a MediaPlayer (like in VideoView) can be used to control GIFanimation and show its current progress.

Just setGifDrawable as MediaPlayer on your MediaController like this:

   @Override

   protected void onCreate ( Bundle savedInstanceState )

   {

       super.onCreate( savedInstanceState );

       GifImageButton gib = new GifImageButton( this );

       setContentView( gib );

       gib.setImageResource( R.drawable.sample );

       final MediaController mc = new MediaController( this );

       mc.setMediaPlayer( ( GifDrawable ) gib.getDrawable() );

       mc.setAnchorView( gib );

       gib.setOnClickListener( new OnClickListener()

       {

            @Override

            public void onClick ( View v )

           {

                mc.show();

            }

       } );

   }

 

Retrieving GIFmetadata

·        getLoopCount()- returns a loop countas defined in NETSCAPE 2.0 extension

·        getNumberOfFrames()- returns numberof frames (at least 1)

·        getComment()- returns comment text(null if GIF has no comment)

·        getFrameByteCount()- returns minimumnumber of bytes that can be used to store pixels of the single frame

·        getAllocationByteCount()- returnssize (in bytes) of the allocated memory used to store pixels of givenGifDrawable

·        getInputSourceByteCount()- returnslength (in bytes) of the backing input data

·        toString()- returns human readableinformation about image size and number of frames (intended for debuggingpurpose)

Advanced

·        recycle()- provided to speed upfreeing memory (like in android.graphics.Bitmap).

·        getError()- returns last errordetails

References

This libraryuses code from GIFLIB5.0.5 andSKIA.

License

MIT License
See LICENSE file.

 

PS:

GifView:已知bug: 如果图档过大,会出现OOM

 if the gif image is too large,maybe OOM.

              为了解决图档太大时的OOM,我想把gif解析时的图片先存入到文件中,在显示时直接从文件中读入,但这样的话,显示的效果不好。

            而android-gif-drawable并没有此问题,底层解码使用C实现,极大的提高了解码效率,同时很大程度上避免了OOM现象出现。


这是我做的一个小demo

https://github.com/changkongyx/gifDemo


Android GIF处理与OOM解决方案详解 在现代的计算设备中,图像渲染是应用最为频繁的操作之一,特别是在处理动态图形如GIF时。图像渲染涉及大量计算和内存操作,因此对渲染流程的优化是降低内存占用的关键。GIFView控件之所以在开发者中受到青睐,是因为它不仅简化了GIF图像的加载和渲染过程,而且还提供了一系列优化机制来减少内存和CPU资源的消耗。这一节,我们将从功能和优势两个方面来介绍GIFView控件。 阅读详情

相关推荐

android之Gif处理(解决GIF显示容易OOM问题,包括代码和说明),非常详细的介绍

android之Gif处理(解决GIF显示容易OOM问题,包括代码和说明),非常详细的介绍,让我们直面GIF蛋疼的OOM吧

GifDecoder解析gif文件时抛出的OutOfMemory问题

GifDecoder是android下用于解析gif文件的开源代码,网上即可下载,但是在一些低端机,具体多低不好说, 我在开发过程中发现在一台总共600M内存的android手机上运行时,抛出了OutOfMemoryError的错误。 网上那个作者也试图想过其它方法解决,比如解析一张图片则保存成文件,并释放iamge内存,再继续解析下一张, 但这类方法明显不现实,占用空间不说,I/O

zhuobattle的专栏 3976

android显示GIF动画

由于android没有自带的gif动画,有个神人写第三方的库,我改了下代码,实现了gif动画显示,在项目中很有用。

Android 内存溢出解决方案(OOM) 整理总结

在最近做的工程中发现加载的图片太多或图片过大时经常出现OOM问题,找网上资料也提供了很多方法,但自己感觉有点乱,特此,今天在不同型号的三款安卓手机上做了测试,因为有效果也有结果,今天小马就做个详细的总结,以供朋友们共同交流学习,也供自己以后在解决OOM问题上有所提高,提前讲下,片幅有点长,涉及的东西太多,大家耐心看,肯定有收获的,里面的很多东西小马也是学习参考网络资料使用的,先来简单讲下下:

zzqLivecn的专栏 1033

安卓gif加载解决oom

安卓解决listview等控件加载gif图内存溢出问题 经过我测试1000加左右没多少问题 可以直接用

GifDecoder

基于Native开发的Gif解码器,尚未仔细测试

【Android笔记】Android加载大图策略,防止OOM

Android中图片以位图(Bitmap)的形式存在,位图常见的格式有.png.jgp.bmp.gif。在加载图片的过程中常见的就是内存溢出。内存溢出是系统会给APP分配内存也就是Heap Size值。当APP占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存时就会抛出的异常。为什么在加载大图片时会出现内存溢出?首先我们要了解Bitmap位图占用内存大小的计算方式。

Ho博客 1955

GIF动态图片组件GifView

在官方开源网站上下载了GifView的源码,可以显示GIF动态图片,可是不知能,只能显示GIF图片,不能同时支持PNG或JPG图片了,进行了一些修改,可以支持多种格式的图片,当然也包括gif动态图,用法痛GifView相同,具体用户可以百度GIFView的用法。一样的,我只对其进行了修改

使用pl.droidsonroids.gif.GifImageView在安卓中显示动图遇到的问题

在做一款聊天软件,其中聊天界面需要发送表情,而表情都是动图,在安卓中想要显示动图,就要借助第三方框架,我选的是pl.droidsonroids.gif.GifImageView。 使用方法如下:你在github上下载了android-gif-drawable.aar后,解压后,将jni文件下的所有文件夹以及classes.jar拷贝到你安卓项目的libs文件下,然后将你项目代码中的image

风雨诗轩的博客 1万+

IPV6基本配置

IPV6配置,DHCPV6,华为模拟器,IPV6的M/O标志位

路漫漫其修远兮 4666

Gartner DSG数据安全治理 架构及解读

目录背景:架构图: 解释:英文解释:(自上而下)平衡业务与风险、威胁、合规之间的关系(5个维度之间的平衡)优先处理数据集制定安全策略实施安全工具策略配置同步从上到下,从需求调研开始实施数据安全治理。千万不要跨过数据摸底、治理优先级分析、制定治理整体策略,而直接从技术工具开始对数据安全进行治理。 先明确选择需要治理的对象,优先选择重要数据进行数据安全治理工作。可以通过数据梳理、分类分级等手段,完成数据资产盘点和筛选,在纷杂的数据中理清头绪。

锦慈的技术博客 7217

Android学习之ImageView放置gif动态图

最近做图片的时候碰到一个问题,就是imageview控件中放动态图,显示出来的效果跟静态图是一样的。于是我网上大概找了一下资料,对于这方面大概有三个解决方法 一、将gif用工具分割,一帧一帧的播放这篇博客中有介绍http://www.cnblogs.com/TerryBlog/archive/2010/09/06/1819641.html 二、使用开源框架Glide是个不错的选择,当然也还有其他的

jiapeng的专栏 1万+

老服务器焕新记:在Dell R730上折腾Nvidia K80显卡的完整记录(含Anaconda环境配置)

本文详细记录了在Dell R730服务器上为Nvidia K80计算卡安装驱动、配置CUDA及Anaconda环境的完整过程。文章重点解决了老旧硬件与CentOS 7系统的兼容性问题,提供了从BIOS设置、驱动版本精准匹配到Python机器学习环境搭建的实战指南,旨在帮助读者低成本挖掘旧服务器的GPU计算潜力。

weixin_29197835的博客 503

Android图片编辑功能,GitHub - ControlToday/PhotoDealDemo: android图片编辑的一个demo,其实是一个可以使用的编辑框架。功能包括标记、文字、旋转、马赛...

PhotoDealDemoandroid图片编辑的一个demo,其实是一个可以使用的编辑框架。功能包括标记、文字、旋转、马赛克、裁剪和编辑撤销,可以不依赖so库,只使用原生接口实现功能。优势:1可以不依赖so库2具有撤销功能,目前开源的几乎没有使用说明1、OOM,必须在前一个页面,加载完成图片以后,才能进行图片编辑界面,否则OOM解决:新启动一个进程来处理图片,并且自定义一个imageloader...

weixin_40008969的博客 356

Nornir自动化简单介绍-网络设备信息收集

作为网工,学会通过执行脚本,可以自动化的完成日常一些设备相关配置或信息收集等工作,可以说是事半功倍。 Nornir就是这样一个自动化网络运维工具。按照官网上的说明: Nornir是用python编写的自动化框架,可与python一起使用。Nornir旨在通过提供一个纯Python框架来解决这些问题。 详细参考: Github GitHub - nornir-automation/nornir: Pluggable multi-threaded framework with inventory .

Gun&rose 7805

避开RK3588开发板SDIO配置的坑:O9201SB WiFi模组接入实战指南

本文为嵌入式开发者提供了在RK3588开发板上,利用TF卡槽接入O9201SB WiFi6模组的实战指南。文章深度剖析了SDIO配置中常见的电源管理序列冲突问题,并给出了从设备树节点修改、内核编译到系统验证的完整解决方案,帮助开发者避开配置陷阱,成功实现高性能无线连接。

sprite的博客 954

Android 图片相关处理库ImageLoader、Picasso、PhotoView、GifView

Universal-ImageLoader: 在Android图片处理中需要考虑的问题很多,例如OOM、图片缓存和网络图片加载、多线程问题及图片压缩处理等复杂的问题,ImageLoader和Picasso为我们解决了这些问题。 优点: 支持本地图片和网络图片的多线程异步加载和缓存处理; 个性化的配置自己项目的ImageLoader; 图片加载过程的监听回调; 自动对加载的图片针对当前剩余内存进

changchou 683

极智AI | 算能SC5+智算卡驱动安装与升级

大家好,我是极智视界,本文介绍一下 算能SC5+智算卡驱动安装与升级

极智视界 1277

Android Studio开发GIF动画工具的内存优化与实时预览技术

GIF动画作为轻量级动态图像格式,在移动端应用中广泛使用。其核心原理是通过连续帧快速切换实现动画效果,关键技术包括帧间差分压缩和LZW编码算法。在Android平台开发GIF处理工具时,内存优化和实时预览是两大技术难点。通过Glide库优化缓存策略、采用双缓冲队列机制,能有效解决多帧大图的内存管理问题。TextureView结合预渲染技术的应用,显著提升了低端设备上的预览流畅度。这些优化方案不仅适用于GIF工具开发,也为移动端图像处理类应用提供了通用性能优化思路,特别是在社交媒体内容创作、电商动态展示等场景

weixin_33377602的博客 230

VMware16虚拟机:下载和安装教程

VMware16 虚拟机 下载和安装教程

MQ0522的博客 20万+

华为od统一考试B卷【单词搜索】C++ 实现

找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。假设给定单词 HELLOWORD,在矩阵中只要能找到 H->E->L->L->O->W->O->R->L->D连成的单词,就算通过。意区分英文字母大小写,并且您只能上下左右行走,不能走回头路。

MISAYAONE的博客 711

Fresco:Facebook 出品的 Android 图片加载库,1.7 万 Star 不是白来的

Fresco是Facebook推出的Android图片加载库,主要解决图片加载中的性能问题,如列表卡顿、内存溢出和大图加载缓慢等。其核心优势包括独特的内存管理机制、渐进式JPEG加载、动图支持和高度可定制性。相比Glide和Coil,Fresco在低端机兼容性和功能覆盖面上表现更优,但包体积较大且API设计偏Java风格。适合图片密集型应用,特别是需要支持低端设备的场景。已在Facebook和Instagram等应用中验证其稳定性,1.7万Star体现了其广泛认可。

suanfaling516的博客 183

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pictureselector 压缩_多图选择器 – PictureSelectorLight

PictureSelectorLight 无裁剪功能版最近项目中用到多图选择上传的需求,考虑到android机型众多问题就自己花时间写了一个,测试了大概60款机型,出现过一些问题也都一一修复了,基本上稳定了特分享出来,界面UI也是商用级的开发者不用在做太多修改了,界面高度自定义,可以设置符合你项目主色调的风格,集成完成后就可以拿来用。项目会一直维护,发现问题欢迎提出会第一时间修复,QQ交流群 61...

weixin_28677005的博客 456

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

告别卡顿与OOM:2025年android-gif-drawable重大更新让GIF播放如丝般顺滑

你是否还在为Android应用中的GIF动画卡顿、内存溢出(OOM)或兼容性问题头疼?2025年android-gif-drawable最新版本带来了革命性优化,从底层渲染到API设计全面升级。本文将深入解析三大核心改进:16KB大页面支持解决Android 15兼容性问题、NDK 26与Java 21构建体系带来的性能飞跃、以及全新的内存管理机制,帮你彻底解决GIF播放痛点。 ## 一、And

gitblog_00675的博客 1080

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

安卓应用开发中 OOM(内存溢出)问题详解及解决方案

摘要:安卓应用OOM问题分析与解决方案 本文深入分析了Android开发中常见的OOM(内存溢出)问题,特别是由Bitmap处理不当引发的情况。文章首先描述了OOM的典型现象,如应用崩溃、内存持续上升等,然后详细剖析了五大成因:Bitmap内存计算方式、大图加载、未及时回收、缓存过多以及内存泄漏。针对这些问题,提出了六种解决方案:使用专业图片加载库(如Glide)、图片缩放加载、合理配置LruCache缓存、及时回收Bitmap、inBitmap内存复用技术,以及监听内存变化及时释放资源。这些方法从预防到治

深山技术宅的博客 1609

android gif 卡顿,Android SketchImageView 加载Gif图片,解决界面不流畅卡顿问题

遇到的问题列表加载gif图片,用Fresco,Glide,android-gif-drawable等都能实现简单的单个Gif图片的加载,如果在列表上加载图片,不做内存优化处理,那么OOM就会黏着你,对于项目比较紧急,时间有限的童鞋来说,优化无疑是雪上加霜,SO,那么给大家推荐一个简单加载Gif图片的控件,超级好用! 简介Sketch 是 Android 上一个强大且全面的图片加载器,支持 GIF,...

weixin_30546683的博客 1407
上一篇: GitHub 优秀的 Android 开源项目(二)
下一篇: android绘制图表(用GraphView实现)
ckdroid
博客等级 码龄12年 10粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值