[英]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.