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