スタンプで塗りつぶす方向は左から右、右から左、上から下、下から上の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
スタンプする座標がずれていたので修正。
コメント