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