Quantcast
Viewing all articles
Browse latest Browse all 2722

回る長い猫のシェル芸

回る長い猫のシェル芸とは?

Image may be NSFW.
Clik here to view.
x.gif

このgifアニメーションを生成するシェル芸です。

コマンド

以下のコマンドで生成することができます。

$ eval"convert -delay 10 <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in{30..600..30};do echo-n"\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/x.gif"

前提条件

longcatと imagemagick がインストールされていること。

コマンドができるまで

長い猫を生成します。

$ longcat -n 10 -o /images/0.png

Image may be NSFW.
Clik here to view.
0.png

長い猫を標準出力(/dev/stdout)を通してimagemagick に入力して、少し整形します。

$ convert <(longcat -n 10 -o /dev/stdout)-flatten-scale 150x600! -rotate-90 /images/1.png

-flattenで透過背景を白背景に変えて、-scaleでサイズを指定して、-rotateで回転しています。
Image may be NSFW.
Clik here to view.
1.png

-waveで波打たせます。

$ convert <(longcat -n 10 -o /dev/stdout)-flatten-scale 150x600! -rotate-90-wave 20x120 /images/2.png

Image may be NSFW.
Clik here to view.
2.png

-distort arc 360で丸めます。

$ convert <(longcat -n 10 -o /dev/stdout)-flatten-scale 150x600! -rotate-90-wave 20x120 -distort arc 360 /images/3.png

Image may be NSFW.
Clik here to view.
3.png

波打たせて丸める前の段階で、-roll -30+0して、左側に30ピクセルずらしてやると、

$ convert <(longcat -n 10 -o /dev/stdout)-flatten-scale 150x600! -rotate-90-roll-30+0 -wave 20x120 -distort arc 360 /images/4.png

Image may be NSFW.
Clik here to view.
4.png

さきほどよりわずかに猫の頭が進んでいます。
さきほどは星型のへこんだところに猫が頭を突っ込んでいましたが、今は次の出っ張ってるところへ進んでいますね。
これを一周するまで繰り返します。

$ eval"convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in{30..600..30};do echo-n"\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/z.png"

Image may be NSFW.
Clik here to view.
z-0.png

Image may be NSFW.
Clik here to view.
z-1.png

Image may be NSFW.
Clik here to view.
z-2.png

Image may be NSFW.
Clik here to view.
z-3.png

Image may be NSFW.
Clik here to view.
z-4.png

Image may be NSFW.
Clik here to view.
z-5.png

Image may be NSFW.
Clik here to view.
z-6.png

Image may be NSFW.
Clik here to view.
z-7.png

Image may be NSFW.
Clik here to view.
z-8.png

Image may be NSFW.
Clik here to view.
z-9.png

Image may be NSFW.
Clik here to view.
z-10.png

Image may be NSFW.
Clik here to view.
z-11.png

Image may be NSFW.
Clik here to view.
z-12.png

Image may be NSFW.
Clik here to view.
z-13.png

Image may be NSFW.
Clik here to view.
z-14.png

Image may be NSFW.
Clik here to view.
z-15.png

Image may be NSFW.
Clik here to view.
z-16.png

Image may be NSFW.
Clik here to view.
z-17.png

Image may be NSFW.
Clik here to view.
z-18.png

Image may be NSFW.
Clik here to view.
z-19.png

evalすることで、for文が展開された後の文字列を評価しています。evalのかわりにechoしてみて、for文がどのように展開されているか見ておきましょう。

$ eval"convert <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in{30..600..30};do echo-n"\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/z.png"
convert <(longcat -n 10 -o /dev/stdout)-flatten-scale 150x600! -rotate-90-write mpr:a +delete \( mpr:a -roll-30+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-60+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-90+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-120+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-150+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-180+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-210+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-240+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-270+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-300+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-330+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-360+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-390+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-420+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-450+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-480+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-510+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-540+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-570+0 -wave 20x120 -distort arc 360 \)\( mpr:a -roll-600+0 -wave 20x120 -distort arc 360 \) /images/z.png

波打たせて丸める前の状態で-write mpr:aで mpr:a にイメージを格納して、+deleteでイメージシーケンスをクリアして、その後は mpr:a を-rollして-waveして`-distortしたものを20個、イメージシーケンスに並べています。最後に /images/z.png とすることで、/images/z-0.png から /images/z-19.png の連番ファイルに出力します。
アニメーションにします。

$ eval"convert -delay 10 <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in{30..600..30};do echo-n"\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/x.gif"

出力ファイルパスの拡張子をgifにすることで、イメージシーケンスの全イメージをgifアニメーションとして書き込みます。
Image may be NSFW.
Clik here to view.
x.gif

完成。
-delay 10 はアニメーション1コマの時間指定です。高速回転にしてみましょう。

$ eval"convert -delay 3 <(longcat -n 10 -o /dev/stdout) -flatten -scale 150x600! -rotate -90 -write mpr:a +delete `for i in{30..600..30};do echo-n"\( mpr:a -roll -$i+0 -wave 20x120 -distort arc 360 \) ";done`/images/x.gif"

Image may be NSFW.
Clik here to view.
x.gif

以上。


Viewing all articles
Browse latest Browse all 2722

Trending Articles