概要

Animated GIFから各フレームの画像を抽出します。主にSwing - Reading gif animation frame rates and such?の回答を参考に作成しています。

サンプルコード

ImageReader reader = null;
Iterator<ImageReader> readers = ImageIO.getImageReaders(imageStream);
while (readers.hasNext()) {
  reader = readers.next();
  String metaFormat = reader.getOriginatingProvider().getNativeImageMetadataFormatName();
  if ("gif".equalsIgnoreCase(reader.getFormatName()) &&
          !"javax_imageio_gif_image_1.0".equals(metaFormat)) {
    continue;
  } else {
    break;
  }
}
reader = Objects.requireNonNull(reader, "Can not read image format!");
boolean isGif = reader.getFormatName().equalsIgnoreCase("gif");
reader.setInput(imageStream, false, !isGif);
List<BufferedImage> list = new ArrayList<>();
for (int i = 0; i < reader.getNumImages(true); i++) {
  IIOImage frame = reader.readAll(i, null);
  list.add((BufferedImage) frame.getRenderedImage());
}
reader.dispose();
view all

解説

上記のサンプルでは、ImageReaderAnimated GIFファイルを読み込んで、IIOImage#getRenderedImage()メソッドで各フレームのBufferedImageを取得しています。

  • 注:
    • 背景色や差分フレームは無視している
    • try-with-resourcesを使っているので、JDK 1.7.0以上が必要

参考リンク

コメント