【问题标题】:Why is my gif image sent from servlet not animating?为什么我从 servlet 发送的 gif 图像没有动画?
【发布时间】:2015-05-14 08:55:33
【问题描述】:

我的 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图片?

【问题讨论】:

    标签: java image gif bufferedimage javax.imageio


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 2015-07-03
      相关资源
      最近更新 更多