Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么从servlet发送的gif图像没有动画?_Java_Image_Gif_Bufferedimage_Javax.imageio - Fatal编程技术网

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

Java 为什么从servlet发送的gif图像没有动画?,java,image,gif,bufferedimage,javax.imageio,Java,Image,Gif,Bufferedimage,Javax.imageio,我的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.clo

我的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,但这样做的代码将非常冗长,请参见和)

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