GIMPのPython-Fuで選択領域をスタンプで塗りつぶすプラグイン

コンピュータ

スタンプで塗りつぶす方向は左から右、右から左、上から下、下から上の4パターン。
スタンプに利用するブラシは現在のブラシを使うので、状況に合わせてブラシのサイズを調整すること。

プラグインスクリプトの保存場所は以下の記事参照

元画像

左から右へ

#!/usr/bin/env python
# coding: utf8
from gimpfu import *
from array import array
from time import time
def plugin_main(image, layer):
    # レイヤーの幅と高さを取得
    w = layer.width
    h = layer.height
    # 範囲選択を拡大
    pdb.gimp_selection_grow(image, 2)
    # 範囲選択を取得
    (non_empty,x1,y1,x2,y2) = pdb.gimp_selection_bounds(image)
    # 範囲選択されていない場合終了
    if (non_empty == 0):
        gimp.message("Not Select")
        return
    # ブラシのセット
    brush_size = pdb.gimp_context_get_brush_size()
    # ループ
    for y in range(y1, y2, int(brush_size/4)):
        src_x = -1
        src_y = -1
        # 色取得ループ
        for x in range(x1, x2):
            r = pdb.gimp_selection_value(image, x, y)
            if (r != 0):
                src_x = x - 1
                src_y = y
                break
        # クローン
        pdb.gimp_clone(layer, layer, 0, src_x, src_y, 4, [x1, y, x2, y])
        # プログレスバー更新
        gimp.progress_update(float(y-y1)/float(y2-y1))
    # ガウシアンフィルタ
    pdb.plug_in_sel_gauss(image, image.active_drawable, 5.0, 51)
    # レイヤーの更新
    layer.flush()
    layer.update(0,0,w,h)
register("LineFillLR", "", "", "", "", "",
    "ライン塗左右", 
    "RGB*",
    [
    (PF_IMAGE, "image", "Input image", None),
    (PF_DRAWABLE, "drawable", "Drawable", None)
    ],
    [],
    plugin_main,
    menu = "<Image>/Filters")
main()

右から左へ

#!/usr/bin/env python
# coding: utf8
from gimpfu import *
from array import array
from time import time
def plugin_main(image, layer):
    # レイヤーの幅と高さを取得
    w = layer.width
    h = layer.height
    # 範囲選択を拡大
    pdb.gimp_selection_grow(image, 2)
    # 範囲選択を取得
    (non_empty,x1,y1,x2,y2) = pdb.gimp_selection_bounds(image)
    # 範囲選択されていない場合終了
    if (non_empty == 0):
        gimp.message("Not Select")
        return
    # ブラシのセット
    brush_size = pdb.gimp_context_get_brush_size()
    # ループ
    for y in range(y1, y2, int(brush_size/4)):
        src_x = -1
        src_y = -1
        # 色取得ループ
        for x in range(x2-1, x1-1, -1):
            r = pdb.gimp_selection_value(image, x, y)
            if (r != 0):
                src_x = x + 1
                src_y = y
                break
        # クローン
        pdb.gimp_clone(layer, layer, 0, src_x, src_y, 4, [x2-1, y, x1-1, y])
        # プログレスバー更新
        gimp.progress_update(float(y-y1)/float(y2-y1))
    # ガウシアンフィルタ
    pdb.plug_in_sel_gauss(image, image.active_drawable, 5.0, 51)
    # レイヤーの更新
    layer.flush()
    layer.update(0,0,w,h)
register("LineFillRL", "", "", "", "", "",
    "ライン塗右左", 
    "RGB*",
    [
    (PF_IMAGE, "image", "Input image", None),
    (PF_DRAWABLE, "drawable", "Drawable", None)
    ],
    [],
    plugin_main,
    menu = "<Image>/Filters")
main()

上から下へ

#!/usr/bin/env python
# coding: utf8
from gimpfu import *
from array import array
from time import time
def plugin_main(image, layer):
    # レイヤーの幅と高さを取得
    w = layer.width
    h = layer.height
    # 範囲選択を拡大
    pdb.gimp_selection_grow(image, 2)
    # 範囲選択を取得
    (non_empty,x1,y1,x2,y2) = pdb.gimp_selection_bounds(image)
    # 範囲選択されていない場合終了
    if (non_empty == 0):
        gimp.message("Not Select")
        return
    # ブラシのセット
    brush_size = pdb.gimp_context_get_brush_size()
    # ループ
    for x in range(x1, x2, int(brush_size/4)):
        src_x = -1
        src_y = -1
        # 色取得ループ
        for y in range(y1, y2):
            r = pdb.gimp_selection_value(image, x, y)
            if (r != 0):
                src_x = x
                src_y = y - 1
                break
        # クローン
        pdb.gimp_clone(layer, layer, 0, src_x, src_y, 4, [x, y1, x, y2])
        # プログレスバー更新
        gimp.progress_update(float(x-x1)/float(x2-x1))
    # ガウシアンフィルタ
    pdb.plug_in_sel_gauss(image, image.active_drawable, 5.0, 51)
    # レイヤーの更新
    layer.flush()
    layer.update(0,0,w,h)
register("LineFillUD", "", "", "", "", "",
    "ライン塗上下", 
    "RGB*",
    [
    (PF_IMAGE, "image", "Input image", None),
    (PF_DRAWABLE, "drawable", "Drawable", None)
    ],
    [],
    plugin_main,
    menu = "<Image>/Filters")
main()

下から上へ

#!/usr/bin/env python
# coding: utf8
from gimpfu import *
from array import array
from time import time
def plugin_main(image, layer):
    # レイヤーの幅と高さを取得
    w = layer.width
    h = layer.height
    # 範囲選択を拡大
    pdb.gimp_selection_grow(image, 2)
    # 範囲選択を取得
    (non_empty,x1,y1,x2,y2) = pdb.gimp_selection_bounds(image)
    # 端は無理
    if (x1 == 0 or y1 ==0 or x2 == (w-1) or y2 == (h-1)):
        gimp.message("Out of range")
        return
    # ブラシのセット
    brush_size = pdb.gimp_context_get_brush_size()
    # ループ
    for x in range(x1, x2, int(brush_size/4)):
        src_x = -1
        src_y = -1
        # 色取得ループ
        for y in range(y2-1, y1-1, -1):
            r = pdb.gimp_selection_value(image, x, y)
            if (r != 0):
                src_x = x
                src_y = y + 1
                break
        # クローン
        pdb.gimp_clone(layer, layer, 0, src_x, src_y, 4, [x, y2-1, x, y1-1])
        # プログレスバー更新
        gimp.progress_update(float(x-x1)/float(x2-x1))
    # ガウシアンフィルタ
    pdb.plug_in_sel_gauss(image, image.active_drawable, 5.0, 51)
    # レイヤーの更新
    layer.flush()
    layer.update(0,0,w,h)
register("LineFillDU", "", "", "", "", "",
    "ライン塗下上", 
    "RGB*",
    [
    (PF_IMAGE, "image", "Input image", None),
    (PF_DRAWABLE, "drawable", "Drawable", None)
    ],
    [],
    plugin_main,
    menu = "<Image>/Filters")
main()

追記:20230609
スタンプする座標がずれていたので修正。

コメント