android - 将 GIF 分割成帧

标签 android

在这里尝试在 Android 上播放动画 GIF(参见 Android: How do a display a large animated gif given a url?)。这一点都不顺利。在 Android 1.5 上,Movie.decodeStream()/decodeFile() 返回 null。在 Android 1.6 上,使用我得到的 GIF 文件,它返回一个零大小且持续时间为零的电影 - 显然是不够的。

引用的问题建议将 GIF 拆分为帧(然后渲染这些帧)。请问我究竟该如何做到这一点?

编辑:尝试在 Windows 中使用 GNU giflib 打开我的一张 GIF。它在第一帧就窒息了。 GIF 本身没问题,所有浏览器(Android 除外)都可以很好地显示和动画化它。

EDIT2:使用 giflib 4.1.4。不确定 4.1.6 中有什么问题,但你去吧。下一步:通过 NDK 为 Android 构建 giflib,以某种方式与 Bitmap 类集成。

EDIT3:它是 giflib。结合 Bitmap.copyPixelsFromBuffer。颜色现在都歪了,但基本设计似乎可行。

最佳答案

编辑:我已将我的项目迁移到 Google GifFileDecoder ,略有修补。遗留解决方案中的 MovieView 类大部分保持不变,但 GIF 解析逻辑在 Java 中。

几个兴趣点: GifFileDecoder 进行自己的循环。如果动画是循环的,你执行 readFrame() 直到没有更多的帧,这个循环将是无限的;解码器有自己的环绕逻辑。另外,readFrame() 返回的缓冲区会被一遍又一遍地重复使用,所以不要按原样存储 readFrame 的结果,下次调用 readFrame 时它会被覆盖。而是制作一个深拷贝。此外,解码器假定从文件中读取,但可以简单地修改为从任何其他流中读取,从而牺牲循环逻辑。

这是 10 年前的答案,为了旧时的缘故:

giflib 4.1.4 和 NDK。您必须手动解析 GIF 中的调色板颜色以匹配 Android 的 ARGBxxxx 格式之一,然后通过 copyPixelsFromBuffer() 将像素数组传递给 Bitmap 对象。如果你想要透明度和/或动画,你必须通过扩展 block 并寻找代码为 0xf9 的那个。

在这里分享了我的代码和指导:http://rathertech.blogspot.com/2014/04/splitting-gif-into-frames-on-android.html

关于android - 将 GIF 分割成帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3312699/

相关文章:

java - 从适配器类获取不同 Activity 中的 EditText 值

android - Android 中的设备锁定

java - 是否有相当于 VB6 Strconv 的 Java(Android)

Android 网络提供商,需要互联网吗?

java - Android - 更新大量 TextView

Java 监听器,用于将数据从我的手机发送到 java 应用程序

android - 有机会一起使用 holoeverywhere 和 appcompat 吗?

android - RecyclerView 通用适配器

Android运行在什么JAVA SDK版本上

Android:将标题 View 添加到 ExpandableListView 时出现 ClassCastException