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

时间:2016-07-03 09:12:41

标签: java bufferedimage java-io animated-gif javax.imageio

我正在从互联网网址上阅读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);

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

我已经查看了许多堆栈溢出问题/答案,但我无法解决这个问题。他们中的大多数都是按BufferedImage逐帧进行,这会改变帧速率。我不想要更改源图像。我想下载它,因为它具有相同的大小,相同的分辨率和相同的帧速率。

请注意我希望避免尽可能多地使用streamsunofficial-libraries (如果没有他们就无法完成,我将使用它们。)

如果有ImageIO的替代方式或我从网址上读取图片的方式,并且完成了这件事,请指出我的方向。

1 个答案:

答案 0 :(得分:2)

无需解码图像然后重新编码。

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

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