为了账号安全,请及时绑定邮箱和手机立即绑定

使用GifSequenceWriter将BufferedImages的ArrayList转换为GIF

使用GifSequenceWriter将BufferedImages的ArrayList转换为GIF

回首忆惘然 2021-04-30 12:43:46
我正在尝试为隐写术项目隐藏.gif内的消息。我已经将输入的gif转换为BufferedImages的ArrayList并应用了隐写算法。但是,我遇到了将BufferedImages的ArrayList转换回.gif的问题。在从原始gif图像元数据获取帧之间的原始延迟之后,我使用了GifSequenceWriter类将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 。有没有更好的方法来在Java中创建.gifs?提前致谢。
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

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

有问题的行GifSequenceWriter

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

而是,元数据应基于图像索引颜色模型中的调色板。但是,好消息是,没有它,它会很好地工作。

您可以简单地使用:

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

...作者将根据您的实际图像数据自动创建调色板。

//img1.sycdn.imooc.com//609b355d000182ed05000500.jpg

也可以修复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);


查看完整回答
反对 回复 2021-05-12
  • 1 回答
  • 0 关注
  • 319 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信