簡體   English   中英

使用GifSequenceWriter將BufferedImages的ArrayList轉換為GIF的問題-Java

[英]Issue with converting an ArrayList of BufferedImages to a GIF using GifSequenceWriter - Java

我正在嘗試為隱寫術項目隱藏.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? 提前致謝。

使用調色板圖像時, GifSequenceWriter存在問題(帶有IndexColorModel BufferedImage.TYPE_BYTE_INDEXED )。 這將基於默認的216調色板網絡安全調色板 )創建元數據,該調色板與圖像中的顏色明顯不同。

GifSequenceWriter有問題的行:

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

而是,元數據應基於圖像索引顏色模型中的調色板。 但是,好消息是,沒有它,它會很好地工作。

您可以簡單地使用:

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

...作者將根據您的實際圖像數據自動創建調色板。

使用上面的代碼創建的動畫GIF


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM