Pythonでアニメーションを作成するミニプログラムです。
アニメーションは動画よりもサイズを小さくでき、かつ動画をアップロードできない環境下でも使えるので、場合によってはアニメーションが採用されることもあります。
なお、今回は以下のライブラリを活用しますので、pipでインストールしておきましょう。
imageio
imageio-ffmpeg
pygifsicle
$ pip install imageio imageio-ffmpeg pygifsicle
画像からアニメーションgifを生成する
imageioを使えば画像と動画からアニメーションgifファイルを作成できます。
まずは画像から生成してみましょう。次のコードを記述します。
import imageio
import os
source_images_dir = './source_images/'
image_list = []
for file_name in os.listdir(source_images_dir):
_, ext = os.path.splitext(file_name)
if ext == '.png':
image_list.append(imageio.imread(source_images_dir + file_name))
imageio.mimwrite('animation.gif', image_list)
imageioを使うには始めにimportが必要です。今回はosも必要なので両方importしておきます。
source_images_dirは元となる画像が格納されているディレクトリパスを設定しています。
7行目〜10行目はsource_images_dir内の画像を一つずつ取り出して、拡張子がpngの場合のみimage_listに格納しています。他の拡張子の画像の場合はそれに合った拡張子に変更して使います。
また、image_listに格納するときにimageio.imread()を使っています。これは画像データをimageioで処理できるデータとして読み込むときに使います。
最後にimageio.mimwrite()にimage_listを渡してgifアニメーションを出力しています。1つ目の引数はファイル名を指定できます。
このコードを実際に実行すると、同じ階層にanimation.gifが作成されますので、確認してみてください。
動画からアニメーションgifを生成する
次に動画からアニメーションgifを作成してみましょう。
動画の場合はimageio.mimread()を使います。
import imageio
import os
video_read = imageio.mimread('cat.mov')
imageio.mimwrite('animation_video.gif', video_read)
imageio.mimread()で読み込んだ動画をimageio.mimwrite()に渡すことでアニメーションgifを生成しれくれます。
アニメーションgifのサイズを小さくする
アニメーションgifは作成すると元の画像や動画よりもサイズが大きくなりがちです(特に動画から作成した場合は顕著です)。
このままだと扱いづらいのでサイズを小さくしましょう。サイズを小さくするには最適化を行うか、枚数を減らす必要があります。
ファイルサイズ最適化
ファイルサイズの最適化を行うことでサイズを小さくできます。
最適化にはpygifsicleライブラリのoptimizeモジュールを使います。
試しに先ほど動画から作成したgifに適用してみましょう。
from pygifsicle import optimize
import os
source_video_gif = 'animation_video.gif'
optimized_video_gif = 'animation_video_optimized.gif'
print(f"{os.path.getsize(source_video_gif) / 1000 / 1000}" + 'MB')
optimize(source_video_gif, optimized_video_gif)
print(f"{os.path.getsize(optimized_video_gif) / 1000 / 1000}" + 'MB')
[出力結果]
11.469065MB
9.320793MB
結果をみて分かる通り、元々11.4MBあったgifが9.3MBまで縮小されました。
optimizeを挟むだけでサイズを小さくできるので非常に便利です。
FPSを調整する
FPSとはフレームレートのことで、1秒間に何枚の画像を使って動画が作成されているかを示す単位のことです。
このFPSを調整し、1秒あたりの画像枚数を減らすことで生成されるアニメーションgifのサイズを縮小できます。
import imageio
import os
#fps設定なし
video_gif = 'animation_video.gif'
video_read = imageio.mimread('cat.mov')
imageio.mimwrite(video_gif, video_read)
print(f"{os.path.getsize(video_gif) / 1000 / 1000}" + 'MB')
#fpsを5に設定
video_gif_set_fps = 'animation_video_set_fps.gif'
video_read_set_fps = imageio.mimread('cat.mov', fps=5)
imageio.mimwrite(video_gif_set_fps, video_read_set_fps)
print(f"{os.path.getsize(video_gif_set_fps) / 1000 / 1000}" + 'MB')
[出力結果]
11.469065MB
2.086852MB
fpsを設定しない場合は変換元の動画のfpsがそのまま設定されるので、11MBと大きなファイルになってしまいますが、fpsを5に設定した方は2MBまで縮小できました。
ただし、fpsを下げすぎるとアニメーションの動きがカクカクするようになってしまいますので、fpsを調整しながらファイルサイズとアニメーションの動きを確認し、最適なfpsを調整する必要があります。