GIMPでPython-Fuを使った画像処理①

GIMPPython-Fuを使った画像処理を試してみる。 まずはスクリプトGIMPに登録して画像を読み込むところまで。 最終的にはオリジナルcross filterをpython-fuで実行できるようにしたい。

参考にしたサイト: qiita.com

www.randynetwork.com

環境:

手順は以下の通り。

1. python-fuのソースコードを置くフォルダのパスを確認

gimpを起動し、メニューバーからアクセス 編集 > 設定 > フォルダー > スクリプト

ここに書いてあるパスにPython-Fuのソースコードを置くと、読み込まれる。 編集して好きなところにすることもできそう。

2. GIMPの起動モードをverboseに切り替え(やらなくても良い)

verboseモードにしておくと、うまくいかなかったときの助けになるかもしれない。 私はwindowsのタスクバーにGIMPのアイコンを登録しているので、 そこのショートカットのプロパティから実行時の引数を渡して設定した。 GIMPアイコンを右クリック > もう一度GIMPを右クリック > プロパティ GIMPプログラムのパスの最後に以下のオプションを追加。(""の外に書く)

--verbose --console-messages

3. お試しスクリプトを作成、python-fu置き場に置く

以下のプログラムを作成した。 ※画像サイズが大きいと処理に時間がかかるため、左上の(10x10 or 画像サイズ)の小さい方の画素のみアクセスしている。

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

####################
# import
####################
# gimpfu用
from gimpfu import *

# ファイル入出力用
import sys

####################
# parameters
####################

# --verboseなら%USER_PROFILE%のパス、
# 通常起動なら.xcfファイルがあるパスに出力される
OUTTXT_PATH = "stdout.txt"
PW = 10
PH = 10

####################
# method
####################

# 引数はregisterで登録するときに指定する。
# message: PF_STRING
# image: PF_IMAGE
# drawable: PF_DRAWABLE
def plugin_main(message, image, drawable):

    # verboseモードだとコンソールに出力され、
    # 通常モードだとエラーメッセージボックスとして表示される。
    # messageには呼び出し時にhello worldを渡している。
    gimp.message("Message: " + message)

    # ファイル書き出し用
    sys.stdout = open(OUTTXT_PATH, 'w')

    # ファイルにピクセル値を書き出し
    w = min(PW, drawable.width)
    h = min(PH, drawable.height)
    src_rgn = drawable.get_pixel_rgn(0, 0, w, h, False, False)
    for x in xrange(0, w):
        for y in xrange(0, h):
            p = map(ord, src_rgn[x, y])
            print x, ":", y, " -- ", "".join(map((lambda x: format(x, '02x')), p))


####################
# スクリプト登録
####################
# メニューバーの Filters > My にスクリプトを追加

prms = [
    (PF_STRING, "string", "Text string", 'Hello, world!'),
    (PF_IMAGE, "image",       "Input image", None),
    (PF_DRAWABLE, "drawable", "Input drawable", None)
    ]
register(
    "cross_filter",             # name
    "my cross filter",          # blurb (宣伝文句),
    "help: this is my filter",  # help
    "skattun",                  # author
    "(C) 2023 skattun",         # copyright
    "2023/5/5",                 # date
    "cross_filter",             # menupath(not use)
    "RGB*",                     # imagetypes
    prms,                       # params
    [],                         # results
    plugin_main,                # function
    menu = "<Image>/Filters/My")# menu path設定

####################
# main
####################
main()

登録する場所をFilters以下にすると、画像を開かないとスクリプトを実行できなくなる。以下のパスにするとメインメニューに登録され、 画像を開かなくても実行できるとのこと。(リンク参照)

menu="<Image>/PyPlgin"

このソースコードをhelloworld.pyという名前で保存してスクリプト置き場に保存

4. GIMPを起動して画像を読み込み、実行

お試し用の身代わり人形画像はこちら