Java:在没有ImageReader的情况下从动画GIF中获取帧

时间:2012-06-12 21:46:55

标签: java decode animated-gif

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

  

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

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

2 个答案:

答案 0 :(得分:0)

您应该使用Images Java API。您可以找到详细信息here

答案 1 :(得分:0)

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

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

第一帧frame0

第二帧frame1

原始original

你可以看到第二帧看起来不那么好。事实上,第二帧是透明的,构建在第一帧的顶部(这个动画GIF只包含2帧)。你期望透过第二帧看到他们制作动画。

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

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

第一帧frame0

第二帧frame1

现在第一帧与第一帧相同,但第二帧构造在第一帧的顶部,并且它不再是透明的。

在第二种情况下,我们必须对帧进行解码和编码以获得所需的结果。除了看起来不错,另外一件好事是你可以用编码器支持的任何格式保存生成的图像。

本文中的示例由iCafe

的GIF相关部分生成