GIMPでPythonを使ってプラグインを作れるとのことなので、以前から面倒だと思っていた「レイヤーを可視部分に合わせる」作業をプラグイン化した。
GIMPはGIMP 2.10.18
のバージョンを使用。
開発で使ったもの
コンソール
フィルター > Python-Fu > コンソール
でコンソールが起動する。コンソールでは対話形式でスクリプトが実行できる。
プロシージャブラウザ
コンソール画面で参照ボタンを押せばプロシージャブラウザが参照でき、実行可能な関数が確認できる。
なお、プロシージャブラウザに表示される関数名はチェーンケース(ハイフンつなぎ)で記載されているが、Pythonではスネークケース(アンダーバーつなぎ)に修正する必要がある。
また、関数はプロシージャデータベース(Procedual Database = pdb
)モジュールの関数として定義されているため、プレフィックスとしてpdb.
を付与する必要がある。
pdb
のほか、gimp
というモジュールも定義されており、プロシージャブラウザに記載の関数名から、先頭のgimp-
を除いた関数名を持っている。
サンプル
# | プロシージャブラウザの記載 | Pythonの関数名 |
---|---|---|
1 | gimp-image-list | pdb.gimp_image_list() |
2 | ^ | gimp.image_list() |
ただし、gimp
に定義されていない関数もあるので注意が必要。例えば、gimp-gradients-get-active
であれば、pdb.gimp_gradients_get_active
は存在するが、gimp.gradients_get_active
は存在しなかった。
各種参考サイト
IBM Developer
IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science...
PythonでGIMPのスクリプトを書く(Python-Fuの書き方)
.NET, UbuntuやWeb開発などの情報
Gimp Python Documentation
GIMP Developer - Reference for GIMP 2.0 API
コンソールでよく使うコマンド
1つめの画像の選択しているレイヤーを取得する
image = gimp.image_list()[0]
layer = image.active_layer
オブジェクトの持つ属性を確認する
dir(layer)
オブジェクトの持つ属性をのうち特定の文字列を含むものを確認する
サンプルではget
を含む属性を確認している
filter(lambda x: 'get' in x, dir(layer))
プラグインファイルの格納先
編集 > 設定 > フォルダー > プラグイン
で確認できる
C:\Users\%USERNAME%\AppData\Roaming\GIMP\2.10\plug-ins
作成したプラグインのソースコード
layer_resize.py
# coding: utf8
#!/usr/bin/env python
from gimpfu import *
def plugin_main(image, layer):
min_x = 65536
max_x = 0
min_y = 65536
max_y = 0
to_x = layer.width
step_x = int(layer.width/30)
to_y = layer.height
step_y = int(layer.height/30)
for w in range(0, to_x, step_x):
for h in range(0, to_y, step_y):
if (layer.get_pixel(w, h)[3] != 0):
if (min_x > w): min_x = w
if (max_x < w): max_x = w
if (min_y > h): min_y = h
if (max_y < h): max_y = h
offx = -(min_x-step_x)
offy = -(min_y-step_y)
width = (max_x+step_x) + offx
height = (max_y+step_y) + offy
layer.resize(width, height, offx, offy)
register(
proc_name = "layer_resize",
blurb = "レイヤーサイズをこの画像で見えている部分のサイズに合わせて縮小します",
help = "",
author = "",
copyright = "",
date = "",
label = "レイヤーを可視部分に合わせる",
imagetypes = "RGB*",
params = [
(PF_IMAGE, "image", "Input image", None),
(PF_DRAWABLE, "drawable", "Drawable", None)
],
results = [],
function = plugin_main,
menu = "<Image>/Layer")
main()