---
category: swing
folder: ExtractFramesFromAnimatedGif
title: Animated Gifからフレーム画像を抽出する
tags: [ImageIO, ImageReader, BufferedImage, Animation, AnimatedGif]
author: aterai
pubdate: 2013-03-18T02:26:09+09:00
description: Animated GIFから各フレームの画像を抽出します。
image: https://lh4.googleusercontent.com/-_xu1jNmYJe0/UUX3d_PzwKI/AAAAAAAABoA/cyS5ABVZdkM/s800/ExtractFramesFromAnimatedGif.png
---
* Summary [#summary]
`Animated GIF`から各フレームの画像を抽出します。主に[https://community.oracle.com/thread/1271862 Swing - Reading gif animation frame rates and such?]の回答を参考に作成しています。
#download(https://lh4.googleusercontent.com/-_xu1jNmYJe0/UUX3d_PzwKI/AAAAAAAABoA/cyS5ABVZdkM/s800/ExtractFramesFromAnimatedGif.png)
* Source Code Examples [#sourcecode]
#code(link){{
private static List<BufferedImage> loadFromStream(ImageInputStream imageStream) throws IOException {
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;
}
private static boolean checkGifFormat(ImageReader reader) {
String metaFormat = reader.getOriginatingProvider().getNativeImageMetadataFormatName();
String name;
try {
name = reader.getFormatName();
} catch (IOException ex) {
name = "";
}
return "gif".equalsIgnoreCase(name) && "javax_imageio_gif_image_1.0".equals(metaFormat);
}
}}
* Description [#explanation]
* Description [#description]
上記のサンプルでは、`ImageReader`に`Animated GIF`ファイルを読み込んで`IIOImage#getRenderedImage()`メソッドで各フレームの`BufferedImage`を取得しています。
- 背景色や差分フレームは無視している
- `try-with-resources`を使っているので`JDK 1.7.0`以上が必要
* Reference [#reference]
- [https://community.oracle.com/thread/1271862 Swing - Reading gif animation frame rates and such?]
- [[JPEGファイルのコメントを取り出す>Swing/IIOMetadata]]
- [[JLabelに表示したAnimated Gifのアニメーションを停止する>Swing/DisableAnimatedGif]]
- [[Animated GIFでのコマ描画時処理>Swing/AnimatedGif]]
* Comment [#comment]
#comment
#comment