【问题标题】:Split GIF into frames将 GIF 分割成帧
【发布时间】:2020-03-26 04:50:33
【问题描述】:

在此处尝试在 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 结合使用。现在颜色都歪了,但基本的设计似乎可行。

【问题讨论】:

    标签: android


    【解决方案1】:

    编辑:我已将我的项目迁移到 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

    【讨论】:

    • 你有示例代码吗?如果是,请发布。
    • 相当长。我可以发电子邮件。
    • 也许您可以在 pasteBin 上发帖,或者使用 gitHub 或其他地方发帖?
    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2016-01-11
    • 2021-11-28
    • 2017-02-18
    • 2012-06-23
    • 2015-07-04
    相关资源
    最近更新 更多