6,760 views
この記事は最終更新から 2202日 が経過しています。
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