Ваш GIF не оживляет, потому что вы отправляете клиенту только первый кадр. :-)
Фактически, вы, потому что ImageIO.read
читает только первый кадр (и BufferedImage
может содержать только один кадр/изображение). Затем вы записываете этот единственный кадр в выходной поток сервлета, и результат не будет анимировать (можно создать анимационные GIF-файлы, используя ImageIO
, но код для этого будет достаточно подробным, см. How to encode an animated GIF in Java, using ImageWriter and ImageIO? и Creating animated GIF with ImageIO?).
Хорошей новостью является то, что решение является простым и экономит ваши циклы 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();
}