gpt4 book ai didi

java - 动画 Gif 帧到 BufferedImages 数组

转载 作者:行者123 更新时间:2023-12-02 04:25:22 26 4
gpt4 key购买 nike

我正在尝试将 gif 动画的所有帧提取到缓冲图像数组中。我一直在读Convert each animated GIF frame to a separate 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 的新实例每次迭代。

关于java - 动画 Gif 帧到 BufferedImages 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32259121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com