カビが空中で無数に舞い降りる動画を作ろうと思いました。
自分がカビに囲まれて生きているということを自分の脳みそに叩き込むためです。
そうしないと不潔な環境から脱却できないような気がしました。
そこまで不潔でもないのですが、清潔と自慢できるほどではありません。
簡単に動画を作りたいと思い、gif で作るのが一番と考えました。
でも、そう簡単にはできません。
いろいろ検索しているうちに、GIMP でスクリプトを作成して画像が作成できることがわかりました。
script-fu というものです。
サンプルのダウンロード
このページに素晴らしいサンプルがあってダウンロードができます。
windows と書いてありますが、linux mint 21 でも動きます。
動かしてみる
上記ページから「random_convex.scm」をダウンロードして、linux mint では /usr/share/gimp/2.0/scripts に移動します。
sudo cp random_convex.scm /usr/share/gimp/2.0/scripts
GIMP を起動して、「フィルター」→「Script-Fu」を選択。
スクリプトを再読込すると、「フィルター」→「下塗り」に random_convex が選択できるようになります。
背景色・描画色を設定して、以下のように設定します。
![](https://kunokatura.xsrv.jp/wp/wp-content/uploads/2022/12/xscript_fu.jpg.pagespeed.ic.3dzNJf8xKx.jpg)
実行すると以下のような画像ができます。
![](https://kunokatura.xsrv.jp/wp/wp-content/uploads/2022/12/xgimp2022120501.jpg.pagespeed.ic.jIbkInxlvz.jpg)
これはスゴイ。
キレイですが、一つ一つがカビの胞子というイメージです。
しかし、これからアニメーションを作るにはどうしたらいいんでしょう?
python で crop
大きな画像を作っておいて、その画像を crop して gif アニメーションにします。
大きな画像から一部を切り取って保存します。
from PIL import Image
img = Image.open("/home/user/002.png")
counta = 0
while counta < 300:
img_roi = img.crop((0, 1600 - counta*3, 600, 2000 - counta*10))
newimg = str(counta).zfill(4) +'.png'
img_roi.save("/home/user/images/" + newimg )
counta +=1
それらから gif を作成します。
convert -delay 20 -loop 0 *.png movie.gif
こうすると以下のような動画ができます。
![](https://kunokatura.xsrv.jp/wp/wp-content/uploads/2022/12/movie-1.gif)
背景の画像に gif を貼り付ける
これがとても難しくて、gimp で実現するのは最終的には諦めました。
上級者たちは gimp だけでできるんでしょうかね。
上で作ったような gif を背景を透明にして作成し、何らかの背景画像に貼り付けるのですがうまくいきません。
背景を透明にして、コマンドラインから以下のようにすると、
convert -delay 20 -loop 0 *.png movie.gif
出来上がるのは、
![](https://kunokatura.xsrv.jp/wp/wp-content/uploads/2022/12/movie-2.gif)
すべての画像が重なっています。
ネット検索して以下のようなコマンド実行すると、
convert -dispose 2 -delay 20 -loop 0 *.png anim.gif
![](https://kunokatura.xsrv.jp/wp/wp-content/uploads/2022/12/anim.gif)
できたと思ったのですが、これを背景画像に貼り付けても透明になりません。
いろいろやってダメなのでこの方法は諦めて、python にお願いすることにしました。
python で 2 つの画像を重ねる
どっかのサイトから貰いました。
from PIL import Image
base_path = '/home/user/living.jpg'
counta = 0
while counta < 50:
base = Image.open(base_path)
pastImg = '/home/user/images/' + str(counta).zfill(4) + '.png'
logo = Image.open(pastImg)
base.paste(logo, (0, 0), logo)
saveImg = '/home/user/out/' + str(counta).zfill(4) + '.png'
base.save(saveImg)
counta +=1
ただし、これは画像としてはとても重くなります。
png から crop して jpg で保存しようとしたのですがエラーになります。
どうして?
仕方がないので png で保存してそれをコマンドでつなぎ合わせました。
![](https://kunokatura.xsrv.jp/wp/wp-content/uploads/2022/12/movie-4.gif)
これ、7 MBもあります。
画像は全部で 50 個です。
さすがに重い。
なお、背景画像はネットでダウンロードさせて頂いたものです。
とても見やすかったので使わせて頂きました。