Hatena::Groupnicovideo

にわかな奴の砂場

    使えそうなものがあれば適当にどうぞ。(自己責任的な意味で) 過去ログ

2008-05-21

[][]WindowsGIMPで複数ファイルを自動処理する 01:28 WindowsのGIMPで複数ファイルを自動処理する - にわかな奴の砂場 を含むブックマーク はてなブックマーク - 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が返ってきてしまい処理できなかった。スマートじゃないなあ……と言うかファイルを開くだけなのに相当な時間取られてしまった。こういうのはバッドノウハウじゃよー。

とりあえずかなりダサい実装なので、もっと気の利いた方法があったら教えて頂けると喜びます。俺が。

免責

本文の記述を元に行われた全ての作業より発生した事象について、筆者は全ての責任を負わないものとします。(棒読み)

必要なもの

実行においては、

  • ActivePerl。5.8.8で動作確認。
  • GIMP。2.4で動作確認。ちなみにProcedure Browserが無いと処理が書けない(リファレンス的な意味で)。

書き直しについては、

  • 英語。Procedure Browserの内容が何となく読める程度の。
  • Schemeの知識。とりあえず関数呼出・定義くらいは何となく判る程度の。

と言うところ。Perlの知識は別にいらない、「掛ける処理名」のところを任意名に変更するくらいだろうか。

使い方

  1. gimp-batch.pl」を%PATH%に含まれるディレクトリへ配置する。
  2. 「my-image-normalize.scm」を%HOMEDRIVE%%HOMEPATH%\.gimp-2.4\scripts\へ配置する。
  3. cmd.exeを起動し、処理対象のファイルが詰まっているディレクトリへ移動。
  4. 引き続き「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ので、メモっておくと幸せになれるかも。

とりあえず今回のScript-Fuスクリプト

  • 入力ファイルを開く(file-*-load 或いは gimp-file-load)
  • 処理を書く(いろいろ)
  • 出力ファイルへ書き出す(file-*-save 或いは gimp-file-save)

と言う流れなので、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\""
)

*1UNIX系ならGIMP-Perlとかある。Windowsには無い

*2:古いGIMPで動くものはあった気もする

*3:ググってもズバリ、ってのにヒットする事は無かった印象。日本語資料少ないしね……

*4:アンシャープマスクとか

*5プラグインは個別のexeファイルとして存在