簡體   English   中英

動畫Gif幀到BufferedImages數組

[英]Animated Gif Frames To Array of BufferedImages

我正在嘗試將動畫gif的所有幀提取到bufferedimages數組中。 我一直在閱讀將每個GIF動畫幀轉換為單獨的BufferedImage ,將每個幀寫入單獨的文件非常容易。 但是,當我嘗試用框架填充ArrayList而不是編寫它們時,出現了我的問題。 ArrayList中的每個圖像只是gif的最后一幀。

為了更加清楚,此代碼將編寫每個框架以完美地分隔文件:

    ArrayList<BufferedImage> frames = new ArrayList<BufferedImage>();
    BufferedImage master = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB);

    ImageReader ir = new GIFImageReader(new GIFImageReaderSpi());
    ir.setInput(ImageIO.createImageInputStream(gif));
    for (int i = 0; i < ir.getNumImages(true); i++)
    {
        master.getGraphics().drawImage(ir.read(i), 0, 0, null);
        ImageIO.write(master, "gif", new File(dirGifs + "/frames" + i + ".gif"));
    }

但是,這段代碼只會給我一個充滿同一幀的ArrayList(是gif的最后一幀)

    ArrayList<BufferedImage> frames = new ArrayList<BufferedImage>();
    BufferedImage master = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB);

    ImageReader ir = new GIFImageReader(new GIFImageReaderSpi());
    ir.setInput(ImageIO.createImageInputStream(gif));
    for (int i = 0; i < ir.getNumImages(true); i++)
    {
        master.getGraphics().drawImage(ir.read(i), 0, 0, null);
        frames.add(master);
    }

我以為那是因為我之后沒有處理圖形,但是我嘗試創建圖形對象並進行處理,因此沒有任何變化。 需要幫忙!

這是因為BufferedImage master是作為引用而不是副本存儲在ArrayList中的。 因此,ArrayList的每個元素都指向相同的BufferedImage。 我認為解決此問題的最簡單方法是將BufferedImage master = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB); 在for循環中,因此每次迭代都會創建BufferedImage的新實例。

Colouredmirrorball指出,我可以通過創建bufferedimage的新實例來解決此問題。 因此,我首先為每個數組元素創建了一個新實例,然后將元素的數據設置為與主映像相同。 以下代碼為我提供了從動畫gif文件中提取的一系列幀。

public ArrayList<BufferedImage> getFrames(File gif) throws IOException {
    ArrayList<BufferedImage> frames = new ArrayList<BufferedImage>();
    BufferedImage master = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB);

    ImageReader ir = new GIFImageReader(new GIFImageReaderSpi());
    ir.setInput(ImageIO.createImageInputStream(gif));
    for (int i = 0; i < ir.getNumImages(true); i++) {
        frames.add(new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB));
        master.getGraphics().drawImage(ir.read(i), 0, 0, null);
        frames.get(i).setData(master.getData());
    }
    return frames;
}

暫無
暫無

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

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