gifアニメーション(convert)

やりたいこと

評価結果などをアニメーション表示したい時がある。リアルタイムなグラフのプロットならGnuplotでも良いけれど,ゲームプレイ画像などを表示したい場合には画像からアニメーションを作れると良い。

方法

  1. "連番"の画像ファイルを用意する。注意は0埋めしてファイルの順序通りに読み込まれるようにする。つまり,1〜99までの画像がある場合,01〜99にする。pythonだとformat({:03})みたいな記述するだけ。
  2. convert(ImageMagic)でgif化する。注意はLayer optimizeしないとフィアルサイズが大きくなること。loop=0指定で無限ループするgifになる。delayはmilli secオーダのアニメーション時間間隔。

サンプル

  1. 連番画像ファイルを生成する。ここでは少しずつ移動する(位相が進む)sin波のアニメーション用に,./fig以下にfig_0001.png - fig_0100.pngを生成している。 Matplotlibでアニメーションを検索すると,Matplotlibの中だけでgif生成までやる例があるけれど,画像サイズの調整やリサイズなども後から出来るので,このように一度連番画像を生成するのが良い気がする。 注意点として,20枚以上を一度に描画しようとするとエラーメッセージが出されるため,plt.close()にて毎回閉じる。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
x = np.arange(0, 10, 0.1)

fig_dir = './fig/'

for i in range(1,101):
    plt.clf()
    y = np.sin(x - i/10.0)
    plt.plot(x, y, "r")
    plt.savefig(fig_dir+'fig_{:04}'.format(i)+'.png')
    plt.close()
  1. convertする。
$ cd ./fig
$ convert -layers optimize -loop 0 -delay 10 fig_*.png animation.gif

f:id:nobUnaga:20180607081215g:plain