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).
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_script
をgimp-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を終了している。