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

我的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只能包含一个帧/图像)。 然后,您将该单帧写入servlet输出流,结果将不会生成动画(应该可以使用ImageIO创建动画GIF,但执行此操作的代码将非常详细,请参阅如何编码GIF中的动画GIF) Java,使用ImageWriter和ImageIO?并使用ImageIO 创建动画GIF? )。

好消息是,解决方案既简单又可以节省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(); }