当前位置: 首页 > 面试题库 >

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

郤令
2023-03-14
问题内容

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


问题答案:

这是GIFanim的createImage()方法。也许那会给您一个开始。

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();
}

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



 类似资料:
  • 问题内容: 是否有人设法说服ImageIO编写动画GIF,尤其是设置正确的元数据?我的第一次尝试大致如下(其中b1和b2是BufferedImages): 这似乎几乎可以工作,但是: 我显然需要以某种方式设置“适当的”元数据来设置图像之间的时间,并理想地使它们循环(我天真地希望默认设置会做一些明智的事情,但嘿…) 它默认情况下写入的任何元数据显然都不是正确的:GIMP在加载文件时会给出一些错误消息

  • 在这段代码中,我遇到了Veracode问题: CRLF序列的不当中和(“CRLF注入”)(CWE ID 93) 在 我正在尝试使用 来解决这个问题,但我不知道 类的用法。任何人都可以简要介绍类的实现,在哪里使用,用它解决了什么?

  • 问题内容: 我已经创建了可执行的jar文件(使用Eclipse),在jar中包含一组图像(.png)文件。所以我添加了一个源文件夹,其中所有图像都位于项目的文件夹中。代码必须访问这些文件才能使用创建BufferedImage 较早前,为了获得我使用的路径 在执行jar时,它抛出错误 URI不是分层的 所以现在我正在使用 但是如何使ImageIO从Inputstream读取?我试过如下 抛出错误 I

  • 这里是我的演示:https://stackblitz.com/edit/react-pwdkse注意:使用您的浏览器控制台而不是Stackblitz的控制台。似乎浏览器控制台在信息反馈方面要完整得多 谢谢你的提示

  • 问题内容: 我目前在我的项目中使用类型,并且遇到问题。 上面的代码中的可以是或。这是类型的原因。 我知道不是。 我需要知道的是如何使它工作。 问题答案: 可编码需要知道要转换的类型。 首先,我将尝试解决不知道类型的问题,看看是否可以解决它并使它更简单。 否则,我目前认为解决您的问题的唯一方法就是使用如下所示的泛型。

  • imagewriter 是将原始磁盘映像和hybrid isos 写入到 USB 闪存盘的工具。 Linux安装 为了编译,运行 ** HAL ** % qmake DEFINES=USEHAL imagewriter.pro ** udisks1 ** % qmake DEFINES=USEUDISKS imagewriter.pro ** udisks2 ** % qmake DEFINES=