2015-03-12 1 views
2

У меня есть этот следующий код в моем сервлетаПочему мое gif-изображение отправлено с сервлета, а не анимация?

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?

ответ

7

Ваш 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(); 
} 
Смежные вопросы