将GIF拆分成帧

Sev*_*yev 14 android

试图在Android上播放动画GIF(请参阅Android:如何显示给定网址的大型动画GIF?).这不过是顺利的.在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结合使用.颜色现在都是歪斜的,但基本设计似乎可行.

Sev*_*yev 2

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

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

看在旧时光的份上,这是 10 年前的答案:

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

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