将存储在 BufferedImage 中的动画 gif 写入 java.io.File 对象

Write animated-gif stored in BufferedImage to java.io.File Object

我正在阅读来自互联网 url 的 gif 图片。

// URL of a sample animated gif, needs to be wrapped in try-catch block
URL imageUrl = new Url("http://4.bp.blogspot.com/-CTUfMbxRZWg/URi_3Sp-vKI/AAAAAAAAAa4/a2n_9dUd2Hg/s1600/Kei_Run.gif");

// reads the image from url and stores in BufferedImage object.
BufferedImage bImage = ImageIO.read(imageUrl);

// creates a new `java.io.File` object with image name
File imageFile = new File("download.gif");

// ImageIO writes BufferedImage into File Object
ImageIO.write(bImage, "gif", imageFile);

代码执行成功。但是,保存的图像不像源图像那样具有动画效果。

查看了许多堆栈溢出questions/answers,但我无法解决这个问题。他们中的大多数人通过 BufferedImage 逐帧改变帧率来做到这一点。我不想更改源图像。我想下载它,因为它具有相同的大小、相同的分辨率和相同的帧速率。

请记住,我想尽可能避免使用 streamsunofficial-libraries(如果没有它们,我会使用它们)。

如果有 ImageIO 的替代方法或我从 url 读取图像的方式并且它完成了工作,请指出那个方向。

不需要解码图像然后重新编码。

只需读取图像的字节,并将字节按原样写入文件:

try (InputStream in = imageUrl.openStream()) {
    Files.copy(in, new File("download.gif").toPath());
}