2008-05-21
■ [編集][補助]WindowsのGIMPで複数ファイルを自動処理する

追記(7/24)
WindowsのGUIでも使える「David's Batch Processor」と言うのがあるようです。自動カラー補正やアンシャープマスクなどを一律に掛けられるようなので、これを使いましょう。
下記はDBPではできない事をやりたい時だけ用いましょう。
概要
GIMPにはアクションレコーダが存在せず、またバッチ処理用にScript-Fuと言う機能は存在するがSchemeで書かないといけない為に難解*1であり、かと言ってアクションレコーダなScript-Fuも存在しない*2為に「GIMPを用いて複数ファイルを対象としたバッチ処理をする」のは異様にめんどくさいものである訳だが*3、何か閑だったので「複数ファイルを自動補正処理して書き出す何か」を書いてみた。
ちなみに書いたやつなんだが、自分の環境ではScript-Fuの関数内でimage,drawableをdefineしないとUnbound Variableが返ってきてしまい処理できなかった。スマートじゃないなあ……と言うかファイルを開くだけなのに相当な時間取られてしまった。こういうのはバッドノウハウじゃよー。
とりあえずかなりダサい実装なので、もっと気の利いた方法があったら教えて頂けると喜びます。俺が。
免責
本文の記述を元に行われた全ての作業より発生した事象について、筆者は全ての責任を負わないものとします。(棒読み)
必要なもの
実行においては、
書き直しについては、
と言うところ。Perlの知識は別にいらない、「掛ける処理名」のところを任意名に変更するくらいだろうか。
使い方
- 「gimp-batch.pl」を%PATH%に含まれるディレクトリへ配置する。
- 「my-image-normalize.scm」を%HOMEDRIVE%%HOMEPATH%\.gimp-2.4\scripts\へ配置する。
- cmd.exeを起動し、処理対象のファイルが詰まっているディレクトリへ移動。
- 引き続き「gimp-batch.pl」をコマンドプロンプトより実行。
動作
「gimp-batch.pl」で、取得されたファイルリストを使って一括処理用の「run-all.scm」を生成し、それをGIMPのバッチモードで実行している。生成されるコードは以下のようなもので、力技過ぎワロタと言う感じ。
(define (run-all) (my-image-normalize "H:\\tmp\\test\\seq2\\imas_0000.bmp" "H:\\tmp\\test\\seq2\\new\\imas_0000.bmp") (my-image-normalize "H:\\tmp\\test\\seq2\\imas_0001.bmp" "H:\\tmp\\test\\seq2\\new\\imas_0001.bmp") (my-image-normalize "H:\\tmp\\test\\seq2\\imas_0002.bmp" "H:\\tmp\\test\\seq2\\new\\imas_0002.bmp") : (my-image-normalize "H:\\tmp\\test\\seq2\\imas_7978.bmp" "H:\\tmp\\test\\seq2\\new\\imas_7978.bmp") (my-image-normalize "H:\\tmp\\test\\seq2\\imas_7979.bmp" "H:\\tmp\\test\\seq2\\new\\imas_7979.bmp") (my-image-normalize "H:\\tmp\\test\\seq2\\imas_7980.bmp" "H:\\tmp\\test\\seq2\\new\\imas_7980.bmp") (gimp-quit 0) ) (script-fu-register "run-all" "/Xtns/Script-Fu/misc/run-all" "dummy for batch" "null" "null" "2000" "" )
改造と言うか任意処理の追加について
実際にスクリプトを書き始める前に画像を1枚使って、処理を見た目で確認する事。ここで使ったパラメータを後で書くスクリプトへのパラメータとして使用する*4ので、メモっておくと幸せになれるかも。
と言う流れなので、Procedure Browserから使いたい処理を検索して、適宜パラメータを与えて「処理を書く」のところへ記述すればいい。言うまでも無い事だけど、上に書いた処理から実行されて、下にある処理は上の処理の結果を受けたものを処理する形になる。
注意事項
- Windows XPの場合。MacとかLinuxとかだとまた違うのかも判らない。
- 極めて遅い。1280x720のBMPを処理させたところ、660枚/25分と言う結果。plug-inな処理の別プロセス生成処理オーバーヘッドが大きい?ような気がする*5。自動色補正掛けるだけだったらPhotoshop Elementsの方が圧倒的に速い、けどあっちもそれほど安定している訳でもない。
- 660ファイル処理したところでGIMPの確保メモリが2GBを突破して落ちたので、500ファイルくらいに抑えておくのが賢明。64bit版が欲しいなあ。
参考文献
「GIMP の batch mode が上手く動かないよ~」→「その程度の処理ならImagemagick使えよ。このバカ」みたいな流れがパターン化してる気がしてきた。
これには完全に同意せざるを得ない。ImageMagickって自動HSV伸張あったっけ?
gimp-batch.pl - 一括処理用フロントエンドとしてのPerlスクリプト
実行時のカレントディレクトリ内にあるBMPファイルを一括取得して、(無い場合は作成し)newディレクトリへ処理結果を出力する、と言う流れ。%PATH%に含まれるディレクトリへ配置するか、フルパス実行で。
追記(7/24):一部記述誤りを修正。
use encoding 'shiftjis'; use strict; use warnings; # 掛ける処理名 my $sf_proc = 'my-image-normalize'; # Script-Fuのスクリプト置場 (基本的に%HOMEDRIVE%%HOMEPATH%\.gimp-2.4\scripts\) my $sf_dir = $ENV{'HOMEDRIVE'} . $ENV{'HOMEPATH'} . '\\.gimp-2.4\\scripts\\'; # 一括処理用のSchemeスクリプト名 my $dummy = $sf_dir . 'run-all.scm'; # GIMP コマンドラインオプション my $gimp = 'gimp-2.4.exe --no-interface --no-data --no-fonts --batch'; # カレントディレクトリの取得 my $path = qx{chdir}; $path =~ s/\\/\\\\/g; chomp $path; # 処理対象全ファイル取得 my @files = glob "*.bmp"; # 一括処理用の一時スクリプト作成 open my $out, '>', "$dummy"; print $out "(define (run-all)\n"; foreach (@files) { my $src = $path . '\\\\' . $_; my $dst = $path . '\\\\new\\\\' . $_; print $out "\t($sf_proc \"$src\" \"$dst\")\n"; } print $out <<'TAIL'; (gimp-quit 0) ) (script-fu-register "run-all" "/Xtns/Script-Fu/misc/run-all" "dummy for batch" "null" "null" "2000" "" ) TAIL close $out; # 出力 if (!-d 'new') {mkdir 'new';} system qq{$gimp "(run-all)"}; __END__
my-image-normalize.scm - Script-Fuで実行されるSchemeスクリプト
※%HOMEDRIVE%%HOMEPATH%\.gimp-2.4\scripts\へ配置して下さい。
BMPファイルを開いて、自動正規化して、自動HSV伸張して、アンシャープマスクを掛けて、別ディレクトリへBMPで保存する、と言うだけの処理。自動ホワイトバランス補正も入れてみたけれど、コマ毎にバタつくのでコメントアウトしている。
(define (my-image-normalize inFile outFile) ; Load an image (define image) (set! image (car (file-bmp-load 1 inFile inFile))) ; get drawable (define drawable) (set! drawable (car (gimp-image-active-drawable image))) ; color normalize (plug-in-normalize 1 image drawable) ; hsv-auto-stretch (plug-in-autostretch-hsv 1 image drawable) ; whitebalance ; (gimp-levels-stretch drawable) ; sharpness (plug-in-unsharp-mask 1 image drawable 1.0 0.5 40) ; save file (file-bmp-save 1 image drawable outFile outFile) ) ; Register our script with script-fu. (script-fu-register "my-image-normalize" "/Xtns/Script-Fu/misc/my-image-normalize" "image normalizer" "Hide" "Hide" "2008" "" SF-VALUE "inFile" "\"hoge.bmp\"" SF-VALUE "outFile" "\"new\\hoge.bmp\"" )