ImageMagickでGIFアニメーションを作成、潜水艦を浮上させてみた!

元画像の用意

まずは潜水艦の素材を取ってくる!

『ICOON MONO』より

シェルスクリプトでImageMagickを動かす

ImageMagick のconverを使ってアニメーションGIFを作るが、シェルスクリプトで自動化してみる事にした。

50枚の画像を7分の100秒間隔でパラパラパラアニメのGIFにするプログラム。

白塗りの背景画像background.gifを重ねているのがポイント。これが無いと残像が残ってしまう。

#!/bin/bash
cd `dirname $0` #おまじない


for ((i=0; i < 50; i++)); do
    offsetY=`expr 260 - $i \* 30`
    num=`printf "%02d" $i`
#    echo $num

    if [ $offsetY -lt 0 ]; then
      offsetY=0
    fi

    convert uboat.png -page +0+$offsetY -background white -flatten tmp.gif
    composite -compose over tmp.gif background.gif anime$num.gif
done


convert -delay 7 -loop 0 anime*.gif uboat_anime.gif

f:id:araemonz:20180729123406g:plain

出来た! が、なんだかショボイ。。。

気になる点と改善案

  • 7分の100秒間隔ということは計算すると約14fspなので少しカクカクして見える。 映画やアニメなんかの24fspにしてみよう。

  • 等速運動で不自然。乗算で重力表現をしてみよう。

改良してみる

そして考えたスクリプトがこれ。 トライアンドエラーで数値を入力したので使い回せないが。 スプリング的なアクションも入れてみた。

#!/bin/bash
cd `dirname $0` #おまじない

index=0
index2=0

for ((i=0; i < 18; i++)); do
    index=$i
    offsetY=`expr 260 - $i \* $i`
    num=`printf "%02d" $index`

    convert uboat.png -page +0+$offsetY -background white -flatten tmp.gif
    composite -compose over tmp.gif background.gif anime$num.gif
done

for ((i=0; i < 7; i++)); do
    index2=`expr $i + $index`
    offsetY=`expr $i \* $i`
    num=`printf "%02d" $index2`

    if [ $offsetY -gt 50 ]; then
      offsetY=50
    fi
    echo $offsetY

    convert uboat.png -page +0+$offsetY -background white -flatten tmp.gif
    composite -compose over tmp.gif background.gif anime$num.gif

done


for ((i=0; i < 25; i++)); do
    index3=`expr $i + $index2`
    offsetY=`expr 36 - $i \* $i / 2`
    num=`printf "%02d" $index3`

    if [ $offsetY -lt 0 ]; then
      offsetY=0
    fi

    convert uboat.png -page +0+$offsetY -background white -flatten tmp.gif
    composite -compose over tmp.gif background.gif anime$num.gif
done


convert -delay 4 -loop 0 anime*.gif uboat_anime.gif

f:id:araemonz:20180729123428g:plain

感想(ImageMagickを使ってみて)

  • 凝ったアニメーションをつくるならオーサリングツールを使った方が早いが、単純作業にはつかえそう。

  • 書きづらいシェルスクリプトでやってしまったが、いろんな言語からも利用できるようであるので次回はRubyあたりで書いてみたい。