Java gif帧到BuffereImage,而不将所有帧作为数组保存

Java gif帧到BuffereImage,而不将所有帧作为数组保存,java,gif,bufferedimage,animated-gif,Java,Gif,Bufferedimage,Animated Gif,所以我试了很多次,但都没能成功。我有一个程序,将动画GIF转换成一系列PNG,带有一系列可配置的设置 问题是,我能找到的唯一方法是能够将GIF帧作为缓冲图像读取并重用ImageReader,这涉及制作一个数组或某种类型的列表来存储所有帧。这非常方便,但是对于长的、高分辨率的文件,这会占用大量ram。理想情况下,我希望一次读一本,并在完成框架后将其处理掉。我曾试图研究压缩GIF是如何工作的,但事实证明,处理GIF的方式有点让我不知所措。我曾经尝试过两种基本的方法,但都失败了 public Buff

所以我试了很多次,但都没能成功。我有一个程序,将动画GIF转换成一系列PNG,带有一系列可配置的设置


问题是,我能找到的唯一方法是能够将GIF帧作为缓冲图像读取并重用ImageReader,这涉及制作一个数组或某种类型的列表来存储所有帧。这非常方便,但是对于长的、高分辨率的文件,这会占用大量ram。理想情况下,我希望一次读一本,并在完成框架后将其处理掉。我曾试图研究压缩GIF是如何工作的,但事实证明,处理GIF的方式有点让我不知所措。我曾经尝试过两种基本的方法,但都失败了

public BufferedImage getNextFrame() 
返回未压缩的完整下一帧,以及

public void reset()
将索引重置为0。我意识到,如果不将每个帧存储为数组或列表的索引,就不可能高效地跳转到任意帧


当我打算更多地使用框架而不是简单地显示它们时,有人能给我一些关于如何以资源高效的方式管理GIF的建议吗?我不是要你把整件事都写下来,只是告诉我怎么做

我自己没办法弄明白,但我确实找到了办法。看着代码,我甚至都没能自己弄明白

如果您不介意使用第三方代码,我制作了一个Java图像库,它可以做的远不止抓取动画GIF的每一帧

也就是说,有一个名为FrameReader的特定类,它的目的正是实现您想要的功能:一次抓取一个GIF帧。以下示例显示了如何使用它:

import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.InputStream;

import com.icafe4j.image.gif.FrameReader;
import com.icafe4j.image.gif.GIFFrame;


public class GrabFrame {

    public static void main(String[] args) throws Exception {
        InputStream is = new FileInputStream(args[0]);
        FrameReader reader = new FrameReader();
        BufferedImage curFrame = null;

        GIFFrame gifFrame = reader.getGIFFrameEx(is);

        while(gifFrame != null) {
            curFrame = gifFrame.getFrame();
            // Do something with curFrame
            gifFrame = reader.getGIFFrameEx(is);
        }       
    }
}

方法getGIFFrameExis返回一个GIFFrame实例,该实例在其他帧控制参数中包装一个BuffereImage,该BuffereImage考虑了动画GIF图形控制块使用的不同处理方法。如果您不关心处理方法,那么可以调用getGIFFrameis,它也包装了一个BuffereImage,但不考虑不同帧之间的关系。这可能会像前面提到的那样产生奇怪的帧。

理想情况下,我希望一次读一个,并在完成帧处理后将其处理掉。为什么这是一个问题?我假设这与删除对BuffereImage的引用一样简单,即将其赋值为null。注意:这可能没那么容易,但我只是不清楚,为什么不是。如果你能澄清问题并增加更多细节,这会有所帮助。:-压缩GIF使用前一帧的信息生成下一帧的图像。我正在努力寻找一种方法来跟踪我需要的过去的帧,我真的不习惯这样直接处理文件。我根据问题的第三个答案构建了我的原始类。我试着将for循环中的一部分转换成一种方法,显然只是做了一些结构上的改变,但效果并不理想。