GIMPでPython-Fuを使って「レイヤーを可視部分に合わせる」を作成する

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開発などの情報
https://www.gimp.org/docs/python/#plugin_framework
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()
タイトルとURLをコピーしました