如何使用Java的ImageIO读取GIF并保留动画?

时间:2016-03-17 07:27:25

标签: java gif javax.imageio

我正在开展一个项目,其目标是使用ImageIO读取所有图像。这似乎适用于除GIF图像之外的所有内容(显示为初始帧的静态图像)。我在Stack OverflowOracle forums上的一个帖子中看到了其他答案,但大多数都需要使用Java的File类,由于程序的SecurityManager,我无法访问它。我已经能够将GIF分解为一个Image数组并编辑元数据,但是在将所有内容拼接在一起后,我只能显示一个图像。

以下是该计划的SSCCE:

import java.awt.Image;
import java.awt.Toolkit;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GifRenderer {

  public static void main(String[] args) throws Exception {
    Image image = null;
    byte[] imageByteArray = null;

    try {
      String location = "http://i.imgur.com/Ejh5gJa.gif";
      imageByteArray = createByteArray(location);

      // This works, but I'm trying to use ImageIO
      //image = Toolkit.getDefaultToolkit().createImage(imageByteArray);

      InputStream in = new ByteArrayInputStream(imageByteArray);
      image = ImageIO.read(in);
    } catch (IOException e) {
      e.printStackTrace();
    }

    JFrame frame = new JFrame();
    frame.setSize(300, 300);
    JLabel label = new JLabel(new ImageIcon(image));
    frame.add(label);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  // Constraint:  This method simulates how the image is originally received
  private static byte[] createByteArray(String urlString) throws IOException {
    URL url = new URL(urlString);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    InputStream is = null;
    try {
      is = url.openStream ();
      byte[] byteChunk = new byte[4096];
      int n;
      while ( (n = is.read(byteChunk)) > 0 ) {
        baos.write(byteChunk, 0, n);
      }
    } catch (IOException e) {
      e.printStackTrace ();
    } finally {
      if (is != null) { is.close(); }
    }
    return baos.toByteArray();
  }

}

值得一提的一些限制可能并不明确:

  • 图像最初是作为字节数组接收的
  • 图像应由ImageIO
  • 读取
  • 最终结果应为Image对象
  • 无法访问File类

鉴于这些限制,还有一种方法可以使用ImageIO以Toolkit.getDefaultToolkit().createImage()显示图像的方式显示GIF吗?

0 个答案:

没有答案