• category: swing folder: ExtractFramesFromAnimatedGif title: Animated Gifからフレーム画像を抽出する tags: [ImageIO, ImageReader, BufferedImage, Animation] tags: [ImageIO, ImageReader, BufferedImage, Animation, AnimatedGif] author: aterai pubdate: 2013-03-18T02:26:09+09:00 description: AnimatedGifから各フレームの画像を抽出します。 description: Animated GIFから各フレームの画像を抽出します。 image: https://lh4.googleusercontent.com/-_xu1jNmYJe0/UUX3d_PzwKI/AAAAAAAABoA/cyS5ABVZdkM/s800/ExtractFramesFromAnimatedGif.png

概要

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

概要

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

サンプルコード

サンプルコード

#spandel
ImageReader reader = null;
#spanend
#spandel
Iterator<ImageReader> readers = ImageIO.getImageReaders(imageStream);
#spanend
#spandel
while(readers.hasNext()) {
#spanend
  reader = readers.next();
#spanadd
private static List<BufferedImage> loadFromStream(ImageInputStream imageStream) throws IOException {
#spanend
  Iterable<ImageReader> it = () -> ImageIO.getImageReaders(imageStream);
  ImageReader reader = StreamSupport.stream(it.spliterator(), false)
      .filter(MainPanel::checkGifFormat)
      .findFirst()
      .orElseThrow(() -> new IOException("Can not read image format!"));
  reader.setInput(imageStream, false, false);
  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();
  return list;
#spanadd
}
#spanend
#spanadd

#spanend
#spanadd
private static boolean checkGifFormat(ImageReader reader) {
#spanend
  String metaFormat = reader.getOriginatingProvider().getNativeImageMetadataFormatName();
  if("gif".equalsIgnoreCase(reader.getFormatName()) &&
            !"javax_imageio_gif_image_1.0".equals(metaFormat)) {
    continue;
  }else{
    break;
  String name;
  try {
    name = reader.getFormatName();
  } catch (IOException ex) {
    name = "";
  }
  return "gif".equalsIgnoreCase(name) && "javax_imageio_gif_image_1.0".equals(metaFormat);
}
#spandel
if(reader == null) {
#spanend
  throw new IOException("Can not read image format!");
#spandel
}
#spanend
#spandel
boolean isGif = reader.getFormatName().equalsIgnoreCase("gif");
#spanend
#spandel
reader.setInput(imageStream, false, !isGif);
#spanend
#spandel
List<BufferedImage> list = new ArrayList<>();
#spanend
#spandel
for(int i=0;i<reader.getNumImages(true);i++) {
#spanend
  IIOImage frame = reader.readAll(i, null);
  list.add((BufferedImage)frame.getRenderedImage());
#spandel
}
#spanend
#spandel
reader.dispose();
#spanend
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、ImageReaderAnimatedGifファイルを読み込ませて、IIOImage#getRenderedImage()で各フレームのBufferedImageを取得しています。

解説

上記のサンプルでは、ImageReaderAnimated GIFファイルを読み込んでIIOImage#getRenderedImage()メソッドで各フレームのBufferedImageを取得しています。
  • 注:
    • 背景色や差分フレームを無視している
    • try-with-resourcesを使っているので、JDK 1.7.0以上が必要
  • 背景色や差分フレームは無視している
  • try-with-resourcesを使っているのでJDK 1.7.0以上が必要

参考リンク

参考リンク

コメント

コメント