为什么我从 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();
}
我的 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();
}