将GIF分解为帧

14

这里尝试在Android上播放动画GIF(请参见Android: How do a display a large animated gif given a url?)。但效果并不流畅。在Android 1.5上,Movie.decodeStream() / decodeFile()返回null。在我拥有的GIF文件中,Android 1.6返回的电影大小为零,持续时间为零 - 显然是不足够的。

所引用的问题建议将GIF分成帧(然后呈现这些帧)。请问我该如何做到这一点?

编辑:尝试在Windows中使用GNU giflib打开我的GIF之一。它在第一帧上就卡住了。 GIF本身是正确的,所有浏览器(保存Android的)都可以正确显示和动画化。

编辑2:使用giflib 4.1.4成功。不确定4.1.6中有什么问题,但是让我们继续。下一步:通过NDK为Android构建giflib,以某种方式与Bitmap类集成。

编辑3:Giflib已经准备好了。与Bitmap.copyPixelsFromBuffer一起使用。颜色现在都错了,但基本设计似乎可行。

1个回答

2

编辑:我已经将我的项目迁移到Google GifFileDecoder,稍作修改。遗留解决方案中的MovieView类基本保持不变,但是GIF解析逻辑在Java中。

一些值得注意的点: GifFileDecoder自己进行循环。如果动画被循环并且您执行readFrame()直到没有更多帧,那么这个循环将是无限的;解码器有自己的环绕逻辑。此外,readFrame()返回的缓冲区将被反复重用,因此不要将readFrame的结果存储为它本身,下次调用readFrame时,它将被覆盖。请改为进行深度复制。此外,解码器假定从文件读取,但可以轻松修改以从任何其他流中读取,牺牲循环逻辑。

以下是10年前的答案,仅供怀旧之用:

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

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


你有示例代码吗?如果有,请发布它。 - android developer
这段内容相对较长,我可以通过电子邮件发送。 - Seva Alekseyev
也许你可以在PasteBin上发布,或者使用GitHub或其他地方? - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接