Windows版GIMP3.0をインストールしましたので、そちらでPython-Fuのプラグインスクリプトを動作させるべく、色々情報集めをし、試した結果をまとめて行きたいと思います。
はじめに
GIMPを使う目的はひとそれぞれ、写真の加工に使う人もいれば、広告やポスターなどのデザインツールとして使ったり、イラストなどアートツールとして使う人もいるでしょう。有償ソフトに匹敵するとは言い切れませんが、非常に多機能で多くの人に有用なソフトであることは間違いありません。
さて、筆者個人の使い方と言いますと、動画素材として既存の静止画から、不要な部分の消去(インペイント)だったり、パーツごとにレイヤー分けしたり、結果欠損部分の加筆を行ったりする様な用途に使っています。新しい物を作るというより、既存の作品を再編集することに近い作業になると思います。
そうなると比較的、特定の機能をきめられた順番で呼び出すことが多く、ショートカットキーなどを駆使することに成りますが、指がつりそうになります。また、たまにしか使わない機能は手順を忘れがちになります。
よく使う手順を登録しておき、呼び出して実行する機能がGIMPにも備わっており、その手順はpython言語で記述することが出来ます。
こちらの記事ではその方法を調べ、実践した結果をまとめた記事になる予定です。気が向いたら随時更新の予定です。
pythonコンソールの起動
メインメニューで
フィルター(R)→Development→Python-Fu→Python Console
python-fuはpythonでGIMPを構成するオブジェクトを操作することで、手順の自動化などを行うことが目的となります。
GIMP内のpythonを使い対話形式で実行するのが、こちらのコンソールとなります。こちらのコンソールからGIMPのオブジェクトを扱うことが出来るので、プロシージャブラウザで使えそうなプロシージャを検索し、こちらのコンソールで試すことが、開発の基本手順に成りそうです。
pythonコンソールでアクティブレイヤーの取得
GIMPのプロシージャ(関数)はImage(Drawable)やlayerオブジェクトを引数に取るケースが多いので、pythonコンソールで現在選択しているアクティブレイヤーを取得する方法を調べて見ました。
# いま開いている画像(先頭=通常は現在の画像)
img = Gimp.get_images()[0]
# 選択中レイヤー(複数選択に対応)
sel_layers = img.get_selected_layers()
# “従来の active_layer 相当”を 1 枚だけ欲しい場合
layer = sel_layers[0] if sel_layers else None
print(layer.get_name() if layer else "no layer")
# 背景←レイヤー名が表示されると成功
後はプロシージャブラウザでプロシージャを探し、コンソールで試す旅が始められます。
プロシージャブラウザの起動
メインメニューで
ヘルプ(H)→プロシージャブラウザ(B)
プロシージャブラウザで
gimp-edit-named-cut
の場合、Python-Fuでは
Gimp.edit_named_cut()
の様に最初のgimpがGimpオブジェクトに相当し、その後の-(ハイフン)は_(アンダーバー)に読み替える感じです。(曖昧)
PyGObject API Reference
プラグインの登録
対話型コンソールでもpythonスクリプトを実行することが出来ますが、毎度コンソールを建て上げてコードを用意するのは面倒です。
定型的なスクリプトはプラグインとして登録しフィルターメニューから呼び出して実行出来ると便利です。
プラグインファイルを保存するディレクトリは設定のフォルダから確認出来ます。
筆者の環境では以下のパスに成ります。
C:\Users\ユーザー名\AppData\Roaming\GIMP\3.0
そちらにプラグイン用のサブディレクトリを作成し、そちらにスクリプトを保存します。
プラグイン用のスクリプトは結構、メニューの登録やオプションダイアログなど、お作法的な部分も多いですが、とりあえず動けば良いという個人向けであれば、動作実績のある簡単なスクリプトを参考にすれば、色々なプラグインが作れると思います。
メモ帳を起動するプラグイン
pythonのsubprocessが使えるようなので外部コマンドの起動のサンプルとしてメモ帳(notepad.exe)を起動するプラグインを作成してみました。
#!/usr/bin/env python3
# GIMP 3 (Python-Fu) : notepad.exe を起動する
import sys, gi, subprocess
gi.require_version('Gimp', '3.0')
from gi.repository import Gimp
PROC = "python-fu-run-notepad"
def run(proc, run_mode, image, drawables, config, data):
try:
# Windows のメモ帳を起動(PATH 上にある想定)
subprocess.run(["notepad.exe"])
Gimp.message("notepad.exe を起動しました。")
return proc.new_return_values(Gimp.PDBStatusType.SUCCESS, None)
except Exception as e:
Gimp.message(f"起動失敗: {e}")
return proc.new_return_values(Gimp.PDBStatusType.EXECUTION_ERROR, None)
class RunNotepad(Gimp.PlugIn):
def do_query_procedures(self):
return [PROC]
def do_create_procedure(self, name):
if name != PROC:
return None
p = Gimp.ImageProcedure.new(self, name, Gimp.PDBProcType.PLUGIN, run, None)
p.set_menu_label("Run Notepad")
p.add_menu_path("<Image>/Filters/My") # 画像を開いている時に表示
p.set_documentation(
"Launch notepad.exe via subprocess",
"外部の notepad.exe を起動するサンプル(ImageProcedure版)",
"run_notepad.py"
)
p.set_attribution("Your Name", "Public Domain", "2025")
# 画像が必要なメニュー配下なので image types を指定
p.set_image_types("*")
# 描画対象が選べる状態で有効化(最低限の感度)
p.set_sensitivity_mask(Gimp.ProcedureSensitivityMask.DRAWABLE)
return p
Gimp.main(RunNotepad.__gtype__, sys.argv)
メモ帳の終了を待つプログラムになっています。画像の加工プログラムを自作して外部プロセスとして呼び出す目処が立ちました。
Python-Fuのコンソールから現在開いている画像をエクスポート
注意、アクティブレイヤーではなく現在見えている状態がそのままPNG形式でエクスポートされます。
# 現在開いている0番目の画像を取得
img = Gimp.get_images()[0]
# 出力先の画像ファイルのパスオブジェクトの生成
out = Gio.File.new_for_path("h:/out.png")
# 画像の保存(エクスポート)
Gimp.file_save(Gimp.RunMode.NONINTERACTIVE, img, out, None)
PNGファイルをインポートしレイヤーとして画像に追加
# 追加先の画像(先頭のXCF)
img = Gimp.get_images()[0]
# 読み込みたいファイル
f = Gio.File.new_for_path("H:/out.png")
# レイヤーとして読み込む
new_layer = Gimp.file_load_layer(Gimp.RunMode.NONINTERACTIVE, img, f)
# 画像に挿入(インデックス0で一番上に追加)
img.insert_layer(new_layer, None, 0)
コメント