2026/04/08(水) [n年前の日記]
#1 [gmic] G'MICでアニメーションを作成
G'MIC を使ってアニメーションを作ってみたいと思い立った。アニメーションと言ってもフィルタのかかり具合が変化していく動画、だけど…。
環境は、Windows11 x64 25H2 + G'MIC CLI 3.7.4 (gmic.exe)。
環境は、Windows11 x64 25H2 + G'MIC CLI 3.7.4 (gmic.exe)。
◎ animateコマンドについて :
以下のページでは G'MIC で作成された色々なアニメーションが紹介されてる。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Gallery
ページ内の「Source code」と書かれたリンクをクリックすると、スクリプトソースを閲覧できるけれど、その中で animate というコマンドを使う旨が書かれてる。
名前からしてそれっぽいし、G'MIC でアニメーションを作る際は animate コマンドを使うのかな…? ちなみに、その認識は間違いだと後で分かった…。
animateコマンドのドキュメントは以下。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - animate
以下の引数を取ると書いてある。
delayの指定は、G'MICで画像ウインドウ表示をした際の、表示のdelay値だろうけど…。これって連番画像として保存したりはできないのだろうか?
フィルタ名とパラメータを指定した後、nb_frames なるものを指定するらしいけど、この値もよく分からない…。前述のドキュメントには以下の使用事例があったので手元で試してみたけれど…。
G'MIC CLIが画像ウインドウを表示して、そこでは #0 から #19 まで、画像が20枚作成されていた。おかしい。nb_frames で 9 を指定したから9枚作成されるのかなと思ったのに…予想が外れた。すると、この 9 の指定は一体何なんだろう? 生成フレーム数を指定してるわけではない…?
その上、手元で生成した結果画像は、ドキュメントで紹介されてる画像とは見た目が全然違っていた。何故。
animateコマンドの仕様…よく分からないな…。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Gallery
ページ内の「Source code」と書かれたリンクをクリックすると、スクリプトソースを閲覧できるけれど、その中で animate というコマンドを使う旨が書かれてる。
# Entry point when run from CLI: go =>[^] Distortion e[] "" animate 50
名前からしてそれっぽいし、G'MIC でアニメーションを作る際は animate コマンドを使うのかな…? ちなみに、その認識は間違いだと後で分かった…。
animateコマンドのドキュメントは以下。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - animate
以下の引数を取ると書いてある。
## Arguments:
- filter_name,"param1_start,...,paramN_start","param1_end,...,paramN_end",nb_frames>=0,_output_frames={ 0:No | 1:Yes },_output_filename- delay>0,_back and forth={ 0:No | 1:Yes }
delayの指定は、G'MICで画像ウインドウ表示をした際の、表示のdelay値だろうけど…。これって連番画像として保存したりはできないのだろうか?
フィルタ名とパラメータを指定した後、nb_frames なるものを指定するらしいけど、この値もよく分からない…。前述のドキュメントには以下の使用事例があったので手元で試してみたけれど…。
gmic.exe image.jpg animate flower,"0,3","20,8",9
G'MIC CLIが画像ウインドウを表示して、そこでは #0 から #19 まで、画像が20枚作成されていた。おかしい。nb_frames で 9 を指定したから9枚作成されるのかなと思ったのに…予想が外れた。すると、この 9 の指定は一体何なんだろう? 生成フレーム数を指定してるわけではない…?
その上、手元で生成した結果画像は、ドキュメントで紹介されてる画像とは見た目が全然違っていた。何故。
animateコマンドの仕様…よく分からないな…。
◎ animateコマンドは要らなかった :
その後色々試していたら、そもそも animate コマンドを使わなくても連番画像を保存できると分かった。
前述のギャラリーページから、distortion.gmic をコピペで作成して以下を打ってみた。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Gallery
連番画像 frame_000000.png - frame_000049.png が保存された。指定した出力ファイル名に、「_」 + 6桁の数字が自動で追加されて、連番画像ファイルになっている。
つまり、outputを指定することで、画像スタック(画像リスト)の中に入ってる全画像が保存されるのだろう…。たぶん。
すると、animateコマンドって一体何なのか?
おそらくだけど、G'MIC CLI によって表示された画像ウインドウ上で、画像スタックを自動で次々に表示してアニメーションとして見せる際のディレイ値を指定するだけのコマンド、なのかもしれない。ドキュメントにも「in a display window.」と書いてあるし…。
そして、現状のG'MICの実装状態と、animateコマンドのドキュメント内容は合ってないのではないかな…。ドキュメントに書いてある例を試しても同じ結果が出てこないし…。
まあ、何にせよ、animateコマンドは無理して使わなくてもいいらしい。使わなくてもアニメーションを保存することができる。
テストスクリプトを書いて実験してみた。少しずつぼかしを強くするスクリプトを、blur_anime.gmic として保存。
_blur_anime.gmic
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - resize
ffmpeg が利用できる環境なら、以下の指定で mp4 として保存することができる。
上記は以下を指定している。
出力ファイル名 out.mp4 の後ろになんか色々つけてあるけれど…。「mp4ファイル名,フレームレート,Videoフォーマット(Codec?)」といった指定ができるらしい。
VideoフォーマットにはYV12を指定しておいたほうが無難。YV12 は、YUV 4:2:0 Planar の指定。これを指定しないとWebブラウザ等で再生できないはず。
_fourcc: YV12
もし、動画ファイルではなく、連番画像を保存するなら以下のように指定する。
frame_000000.png, frame_000001.png, frame_000002.png ... といったファイル名で保存される。
余談。ffmpeg を使って連番画像を mp4 にするなら以下。
結果として以下のようなmp4動画が作成された。
これでたしかに、G'MICを使ってアニメーションを作成可能と分かった。
前述のギャラリーページから、distortion.gmic をコピペで作成して以下を打ってみた。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Gallery
gmic.exe distortion.gmic go output frame.png
連番画像 frame_000000.png - frame_000049.png が保存された。指定した出力ファイル名に、「_」 + 6桁の数字が自動で追加されて、連番画像ファイルになっている。
つまり、outputを指定することで、画像スタック(画像リスト)の中に入ってる全画像が保存されるのだろう…。たぶん。
- 画像スタック数が1個の場合、frame.png が保存される。
- 画像スタック数が2個以上の場合、frame_000000.png, frame_000001.png ... といった感じで、自動で連番画像として保存してくれる。
すると、animateコマンドって一体何なのか?
おそらくだけど、G'MIC CLI によって表示された画像ウインドウ上で、画像スタックを自動で次々に表示してアニメーションとして見せる際のディレイ値を指定するだけのコマンド、なのかもしれない。ドキュメントにも「in a display window.」と書いてあるし…。
そして、現状のG'MICの実装状態と、animateコマンドのドキュメント内容は合ってないのではないかな…。ドキュメントに書いてある例を試しても同じ結果が出てこないし…。
まあ、何にせよ、animateコマンドは無理して使わなくてもいいらしい。使わなくてもアニメーションを保存することができる。
テストスクリプトを書いて実験してみた。少しずつぼかしを強くするスクリプトを、blur_anime.gmic として保存。
_blur_anime.gmic
go :
resize[0] 360,240,1,3,6,0
nbf=48
repeat $nbf
echo[] "> Frame "{$>+1}/$nbf
+fx_blur_gaussian[0] {$>*0.25},0,0,1,7,2
done
remove[0]
- resize[0] で、入力画像をリサイズ(拡大縮小)できる。resize 幅,高さ,デプス数,チャンネル数,補間方式,境界処理、を指定できる。
- echo は、G'MIC CLI で動かした際にコンソールにメッセージを表示するためのコマンド。ここでは現在処理中のフレーム番号をメッセージ表示している。
- echo[] で、どの画像も対象にしないで処理をする指定になるらしい。メッセージを表示するだけだから、どれかしらの画像を対象にしつつ処理されてしまうと困るのだろう…。
- fx_blur_gaussian はガウシアンぼかしを行うコマンド。
- fx_blur_gaussian[0] で、[0] = 入力画像に対して処理をしろという指定になる。
- 行頭に「+」がついているのは、新しい画像を作成して画像スタックに入れろ、という指定。何もついてないか「-」がついていると入力画像([0])自体が処理後の画像で上書きされるけれど、この場合「+」がついているので、入力画像はそのまま残して、処理後の画像が画像スタックに追加されていく。
- remove[0]で入力画像を画像スタックから削除している。
_G'MIC - GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing - Reference Documentation - resize
ffmpeg が利用できる環境なら、以下の指定で mp4 として保存することができる。
gmic.exe blur_anime.gmic sample bottles go output out.mp4,24,YV12
上記は以下を指定している。
- スクリプト blur_anime.gmic を読み込んで、カスタムコマンド go を定義してから、
- サンプル画像 bottles を入力画像として読み込み、
- カスタムコマンド go を呼んで処理をして、
- 画像スタックの全画像を使って mp4 を作成する。
出力ファイル名 out.mp4 の後ろになんか色々つけてあるけれど…。「mp4ファイル名,フレームレート,Videoフォーマット(Codec?)」といった指定ができるらしい。
VideoフォーマットにはYV12を指定しておいたほうが無難。YV12 は、YUV 4:2:0 Planar の指定。これを指定しないとWebブラウザ等で再生できないはず。
_fourcc: YV12
もし、動画ファイルではなく、連番画像を保存するなら以下のように指定する。
gmic blur_anime.gmic sample bottles go output frame.png
frame_000000.png, frame_000001.png, frame_000002.png ... といったファイル名で保存される。
余談。ffmpeg を使って連番画像を mp4 にするなら以下。
ffmpeg -framerate 24 -i frame_%06d.png -vcodec libx264 -pix_fmt yuv420p -r 24 out.mp4
結果として以下のようなmp4動画が作成された。
これでたしかに、G'MICを使ってアニメーションを作成可能と分かった。
◎ 参考ページ :
[ ツッコむ ]
以上です。