[メモ] GIMPでscript-fuを使ってバッチ処理をしようとしたときのアレコレ

単にメモ書きとして残しておくだけなので、このブログ記事は文章としてまとまりがないです。そのうちちゃんとまとめるかも?



画像ファイルが100個あって、この全てに同様の画像処理を行うこととします。
いわゆるバッチ処理(一括処理)と呼ばれる操作を行うわけです。
バッチ処理をするわけなので、ディレクトリ内のファイルをGIMP側へ渡す必要があります。GIMPのバッチモードではコマンドラインからいくつか引数を渡すことが出来るので、これを用います。
で、ディレクトリ内のファイルをまとめて扱えるgimpプラグインとして「file-glob」というのがあるので、これを用います。

で、全てのファイルに同じ処理をするにはこれで特に問題なかったわけです。
その次に、連番のファイル名になっているファイルに1つずつ操作の変数が異なる処理をやろうとしたら、なかなかうまくいってくれない…。

何がうまくいかないかというと、どうやらfile-globというプラグインで連番のファイルを読み込ませても、処理される順番は連番ではなくバラバラに実行されるようだということ。

簡単に説明すると、
1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg
の5つのファイルに対し
a処理, b処理, c処理, d処理, e処理
の処理をそれぞれ適用しようとしています。想定では
1-a.jpg, 2-b.jpg, 3-c.jpg, 4-d.jpg, 5-e.jpg
(ファイル名-処理名.拡張子という記述)
となってくれるものと思ってました。
ただ、バラバラに処理が実行されるため
3-a.jpg, 1-b.jpg, 5-c.jpg, 4-d.jpg, 2-e.jpg
みたいなファイルが出来上がってしまうという始末。

これはイケマセン。まぁfile-globというプラグインではファイル名のリスト作成が行われているようなので、単にリスト内の並びを連番でソートしてしまえばよさそうです。
ただ困ったことにscript-fuというか言語であるtinyschemeでどうやってソートすればいいかが分からず…。ソート関数があれば一発で解決出来そうなのですがいまのところこれといった情報が見つからない…。無いなら無いで、ソートアルゴリズムでソート処理を組んでいけばいいのでしょう。ちょっとめんどうそうなので現状ではこれは保留。

で、少し考えたところ、無理にGIMPでバッチ処理しないでシェルから1つずつ処理を実行させるようシェルスクリプトを組めばいいということを思いつきました。これなら確実に連番のファイルに変数を割り当てて処理させられます。
しかし、どうもこれはあまり処理速度が速くない…。100個程度のファイルなら許容範囲ですが処理させたいのが3000個ほどあるので、これでは時間的に現実的ではないです(終わるまで4時間くらいかかりそう)。
 (ただGIMPのバッチ処理の方なら現実的なのか?というのはまだ調べてはいないです)

またscript-fuではなくpython-fuならリストの扱いも簡易に出来そうとも思います。

というわけで、もうちょい試行錯誤でやっていってみます。



追記 2018年10月9日
バッチ処理、うまくいきました。まぁなんのことはなく、連番ファイル指定で「file-glob」ではない方法を使えばすんなりいきました。ファイル指定といっても、プログラミングとしてはファイル名という文字列さえ渡すよう処理を組めばいいわけです。
前段階として、script-fuとは別でディレクトリ内のファイルのファイル名を連番にする必要が出てきますが、これはシェルスクリプトで処理すればいいでしょう。
script-fu内では、ループカウンタを利用して文字列操作でファイル名として組み上げてプログラム側に渡せばOK。

処理時間としてはファイル数3000個が45分で済みました。4時間かかりそうだったのから考えると大幅な短縮が出来たかなと。
ただ処理中のメモリー消費が多いのが少し気になる点。それでも実メモリーの50%くらい(6GB)くらいに到達してからはそれほど消費されなくなっていたので、処理中にメモリー不足に陥ることは無さそう?かなと。

で、何を作っていたかと言うと
以下のようなタイムラプス動画の撮影時の画像ファイルに変形処理を行ない

下のような球状オブジェクト画像を作ります。これを全ての撮影画像ファイルに対して行う必要があるので、バッチ処理を組んだわけです。

最後に出来上がったファイル群をffmpegで連結して動画にしたものが次の動画です。


実はこの球体、それ自身で回転しているんですよ、分かり難いですが。これ、回転させない球体で作る場合なら、file-globを用いる方法でも作れちゃいます。しかし回転させるにはファイルの連番に従って回転角度も指定する必要があります。その時に連番ではなくバラバラに処理されてしまうと、適用される回転角度もバラバラになってしまい出来上がる動画がおかしいことになってしまいます。
なかなか思ったとおりに作り上げるのは難しいですが、少しずつやり方を学んで経験値を積んでいけばいつかは思ったとおりのモノが作れる、…かも知れないですし、三日坊主で放り出すかも知れない。継続は力なりー。



そのまた追記 2018年10月9日
球体だと回転が分かり難かったので立方体で作り直してみました。

球体のときと同じファイル数の処理をしましたが、立方体画像作成に要した時間は1時間50分強。球体のときと比較すると約3倍の時間がかかっています。まぁ立方体の各面に当てはまるよう画像変形処理が必要なので、変形工程数だけで比較してもまぁ処理時間としてはそんなものかなと。
もうちょっと工夫すれば、立方体の各面に違う動画の当てはめも出来ます。




コメント

スポンサーリンク


このブログの人気の投稿

gnuplotでプロットなどの色をcolornameの指定で変更する

catコマンドの出力を行番号付きにするためのコマンドラインオプション(-n, -b)

Ubuntu Softwareが起動しないのでいろいろと調べてみる(Ubuntu 20.04.1 LTS)

gnuplot : グラフにグリッド線を描く方法(set grid)

gnuplot : プロット画像のサイズ指定について(set sizeとの違い)