如何使用ImageWriter和ImageIO在Java中编码动画GIF?

Nei*_*din 1 java image gif animated-gif javax.imageio

我到处都是,但是似乎找不到任何容易理解的解释。(我发现其他Java用户编写的类和方法可以做到这一点,但我希望自己编写。)

And*_*son 5

这是GIFanimcreateImage()方法。也许那会让您开始。

public byte[] createImage() throws Exception {

    ImageWriter iw = ImageIO.getImageWritersByFormatName("gif").next();

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageOutputStream ios = ImageIO.createImageOutputStream(os);
    iw.setOutput(ios);
    iw.prepareWriteSequence(null);
    int i = 0;

    for (AnimationFrame animationFrame : frameCollection) {

        BufferedImage src = animationFrame.getImage();
        ImageWriteParam iwp = iw.getDefaultWriteParam();
        IIOMetadata metadata = iw.getDefaultImageMetadata(
            new ImageTypeSpecifier(src), iwp);

        configure(metadata, "" + animationFrame.getDelay(), i);

        IIOImage ii = new IIOImage(src, null, metadata);
        iw.writeToSequence(ii, null);
        i++;
    }

    iw.endWriteSequence();
    ios.close();
    return os.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个非常幼稚的实现,所生成的图像要比使用可压缩调色板并执行其他优化的库所生成的图像大得多。实现这样的库将是一项艰巨的任务。