当前位置: 首页 > 面试题库 >

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

翟嘉祥
2023-03-14
问题内容

我的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仅读取第一帧(并且a
BufferedImage只能包含单个帧/图像)。然后,您将该单个帧写入servlet输出流,并且结果将不进行动画处理(应该可以使用来创建动画GIF
ImageIO,但是这样做的代码将非常冗长,请参阅如何在Java中对动画GIF进行编码,使用ImageWriter和ImageIO?以及使用ImageIO?创建动画GIF)。

好消息是,该解决方案既简单,又可以节省CPU周期。ImageIO如果您只想发送存储在磁盘上的GIF动画,则无需参与其中。实际上,可以使用相同的技术来发送任何二进制内容。

相反,只需执行以下操作:

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发送电子邮件。也不例外,但是我的帐户中没有收到电子邮件。我正在使用以下代码: } 我现在收到以下异常: 谁能告诉我为什么我没有收到电子邮件以及此代码有什么问题。提前致谢 问题答案: 阅读https://developers.google.com/appengine/docs/java/mail/overview 基本上停止在您的应用程序中包含任何JavaMai

  • 首先,我看了这里所有其他类似的帖子,但没有一个能帮上忙。我正在写一个扫雷游戏,我试图在JFrame的边界布局顶部放置一个Jlabel,并让它显示一个计数器,指示还有多少地雷需要标记。每当单击网格上的任何其他JLabel时,都需要重新绘制它。首先,对于我的代码,我的标题JLabel上从来没有显示任何文本。让文本显示的唯一方法是将其放入我的JLabel构造函数中。这让我觉得我的paintCompone

  • 在我的应用程序中,我需要从相机加载图像。 这是我使用的代码: 但是如果我从图库中加载图片,它可以正常工作。 这里有什么错误?谢啦

  • 我有基于的图像,当这些(我的)图像生成时,被下拉,以便生成我自己的图像。因此,在我的本地计算机中,我有映像。假设基映像得到更新,Microsoft发现该映像中有一个bug,并决定对该标记进行修复,因此它仍然被称为,但实际上它与我构建自己的映像时不同。 所以我有两个问题: 1。每次我的图像被拉下,它会得到我建立图像时的基础图像,对吗?(这似乎很明显,但我需要检查) 2。如果我注意到(网钩,扳机?)有

  • 我有一个通过Interface Builder定义的布局约束视图。由于它们无法暂时停用,我决定通过拨打以下电话有选择地删除它们: 但是,之后约束仍然驻留在视图中。约束。此外,我还希望以编程方式添加约束(同样,因为我无法(取消)激活它们): 对我的方法的任何调用都会导致变量wasAdded的值NO。这也反映在用户界面上,它根本没有改变。 最后,我既不能以编程方式添加约束,也不能删除添加到情节提要的约

  • 问题内容: 是否可以重新启动用作动画GIF ? 考虑以下HTML: 而这种风格: 我想在动画播放每次我的类添加时间到,不只是第一次。 我希望这可以工作: 问题在于,一旦Firefox和WebKit浏览器播放一次,它们就不会再次播放背景图像GIF动画。添加/删除班级眨眼仅在第一次时有效。 问题答案: 您可以通过重新加载动画来重播gif。这对于带宽来说并不是理想的选择,尤其是在您的图像较大的情况下,但