使用ImageIO创建动画GIF?

Nei*_*fey 23 java animated-gif javax.imageio

有没有人设法说服ImageIO写一个动画GIF,特别是设置正确的元数据?我的第一次尝试大致如下(其中b1和b2是BufferedImages):

ImageTypeSpecifier spec = new ImageTypeSpecifier(b1);
ImageWriter wr = ImageIO.getImageWriters(spec, "GIF").next();
wr.setOutput(ImageIO.createImageOutputStream(new File("C:\\Flashing.gif")));
ImageWriteParam param = wr.getDefaultWriteParam();
IIOMetadata meta = wr.getDefaultImageMetadata(spec, param);
wr.prepareWriteSequence(meta);
wr.writeToSequence(new IIOImage(b1, null, null), param);
wr.writeToSequence(new IIOImage(b2, null, null), param);
Run Code Online (Sandbox Code Playgroud)

这似乎几乎可行,但是:

  • 我显然需要以某种方式设置"适当的"元数据来设置图像之间的时间并理想地使它们循环(我天真地希望默认会做一些明智的事情,但是嘿......)
  • 默认情况下,它所写的任何元数据显然不是很正确:GIMP在加载文件时会给出一些错误消息,尽管在Firefox的测试网页中嵌入图像确实可以非常快速地连续显示这两个图像.接近我想要的......

如果有人从ImageIO编写动画GIF,可以分享工作代码片段或如何解决上述问题,我们将不胜感激!

Ell*_*roo 30

我遇到了这个问题,并决定尝试一下; 花了很少但非平凡的数量来创建一个可用的类(感谢ax) - 所以我想我可能会共享代码: 是一个小类,用于从许多其他图像创建动画gif图像.

  • 此外,如果您发现透明颜色处理不当(当您编写透明颜色时,前一帧中的像素保留自身),您需要这样做:找到一行`graphicsControlExtensionNode.setAttribute("disposalMethod"," none");`并将`"none"改为`"restoreToBackgroundColor"` (3认同)