踊るgifシェル芸

#踊るgifシェル芸とは？
![x.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/03fb6635-fadd-d634-76a1-0f2a68504cf9.gif)
こういうgifアニメーションをつくるシェル芸です。
このシェル芸は[いらすとや](https://www.irasutoya.com/)の素材を使用しています。

#素材とコマンド
以下の素材とコマンドで、gifアニメーションを作ることができます。
man.png
![man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/c46b802a-3ac6-6b5d-83b3-59684a7b1272.png)
woman.png
![woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/05a33487-3dae-9d0d-2ab4-5655ac4dec6d.png)
コマンド

```bash
$ convert -dispose previous man.png \( woman.png -flop \) +append -write mpr:a +delete \( man.png -flop \) woman.png +append -write mpr:b +delete mpr:a mpr:a mpr:a \( mpr:b -scale x90% \) mpr:b mpr:b mpr:b \( mpr:a -scale x90% \) /images/x.gif
```
前提条件は``` imagemagick ```がインストールされていること。

#コマンドができるまで
コマンドができるまでを見ていきましょう。
##ステップ1. 反転してアニメーションする
まず一人の人を反転してアニメにしてみます。
コマンド

```bash
$ convert man.png \( +clone -flop \) /images/0.gif
```
出力アニメ
![0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/049dc2e5-754b-6a40-8b9d-c7850aab709d.gif)
2コマのアニメにはなりましたが、素材が透過pngなので、1コマめが残っちゃってますね。
``` -dispose previous ```で消しましょう。
コマンド

```bash
$ convert -dispose previous man.png \( +clone -flop \) /images/1.gif
```
出力アニメ
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/16108e5c-0533-44ac-6fda-6f8d8de8de2f.gif)
消えました。
##ステップ2. 弾ませる
左右反転するときに上下に弾むようにしましょう。
``` -scale x90% ```で縦に少し縮めたフレームを作って、反転時に挿入します。
コマンド

```bash
$ convert -dispose previous man.png \( man.png -flop -scale x90% \) \( man.png -flop \) \( man.png -scale x90% \) /images/2.gif
```
出力アニメ
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/002213fc-fefd-4fb1-c552-9e13bc9fdd27.gif)
##ステップ3. 接地時間調整
地に足がついている時間を長めにしましょう。
元画像を``` -write mpr:a ```でmpr:aに格納、反転画像を``` -write mpr:b ```でmpr:bに格納して、
mpr:a を3コマ続けて、mpr:b を縦に縮めたものを挟んで、
mpr:b を3コマ続けて、mpr:a を縦に縮めたものを挟んで、もとの mpr:a にもどります。
コマンド

```bash
$ convert -dispose previous man.png -write mpr:a +delete \( mpr:a -flop \) -write mpr:b +delete mpr:a mpr:a mpr:a \( mpr:b -scale x90% \) mpr:b mpr:b mpr:b \( mpr:a -scale x90% \) /images/3.gif
```
出力アニメ
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/9c6c2d8e-5637-7b73-fda6-5c73b17b7e49.gif)
## ステップ4. 2人にする
``` +append ```で横に結合したものを踊らせます。
コマンド

```bash
$ convert -dispose previous man.png \( woman.png -flop \) +append -write mpr:a +delete \( man.png -flop \) woman.png +append -write mpr:b +delete mpr:a mpr:a mpr:a \( mpr:b -scale x90% \) mpr:b mpr:b mpr:b \( mpr:a -scale x90% \) /images/x.gif
```
出力アニメ
![x.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/ed6d3c66-a3e4-42d2-b2ff-f145d83bb00b.gif)
完成です。
#シェル芸botの場合
シェル芸botでは、入力ツイートでアップロードした画像が /media/0, /media/1,… のパスにあるものとして
扱われるので、以下のようになります。
入力ツイート
<blockquote class="twitter-tweet"><p lang="ht" dir="ltr">convert -dispose previous media/0 \( media/1 -flop \) +append -write mpr:a +delete \( media/0 -flop \) media/1 +append -write mpr:b +delete mpr:a mpr:a mpr:a \( mpr:b -scale x90% \) mpr:b mpr:b mpr:b \( mpr:a -scale x90% \) /images/x.gif<a href="https://twitter.com/hashtag/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8?src=hash&amp;ref_src=twsrc%5Etfw">#シェル芸</a> <a href="https://t.co/HzidVj8EKT">pic.twitter.com/HzidVj8EKT</a></p>&mdash; 闇ときどき豚 (@yami_buta) <a href="https://twitter.com/yami_buta/status/1182282948944359424?ref_src=twsrc%5Etfw">October 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
出力ツイート
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/zibqPiZNBc">https://t.co/zibqPiZNBc</a> <a href="https://t.co/N0cnUlTsar">pic.twitter.com/N0cnUlTsar</a></p>&mdash; シェル芸bot (@minyoruminyon) <a href="https://twitter.com/minyoruminyon/status/1182283061162995712?ref_src=twsrc%5Etfw">October 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#応用
反転時に上に弾むのではなく、下に沈むのでも踊らせることができます。
コマンド

```bash
$ echo -e "\n💃 "|textimg -F100|convert -dispose previous - -trim +repage -scale 72x100! -write mpr:a -flop -write mpr:b +delete -size 72x10 xc:black \( mpr:b -scale x90% \) -append -write mpr:c +delete mpr:a mpr:a mpr:a mpr:c mpr:b mpr:b mpr:b \( mpr:c -flop \) /images/d.gif
```
出力アニメ
![d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143996/2db763cd-213d-1437-44b8-6a39a163895e.gif)
長い猫
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/Z2oqANL1mr">https://t.co/Z2oqANL1mr</a> <a href="https://t.co/NglidA3fLB">pic.twitter.com/NglidA3fLB</a></p>&mdash; シェル芸bot (@minyoruminyon) <a href="https://twitter.com/minyoruminyon/status/1171787237391945730?ref_src=twsrc%5Etfw">September 11, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
阿波踊り（右向きと左向きで2回ずつ弾ませている）
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/rc1DcyDLQY">https://t.co/rc1DcyDLQY</a> <a href="https://t.co/dFpkvaqIvE">pic.twitter.com/dFpkvaqIvE</a></p>&mdash; シェル芸bot (@minyoruminyon) <a href="https://twitter.com/minyoruminyon/status/1147715144174075907?ref_src=twsrc%5Etfw">July 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
応用というか引き算ですが、上下に弾ませなくてもけっこう面白いものはできます。
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/O9MV7z7tIC">https://t.co/O9MV7z7tIC</a> <a href="https://t.co/2gTYI7Zv5v">pic.twitter.com/2gTYI7Zv5v</a></p>&mdash; シェル芸bot (@minyoruminyon) <a href="https://twitter.com/minyoruminyon/status/1147691203732750336?ref_src=twsrc%5Etfw">July 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/M66SNVF6H2">https://t.co/M66SNVF6H2</a> <a href="https://t.co/ZBeoiwokpb">pic.twitter.com/ZBeoiwokpb</a></p>&mdash; シェル芸bot (@minyoruminyon) <a href="https://twitter.com/minyoruminyon/status/1150231830550863873?ref_src=twsrc%5Etfw">July 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/mLQk7Wok6N">https://t.co/mLQk7Wok6N</a> <a href="https://t.co/xeJMpsZW7P">pic.twitter.com/xeJMpsZW7P</a></p>&mdash; シェル芸bot (@minyoruminyon) <a href="https://twitter.com/minyoruminyon/status/1146155162924244992?ref_src=twsrc%5Etfw">July 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#まとめ
画像を左右反転して、上下に弾ませることで、踊るgifを作ることができました。
#所感
~~阿波踊りのやつもシェル芸botでやったと思うんですが、ちょっと見つかりませんでした。~~
~~見つけたら追記します。~~→しました！

ソフトウェアツールとしてはimagemagick一発実行してるだけなので、
シェル芸としては微妙かもしれないですね。
[imagemagickの各種コマンドラインツール](https://imagemagick.org/script/command-line-tools.php)を
パイプやリダイレクトでつなぐのをそのうちやろうかな。

#更新履歴
2019/12/17 7:05 踊る長い猫を追加しました。
2019/12/17 7:17 阿波踊りを追加しました。