为什么我从 servlet 发送的 gif 图像没有动画?

Why is my gif image sent from servlet not animating?

我的 servlet 中有以下代码

 response.setContentType("image/gif");
 String filepath = "PATH//TO//GIF.gif";
 OutputStream out = response.getOutputStream();
 File f = new File(filepath);
 BufferedImage bi = ImageIO.read(f);
 ImageIO.write(bi, "gif", out);
 out.close();

此代码仅返回图像的第一帧。

如何实现返回完整的GIF图片?

您的 GIF 没有动画,因为您只向客户端发送第一帧。 :-)

实际上,你是,因为 ImageIO.read 只读取第一帧(而 BufferedImage 只能包含一个 frame/image)。然后您将该单帧写入 servlet 输出流,结果将不会动画化(应该可以使用 ImageIO 创建动画 GIF,但这样做的代码会非常冗长,请参阅 How to encode an animated GIF in Java, using ImageWriter and ImageIO? and Creating animated GIF with ImageIO?).

好消息是,解决方案既简单又能为您节省 CPU 个周期。如果您只想发送存储在磁盘上的动画 GIF,则无需在此处涉及 ImageIO。同样的技术可以用来发送任何二进制内容,真的。

相反,只需执行:

response.setContentType("image/gif");
String filepath = "PATH//TO//GIF.gif";
OutputStream out = response.getOutputStream();

InputStream in = new FileInputStream(new File(filepath));
try {
    FileUtils.copy(in, out);
finally {
    in.close();
}

out.close();

FileUtils.copy可以实现为:

public void copy(final InputStream in, final OutputStream out) {
    byte[] buffer = new byte[1024]; 
    int count;

    while ((count = in.read(buffer)) != -1) {
        out.write(buffer, 0, count);
    }

    // Flush out stream, to write any remaining buffered data
    out.flush();
}