使用GifSequenceWriter将BufferedImages的ArrayList转换为GIF

我正在尝试为隐写术项目隐藏.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?提前致谢。


回首忆惘然
浏览 320回答 1
1回答

九州编程

GifSequenceWriter使用调色板图像(BufferedImage.TYPE_BYTE_INDEXED时IndexColorModel)存在的问题。这将基于默认的216调色板(网络安全调色板)创建元数据,该调色板与图像中的颜色明显不同。有问题的行GifSequenceWriter:ImageTypeSpecifier&nbsp;imageTypeSpecifier&nbsp;=&nbsp;ImageTypeSpecifier.createFromBufferedImageType(imageType); imageMetaData&nbsp;=&nbsp;gifWriter.getDefaultImageMetadata(imageTypeSpecifier,&nbsp;imageWriteParam);而是,元数据应基于图像索引颜色模型中的调色板。但是,好消息是,没有它,它会很好地工作。您可以简单地使用:GifSequenceWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;GifSequenceWriter(output,&nbsp;BufferedImage.TYPE_INT_ARGB,&nbsp;delayTimeMS,&nbsp;true);...作者将根据您的实际图像数据自动创建调色板。也可以修复GifSequenceWriter,以接受ImageTypeSpecifier而不是int imageType,但是,这仅在所有框架都使用相同的调色板时才有效,我认为:public GifSequenceWriter(&nbsp; &nbsp; &nbsp; &nbsp; ImageOutputStream outputStream,&nbsp; &nbsp; &nbsp; &nbsp; ImageTypeSpecifier imageTypeSpecifier,&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; int timeBetweenFramesMS,&nbsp; &nbsp; &nbsp; &nbsp; boolean loopContinuously) throws IIOException, IOException {&nbsp; &nbsp; // my method to create a writer&nbsp; &nbsp; gifWriter = getWriter();&nbsp; &nbsp; imageWriteParam = gifWriter.getDefaultWriteParam();&nbsp; &nbsp; imageMetaData = gifWriter.getDefaultImageMetadata(imageTypeSpecifier, imageWriteParam);&nbsp; &nbsp; // ... rest of the method unchanged.&nbsp;用法:ColorModel cm = firstImage.getColorModel();ImageTypeSpecifier imageType = new ImageTypeSpecifier(cm, cm.createCompatibleSampleModel(1, 1));GifSequenceWriter writer = new GifSequenceWriter(output, imageType, delayTimeMS, true);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java