
GIFアニメーションで遊ぼう!
前回の投稿で、Webアプリの完成版のイメージを伝えたくてGIFファイルを作成してみました。Pythonで意外と簡単に作れたので覚え書として残しておきます。
GIFアニメーションとは?
GIFアニメーション(ジフアニメーション、GIF animation)は、Graphics Interchange Format (GIF) の「マルチイメージ」を使ったアニメーション。アニメーションGIF (animated GIF) ともいう。
マルチイメージは GIF87a で導入された機能で、複数のフレーム(参考:コマ (映画・漫画))を順に表示できる。GIF89a では待ち時間が指定できるようになった。
簡単に言うと、複数の画像を順番に表示させるパラパラ漫画のようなものです。no+eだとYoutube等ののURLを埋め込むことはできそうですが、Youtubeに動画をアップするほどの内容でもないので、GIFファイルを作成する事となりました。
幸いGIFファイルは「動画」ではなく「画像」に分類されるので、no+eにも画像として挿入することができます。
GIFアニメーションの作成
一般的には、GIFアニメーション作成ソフトを使用ようです。フリーソフトもありますが、プレゼンテーションツールとして使用するPowerPointやKeynoteでも作成できるようです。使い慣れたツールで作成すれば良いですが、Pythonでの作成方法も知っておくと何かの役に立ちそうです。
準備
GIFアニメーションにする画像を準備します。Pythonファイルと同じディレクトリに「画像」というフォルダを準備し、その中に画像を入れておきます。画像ファイルは、順番に並ぶようファイル名に数字を入れるなどして工夫しておきます。
使用するライブラリ
① Pillow
Pillowは、Pythonで画像処理を行うためのライブラリです。画像の読み込み・保存、編集、フォーマットの変換などが可能です。今回のようにGIFアニメーション作成も出来ます。
初めて使用する場合はインストールする必要があります。
pip install pillow
② glob
globは、Python標準ライブラリに含まれるファイルパターンマッチングのためのモジュールです。ワイルドカードを使って、特定のパターンに合致するファイルを取得できます。
実際のコード
まずは、必要なライブラリをimportします。
from PIL import Image
import glob
「画像」フォルダに保存した画像を読み込みます。
今回の画像はpng形式で、アニメーションにしたい順番に「番号.png」というようにファイル名を付けいています。
globを使用して、「画像」フォルダのなかのpng形式ファイルを取得します。
files = glob.glob("画像\\*.png")
filesの中身を表示させると、以下のようになります。

「画像」フォルダ内にある「○○.png」という条件に合致するファイル(正確には相対ファイルパス)がリスト形式で取得できています。
リストなのでfor文を使用すれば、順番にファイルを操作することができます。
PillowのImage.open("ファイルパス")を使用すると画像ファイルを開くことができます。1枚ずつ画像を開き、framesというリストに追加します。
# 画像をリストに追加
frames = []
for file in files:
img = Image.open(file)
frames.append(img)
ちなみに、for文を使用してリストに追加していく記述は、以下のように1行にまとめる方法もあります(リスト内包表記)。
# 画像をリストに追加
frames = [Image.open(file) for file in files]
1行で済むのでコードがすっきりしますが、慣れが必要です…。
あとは、GIFファイルとして保存します。1枚目の画像(frames[0])に対し、2枚目以降の画像(frames[1:])を追加(append_images)して保存する感じでしょうか。引数durationでフレーム(コマ)の長さを設定できます。
# GIFとして保存
frames[0].save(
"sample.gif",
save_all=True,
append_images=frames[1:],
duration=100, # フレーム間の時間(ミリ秒)
loop=0 # 0は無限ループ
)
今回はサンプルとしてこんなGIFを作ってみました。


全コードはこんな感じです。
from PIL import Image
import glob
files = glob.glob("画像\\*.png")
frames = [Image.open(file) for file in files]
frames[0].save(
"sample.gif",
save_all=True,
append_images=frames[1:],
duration=100, # フレーム間の時間(ミリ秒)
loop=0 # 0は無限ループ
)
非常にシンプルなコードでGIFアニメーションを作成することができました。特定のフォルダに画像を保存し、実行するだけなので、一度コードを作ってしまえば次からは爆速でGIFが作成できます。
これまでGIFアニメーションは作ったことも使ったこともなかったですが、動画と違ってファイルが重くないところも良いですね(15枚の画像を繋げたサンプルのGIFは、たったの137KB)。WordやPowerPointにも画像として貼り付けできましたし、PowerPointはスライドショーにしてもちゃんと動くし、何かに活用できそうです!