(95) convertコマンドでアニメーションGIF作成

投稿者: | 2018年9月22日

この記事は最終更新から 383日 が経過しています。

1. やりたいこと

ImageMagickの convert コマンドを使ってアニメーションGIFファイルを作りたい。

更に…
アニメーションさせる画像は、この画像の左側から順に convertコマンドで矩形を切り出して作りたい。

bg.png 1000×64[pixel]

2. やってみる

(1) アニメーションに使う画像の切り出し。

上記の横長画像の左端から順に、2ピクセルずつ右に移動しながら 120 x 64[pixel]の画像を 442枚切り出す。
-crop : {WIDTH}x{HEIGHT}+{OFFSET_X}+{OFFSET_Y}

for I in `seq 0 2 880`;do
    NUM=`printf "%04d" $I`
    FNAME="bg_${NUM}.gif"
    convert bg.png -crop 120x64+${NUM}+0 +repage $FNAME
done

ここで +repage は切り出した画像をトリミングするために指定する。
これを指定しないと、こんなコマ画像が出来てしまう。


※トリミングされていないことがわかるように、画像の周囲を黒線で囲んでいる。

(2) アニメーションGIFファイルを作る。

-delay 5 : 1コマ 50ms, すなわち 20fpsのアニメーションGIFとする。
-loop 0 : 無限再生させる。

convert -delay 5 -loop 0 bg_*.gif anim.gif

※WEBブラウザおよびその実行環境により 20fpsは出ないかも…

できあがったのがこちら!

因みに…
+repage でトリミング指定しないとこんなアニメになってしまう。

3. 応用

(1) アニメの各コマに別画像を重ね合わせる。

アニメーションの各コマには、空飛ぶ物体も重ねて表示したい。

上記 2.(1) を以下のように変更する。 5行目を追加しただけ。

for I in `seq 0 2 880`;do
    NUM=`printf "%04d" $I`
    FNAME="bg_${NUM}.gif"
    convert bg.png -crop 120x64+${NUM}+0 +repage $FNAME
    convert $FNAME obj.png -gravity center -compose over -composite $FNAME
done

convert -delay 5 -loop 0 bg_*.gif anim2.gif

できあがったのがこちら!

(2) 空飛ぶ物体を揺らしてみる。

-3度から +3度まで、1度刻みで 7段階に回転させて揺らしてみる。

まずは空飛ぶ物体が揺れたときの画像を作成しておく。
・2行目 : ${#angle[*]} 配列の要素数を取得する。
・5行目 : -background 回転後に生じた領域は透過色とする。

angle=(0 1 2 3 2 1 0 -1 -2 -3 -2 -1)
NUMANG=${#angle[*]}    # 配列の要素数
for ANG in ${angle[@]}; do
    OBJIMG="obj_ang${ANG}.png"
    convert obj.png -background 'rgba(0,0,0,0)' -rotate $ANG $OBJIMG
done

アニメーション作成時、空飛ぶ物体の回転角度を 1コマずつ変える。

for I in `seq 0 440`;do
    FNAME=`printf "bg_%04d.gif" $I`
    X=$(($I * 2))
    convert bg.png -crop 120x64+${X}+0 +repage $FNAME

    MOD=$(($I % $NUMANG))
    OBJIMG="obj_ang${angle[${MOD}]}.png"
    convert $FNAME $OBJIMG -gravity center -compose over -composite $FNAME
done

convert -delay 5 -loop 0 bg_*.gif anim3.gif

できあがったのがこちら!

(3) 空飛ぶ物体の大きさを変えてみる。

100%から 94%まで 7段階に大きさを変えてみる。

# 空飛ぶ物体の回転角度を変えた画像を作成しておく。
angle=(0 1 2 3 2 1 0 -1 -2 -3 -2 -1)
size=(100% 99% 98% 97% 96% 95% 94% 95% 96% 97% 98% 99%)
NUMANG=${#angle[*]}

I=0
for ANG in ${angle[@]}; do
    OBJIMG="obj_ang${I}.png"
    convert obj.png -background 'rgba(0,0,0,0)' -resize ${size[$I]} -rotate $ANG $OBJIMG
    I=`expr $I + 1`
done

# アニメーションのコマ画像を作成する。
for I in `seq 0 440`;do
    FNAME=`printf "bg_%04d.gif" $I`
    X=$(($I * 2))
    convert bg.png -crop 120x64+${X}+0 +repage $FNAME

    MOD=$(($I % $NUMANG))
    OBJIMG="obj_ang${MOD}.png"
    convert $FNAME $OBJIMG -gravity center -compose over -composite $FNAME
done

convert -delay 5 -loop 0 bg_*.gif anim4.gif

できあがったのがこちら!

(4) スクロール方向を反転させてみる。

アニメーションに使う画像を反転させることにより、スクロールの向きを反対にする。

上記(3)でアニメーションGIFを作成する直前に全コマ画像を左右反転させる。
個々の画像を処理する convert に対して mogrify は複数画像をまとめて処理できる。

mogrify -flop bg_*.gif

convert -delay 5 -loop 0 bg_*.gif anim5.gif

できあがったのがこちら!

4. 参考情報

ありがとうございます。 m(_ _)m
https://shellscript.sunone.me/array.html#%E9%85%8D%E5%88%97%E3%81%AE%E8%A6%81%E7%B4%A0%E6%95%B0%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です