ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

PythonからGIMPを使う

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

画像もモノクロ画像に変換されています。