gpt4 book ai didi

java - 使用 GifSequenceWriter 将 BufferedImages 的 ArrayList 转换为 GIF 时出现问题 - Java

转载 作者:行者123 更新时间:2023-11-30 06:06:42 26 4
gpt4 key购买 nike

我正在尝试将消息隐藏在隐写术项目的 .gif 中。我已将输入 gif 转换为 BufferedImages 的 ArrayList,并应用了我的隐写算法。但是,我在将 BufferedImages 的 ArrayList 转换回 .gif 时遇到了问题。我用过这个GifSequenceWriter从原始 gif 图像元数据获取帧之间的原始延迟后,该类将 BufferedImages 数组转换为新的 .gif。

  File encoded_img = new File("output.gif");
ImageOutputStream output = new FileImageOutputStream(encoded_img);
GifSequenceWriter writer = new GifSequenceWriter(output, frames.get(0).getType(), delayTimeMS, true);
writer.writeToSequence(frames.get(0));
for(int k=1; k<frames.size()-1; k++) {
writer.writeToSequence(frames.get(k));
}
writer.close();
output.close();

但是,生成的 .gif 看起来非常糟糕,我已经保存了使用和不使用隐写算法的各个帧,它们看起来都很好。您可以查看原始图像、保存的 10 个帧和生成的 .gif here 的示例。 .

有没有更好的方法在 java 中创建 .gif?提前致谢。

最佳答案

使用调色板图像(BufferedImage.TYPE_BYTE_INDEXEDIndexColorModel)时,GifSequenceWriter 存在问题。这将基于默认 216 调色板( web safe palette )创建元数据,这与图像中的颜色明显不同。

GifSequenceWriter 中有问题的行:

ImageTypeSpecifier imageTypeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(imageType);
imageMetaData = gifWriter.getDefaultImageMetadata(imageTypeSpecifier, imageWriteParam);

相反,元数据应基于图像索引颜色模型中的调色板。但好消息是,没有它它也能正常工作。

您可以简单地使用:

GifSequenceWriter writer = new GifSequenceWriter(output, BufferedImage.TYPE_INT_ARGB, delayTimeMS, true);

...编写器将根据您的实际图像数据自动创建调色板。

The animated GIF created with the code above

<小时/>

也可以修复 GifSequenceWriter,以接受 ImageTypeSpecifier 而不是 int imageType,但是,这仅在以下情况下才有效:我认为框架使用相同的调色板:

public GifSequenceWriter(
ImageOutputStream outputStream,
ImageTypeSpecifier imageTypeSpecifier,
int timeBetweenFramesMS,
boolean loopContinuously) throws IIOException, IOException {
// my method to create a writer
gifWriter = getWriter();
imageWriteParam = gifWriter.getDefaultWriteParam();

imageMetaData = gifWriter.getDefaultImageMetadata(imageTypeSpecifier, imageWriteParam);

// ... rest of the method unchanged.

用法:

ColorModel cm = firstImage.getColorModel();
ImageTypeSpecifier imageType = new ImageTypeSpecifier(cm, cm.createCompatibleSampleModel(1, 1));
GifSequenceWriter writer = new GifSequenceWriter(output, imageType, delayTimeMS, true);

关于java - 使用 GifSequenceWriter 将 BufferedImages 的 ArrayList 转换为 GIF 时出现问题 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51163881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com