PythonではPILを使えば、簡単な画像処理は出来ます。実際にPythonで画像処理を書いていると、前処理、後処理にGIMPを使いたかったり、処理の結果をGIMPの出力と比較したい時があります。Pyrhonではsystem()等を使えば簡単に外部コマンドを実行出来ます。ところがGIMPは、コマンドラインから画像処理をさせると、処理がうまくいったときでも別にコマンドプロンプトを表示してしまいます。
これが出るたびにリターンキーを押すのは、望んでいる動作ではないので、Pythonで呼び出し方を変えてみました。動作環境はPython 2.6.6(win32)です。
入力画像はこれです。変換に使うスクリプトは、http://d.hatena.ne.jp/natsutan/20110611 のモノクロ化を使いました。
subprocess.Popen()を使う
今回使ったPythonのコードです。
わかりやすくするために、入力ファイル、出力ファイルは決めうちにしています。
#-*- coding: utf-8 -*- import sys import subprocess def main(): # gimpを起動するコマンド command_line = 'gimp-2.6 -i -f -g gimprc.txt --batch "(grayscale \\"foo.bmp\\" \\"foo_g.bmp\\")" --batch "(gimp-quit 0)"' # stdoutとstderrをpipeで受け取る。 cmd = subprocess.Popen(command_line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,) stdout_log = cmd.stdout.read() stderr_log = cmd.stderr.read() print stdout_log print stderr_log if __name__ == "__main__": main()
GIMPが出してくる別窓は標準エラー出力のようなので、標準エラー出力をpipeで受け取れば邪魔な窓は出てきません。
Popenに渡す文字列は、http://d.hatena.ne.jp/natsutan/20110611 から、少しエスケープの仕方が変わっています。
標準エラー出力を横取りできれば良いので、このようなやり方でも同じ効果があります。
#-*- coding: utf-8 -*- import sys def main(): # gimpを起動するコマンド command_line = 'gimp-2.6 -i -f -g gimprc.txt --batch "(grayscale \\"foo.bmp\\" \\"foo_g.bmp\\")" --batch "(gimp-quit 0)"' # stderrの出力先を変更 # system関数で呼び出されるプロセスにも効果がある。 sys.stderr = None os.system(command_line) # stderrの出力先を元に戻す。 sys.stderr = sys.__stderr_ if __name__ == "__main__": main()
実行結果
上のPopenを使った例では、このように表示されます。
Unable to read initialization file script-fu.init Unable to read initialization file script-fu.init batch command executed successfully Unable to read initialization file script-fu.init
画像もモノクロ画像に変換されています。