【问题标题】:Java: get frames from animated GIF without ImageReaderJava:从没有 ImageReader 的动画 GIF 中获取帧
【发布时间】:2015-10-22 07:02:56
【问题描述】:

我正在开发 AppEngine 应用程序。它的功能之一是将动画 .gif 图像分割成单独的帧。我进行了很多搜索以找到如何做到这一点的方法,最后找到了解决方案。不幸的是,该解决方案基于ImageReader,我无法在服务器上使用它,因为:

Google App Engine 的 Java 不支持 javax.imageio.ImageReader 运行环境

有没有其他方法可以在没有这个类的情况下解码 GIF 图像?

【问题讨论】:

  • 嗯,你谷歌“java gif decode”了吗?
  • 是的,我做到了。前几个链接是关于 Gif4J 库的,但是这个库是非免费的。在其他链接中,我找到了 ImageReader 的解决方案,正如我在问题中提到的那样,它对我不起作用。

标签: java decode animated-gif


【解决方案1】:

首先是关于框架本身的一些事情。将动画 .gif 图像拆分为单独的帧有两个含义。 1) 从字面上看,帧是动画 GIF 意义上的帧。问题是构成动画 GIF 图像的帧是相关的。动画 GIF 的处理方法决定了在绘制当前帧时如何处理前一帧。你可以覆盖它;在绘制新框架之前填充背景颜色,或者您可以在绘制新框架之前执行任何您认为合适的操作。如果您认为上述情况很复杂,那么框架的透明度呢?绘制每一帧的逻辑位置?

如果我们沿着这条路走,就不需要使用专用的ImageReader,只需读取图像的相关部分并复制每一帧数据,将其与标题和调色板一起保存。结果是:生成的图像可能看起来很奇怪且毫无意义。看下面的例子:

第一帧

第二帧

还有原来的

您可以看到第二帧看起来不太好。事实是,第二帧是建立在第一帧之上的透明帧(此动画 GIF 仅包含 2 帧)。您应该看透第二帧,它们会制作动画。

现在让我们看看将动画 .gif 图像分割成单独的帧的第二个含义。 2)在这种情况下,帧实际上是一个合成的,它建立在前面的帧上,这就是我们在查看动画 GIF 时看到的。为了实现这一点,我们必须影响帧循环的历史、每一帧的逻辑位置以及帧本身的透明度。

让我们看看我们现在得到了什么:

第一帧

第二帧

现在第一个框架与第一种情况相同,但第二个框架是在第一个框架之上构建的,它不再是透明的。

在第二种情况下,我们必须对帧进行解码和编码才能达到预期的效果。除了看起来不错,另一个好处是您可以将生成的图像保存为编码器支持的任何格式。

本帖示例由iCafe的GIF相关部分生成

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2015-01-04
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多