有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想把一条信息藏在一个盒子里。gif用于隐写术项目。 我已经将输入的gif转换成了一个BuffereImage的数组列表,并应用了我的隐写算法。 但是,我在将BuffereImage的ArrayList转换回。gif。 我使用这个GifSequenceWriter类将BuffereImage数组转换为新的。gif从原始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帧以及结果。gifhere

有没有更好的方法来创造。java中的GIF? 提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    当使用调色板图像(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);