Python-Fu入門 | PythonでGIMPをCUIを通して自動化する方法のまとめ

僕は普段画像編集をする時にGIMPを使っているが、画像の加工がパターン化して退屈なルーティンワークになっている場合がある。

GIMPには「Python-Fu」というPythonが組み込まれており、これを使うことでPythonを使ってGIMPの作業を自動化できるようになっている。

ただし、Python-Fuの情報が日本語・英語問わずあまりなく苦労したので、この記事では以下の事をまとめていく。

  • Python-Fuとは何か
  • Python-Fu Hello World
  • Python-Fuで使える機能の紹介
  • Python-Fuで自動化する

筆者の環境

以下は、筆者の開発環境の紹介。

  • Gimp 2.10.34
  • Windows11

Python-Fuとは何か?

Python-Fuは、GIMPに組み込まれたPythonであり、こいつを通して「GIMPのプラグインを作ったり、コンソールからスクリプトを実行」したり できるもの。

似たような物にScript-Fuがあるが、これはSchemeの処理系で動いているもの。 しかし、Script-FuはUnicode非対応であり日本語が使えない欠点があるので、素直にPython-Fuを使った方が良い。

Python-Fuは、Python2(3ではない)を使っているため、Python3に慣れ親しんだ人からすると少し苦労する。

補足: GIMPバージョン3からはPython3に移行する?

Gimpのリリースノートによると、GIMP3からPythonのバージョンを3にあげる予定とのこと。ただし、ライブラリのAPIがガラッと変わるので、しばらくは GIMP2を使ってPython2でスクリプトを書いた方が良いだろう。

以下はリリースノートに記載された内容を引用する。

>

Former Python 2 specific API (pygimp) has now been fully removed and all former Python plug-ins have been ported to Python 3 and new GIMP 3 API (this work started over a year ago and is now finished, with a lot of help from Elad Shahar). The new way to make Python plug-ins is streamlined, following the same logics as for other supported languages (C/C++, Python 3, Lua, Vala and Javascript so far).

GIMP 2.10.22 Released - GIMP

Python-FuでHello Worldをする

では、Python-Fuの説明を終えた所で、Python-FuでHello Worldをしていこう。

1.gimp-consoleを触ってみる

通常GIMPはGUIで動かすアプリだが、実はコンソールから動かすような仕組みも用意されている。

それがgimp-consoleというもの。GIMPをインストールしたディレクトリのbinディレクトリにあるので、PATHを通しておく。 (筆者の環境ではC:\Program Files\GIMP 2\binにあった。)

実際にはgimp-console-2.10.exeの様にバージョン番号が末尾についている。PATHを通した後は、以下のコマンドを実行してみる。

gimp-console-2.10.exe --version

GNU Image Manipulation Program version 2.10.34

バージョン番号が表示されたはずだ。では、次のコマンドを実行してGIMPを起動してみる。

gimp-console-2.10.exe --verbose --batch-interpreter python-fu-eval --batch "pdb.gimp_quit(1)"

たくさんログが表示された後に、何も起こらずに終了したはず。ログを見てみると、色々な設定ファイル等を読み込んでGIMPを 起動させているのがわかる。

上記のコマンドでは色々なオプションを付けているが、それぞれ以下の役割がある。

  • --verbose GIMPに関する詳細なログを表示する
  • --batch-interpreter python-fu-eval インタプリタにPythonを指定
  • --batch "pdb.gimp_quit(1)" GIMPに送るスクリプト。ここではGIMPを終了させただけ。

他のオプションについては以下のページが詳しい。

参考: 第2章 Fire up GIMP

2.Python-FuでHello Worldしてみる

gimp-consoleの事が分かった所でPython-FuのHello Worldをやってみよう。

まずはPythonのコードを以下の様に書く。

# hello.py
import subprocess

gimp_script = r"""
# -*- coding: utf-8 -*-

from __future__ import print_function, unicode_literals
import sys
from gimpfu import *

print("Hello GIMP!!!")
print("Gimpのバージョンは " + str(pdb.gimp_version()))
print("Pythonのバージョンは " + str(sys.version))

pdb.gimp_quit(1)
"""

commands = [
    "gimp-console-2.10.exe",
    "--batch-interpreter",
    "python-fu-eval",
    "--batch",
    gimp_script,
]

process = subprocess.Popen(commands, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()

output = stdout.decode().strip()
print(output)

保存したら実行してみる。

py hello.py

Hello GIMP!!!
Gimpのバージョンは 2.10.34
Pythonのバージョンは 2.7.18 (default, Jan 14 2023, 22:21:24)  [GCC 12.2.0 64 bit (AMD64)]

上記のコードでは以下の事をやっている。

  • gimp_scriptでPython-Fuに読み込ませるコードを書く
  • subprocessを通してgimp-consoleを実行する。
  • その時にgimp_scriptgimp-consoleに渡してあげる。

このhello.py自体はPython3で書かれているが、gimp_script変数内にあるコードは gimp-consoleに渡して実行するものなので、Python2で書かれている。

ポイントとなるのは、下記のように記述してUnicode対応にすること。

# -*- coding: utf-8 -*-

from __future__ import print_function, unicode_literals

昔の言語あるあるだがPython2はUnicode対応が後付けであり、以下の記述をすることで Python3の様に文字列を扱えるようになる。

また、print_functionもPython2と3で少し違うprintの挙動をPython3のように修正してくれる。

そして重要なのが以下の部分。

from gimpfu import *

pdb.gimp_version()
pdb.gimp_quit(1)

from gimpfu import *では、GIMPを操作するのに役立つオブジェクトや関数をimportしてくれる。

そして、pdbオブジェクトが GIMPのAPIを担っており、GIMPからデータを取得したり、GIMPの操作を行える ようになっている。

pdb.gimp_version()でGIMPのバージョンを取得しており、pdb.gimp_quit(1)ではGIMPを終了している。