我正在开发 AppEngine 应用程序。它的功能之一是将动画 .gif 图像分割成单独的帧。我进行了很多搜索以找到如何做到这一点的方法,最后找到了解决方案。不幸的是,该解决方案基于ImageReader
,我无法在服务器上使用它,因为:
Google App Engine 的 Java 运行时环境不支持 javax.imageio.ImageReader
没有这个类,还有其他方法可以解码 GIF 图像吗?
我正在开发 AppEngine 应用程序。它的功能之一是将动画 .gif 图像分割成单独的帧。我进行了很多搜索以找到如何做到这一点的方法,最后找到了解决方案。不幸的是,该解决方案基于ImageReader
,我无法在服务器上使用它,因为:
Google App Engine 的 Java 运行时环境不支持 javax.imageio.ImageReader
没有这个类,还有其他方法可以解码 GIF 图像吗?
首先是关于框架本身的一些事情。将动画 .gif 图像拆分为单独的帧有两个含义。1) 从字面上看,帧是动画 GIF 意义上的帧。问题是构成动画 GIF 图像的帧是相关的。动画 GIF 的处理方法决定了在绘制当前帧时如何处理前一帧。你可以覆盖它;在绘制新框架之前填充背景颜色,或者您可以在绘制新框架之前执行任何您认为合适的操作。如果您认为上述情况很复杂,那么框架的透明度呢?绘制每一帧的逻辑位置?
如果我们沿着这条路走,就不需要使用专用的ImageReader,只需读取图像的相关部分并复制每一帧数据,将其与标题和调色板一起保存。结果是:生成的图像可能看起来很奇怪且毫无意义。看下面的例子:
第一帧
第二帧
和原来的
你可以看到第二帧看起来不太好。事实是,第二帧是建立在第一帧之上的透明帧(此动画 GIF 仅包含 2 帧)。您应该看透第二帧,并且它们会制作动画。
现在让我们看看将动画 .gif 图像分割成单独的帧的第二个含义。2)在这种情况下,帧实际上是一个合成的,它建立在前面的帧上,这就是我们在查看动画 GIF 时看到的。为了实现这一点,我们必须考虑到帧循环的历史、每个帧的逻辑位置以及帧本身的透明度。
让我们看看我们现在得到了什么:
第一帧
第二帧
现在第一帧与第一种情况相同,但第二帧构建在第一帧之上,不再透明。
在第二种情况下,我们必须对帧进行解码和编码才能达到预期的效果。除了看起来不错,另一个好处是您可以将生成的图像保存为编码器支持的任何格式。
本文中的示例由iCafe的 GIF 相关部分生成