0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GIMP Python-Fuでパスを使用して直線・曲線を描く時に、最後を閉じないと線の欠けが発生する

Last updated at Posted at 2019-12-06

#1.はじめに

前回(GIMP Python-Fuでパスを作成して曲線を描画する - Qiita)、「closedをFALSEにした場合、閉じる線を描いて消したような不自然な線の欠けが発生します。」と書いた件です。
gimp_vectors_stroke_new_from_points()の第5引数closedをFALSEにして、gimp_drawable_edit_stroke_item()で描画すると、線の太さが1でない場合に描画されない閉じる線と交わる部分でずれて欠けました。
どれかの関数の引数を変更したり、何か関数を追加で呼べばよいのかもしれませんが、現状分かっていません。

いろいろ描画してどう欠ける(ずれる)のかを調べてみました。
GIMP 2.10で動作確認をしています。

#2.実行結果

スクリプトは後に載せています。
上から順に、width=1~10です。小数は未確認です。
※追記:1列追加しました。開始位置→終了位置→開始位置 と逆順になぞるパターンです。

追記:「鉛筆で描画」を選択していてブラシは「1. Pixel」の場合の実行結果です。「ブラシで描画」や他のブラシの場合には若干結果が変わります。

20191207-5.png

#3.欠ける(ずれる)部分

width=1以外の場合に、描画されない閉じる線と交わる部分でずれて欠けました。

20191207-2.png

丸くした場合も同様です。

20191207-3.png

最後の線をなくして描画されない閉じる線が中央の線と交わらないようにすると、欠け(ずれ)ません。
但しこの場合、描画開始位置との角度によっては、最後の部分がかなり鋭角になるのが気になります。

20191207-4.png

開始位置→終了位置→開始位置 と逆順になぞった場合は、微妙に出っ張り、太くなります。

20191207-6.png

#4.スクリプト全体

make_path()を前回と変更しています。
今回使用していませんが、make_path_relative()を追加していて、制御点とアンカーを相対座標指定できます。
今回はmake_path_relative2()(名前に2をつけるのは行儀が悪いですが)で、さらに引数で指定した座標から相対で描画します。

今回も下記関数は、5 分で始める GIMP Python-Fu - Qiitaのものを使用させて頂いています。
create_image()
add_layer()
set_color()
set_line_width()
display_image()

# Python-Fu のサンプル・スクリプト
# GIMP の Python-Fu コンソールにコピペして実行してください

# 画像データの作成
## 指定したサイズで画像データを作成する
### width : 画像データの幅 (px)
### height : 画像データの高さ (px)
def create_image(width, height):
  # 画像データを生成
  return gimp.Image(width, height, RGB)

# レイヤーの追加
## 指定した名前のレイヤーを新規に作成し、画像データに挿入する
### image : レイヤーを追加する画像データ
### name : 新規に作成するレイヤーの名前(文字列)
def add_layer(image, name):
  # レイヤーの作成に必要なパラメータ
  width   = image.width
  height  = image.height
  type    = RGB_IMAGE
  opacity = 100
  mode    = NORMAL_MODE
  #
  # パラメータをもとにレイヤーを作成
  layer = gimp.Layer(image, name, width, height, type, opacity, mode)
  #
  # レイヤーを背景色で塗りつぶす(GIMP のデフォルトの挙動に合わせています)
  layer.fill(1)
  #
  # 画像データの 0 番目の位置にレイヤーを挿入する
  position = 0
  image.add_layer(layer, position)
  #
  return layer

# 描画する色を変更する
## パレットの前景色を変更して描画色を設定する
### r : 赤要素 (0-255)
### g : 緑要素 (0-255)
### b : 青要素 (0-255)
### a : 透明度 (0-1.0)
def set_color(r, g, b, a):
  color = (r, g, b, a)
  pdb.gimp_context_set_foreground(color)

# 描画する線の太さを変える
## ブラシのサイズを変更して線の太さを設定する
### width : 線の太さ
def set_line_width(width):
  pdb.gimp_context_set_brush_size(width)

# アンチエイリアスを設定する
## アンチエイリアスを設定する
### antialias : TRUE:有効、FALSE:無効
def set_antialias(antialias):
  pdb.gimp_context_set_antialias(antialias)

# 画像の表示
## 新しいウィンドウを作成し、画像データを表示する
### image : 表示する画像データ
def display_image(image):
  gimp.Display(image)

# パス作成
## パスを作成
### image : レイヤーを追加する画像データ
### points : パス座標
### mode : 0:描画しない、1:閉じないストローク(初期値)、2:閉じるストローク、3:塗りつぶし
### delete_path : TRUE:パスを削除する(初期値)、FALSE:パスを残す
def make_path(
    image,
    points,
    mode=1,
    delete_path=TRUE,
    ):
    """ パスを作成する。 """
    #
    # フラグ設定
    #
    is_draw   = FALSE
    is_closed = FALSE
    is_fill   = FALSE
    is_stroke = FALSE
    if mode == 1:           # 閉じないストローク
        is_draw   = TRUE
        is_closed = FALSE
        is_fill   = FALSE
        is_stroke = FALSE
    elif mode == 2:         # 閉じるストローク
        is_draw   = TRUE
        is_closed = TRUE
        is_fill   = FALSE
        is_stroke = FALSE
    elif mode == 3:         # 塗りつぶし
        is_draw   = TRUE
        is_closed = TRUE        # TRUE/FALSEどちらでも変わらない
        is_fill   = TRUE
        is_stroke = FALSE
    elif mode == 4:         # 閉じないストローク(アンチエイリアスが効かない)
        is_draw   = TRUE
        is_closed = FALSE       # 効かない
        is_fill   = FALSE
        is_stroke = TRUE
    elif mode == 5:         # 閉じるストローク(アンチエイリアスが効かない)
        is_draw   = TRUE
        is_closed = TRUE
        is_fill   = FALSE
        is_stroke = TRUE
    #
    vectors = pdb.gimp_vectors_new(image, 'path')  # パス新規作成
    pdb.gimp_image_add_vectors(image, vectors, 0)  # パスを画像に追加
    #
    # パスとしてストロークを追加
    #
    stroke_id = pdb.gimp_vectors_stroke_new_from_points(vectors, 0,
            len(points), points, is_closed)
    #
    # パスを表示
    #
    pdb.gimp_vectors_set_visible(vectors, TRUE)
    #
    # 描画するよう指定されてたら、パスから選択範囲を作って描画する。
    #
    if is_draw:
        #
        # 選択範囲解除
        #
        pdb.gimp_selection_none(image)
        #
        # パスから選択範囲作成
        #
        pdb.gimp_vectors_to_selection(
            vectors,
            CHANNEL_OP_REPLACE,
            TRUE,
            FALSE,
            0,
            0,
            )
        #
        # 前景色で描画
        #
        drawable = pdb.gimp_image_active_drawable(image)
        if is_fill:
            pdb.gimp_edit_fill(drawable, FOREGROUND_FILL)
        elif is_stroke:
            pdb.gimp_edit_stroke(drawable)
        else:
            pdb.gimp_drawable_edit_stroke_item(drawable, vectors)
        #
        # 選択範囲解除
        #
        pdb.gimp_selection_none(image)
    #
    # パス削除が指定されていたらパスを削除する。
    #
    if delete_path:
        # パス削除
        #
        pdb.gimp_image_remove_vectors(image, vectors)
    #
    return

# 絶対座標取得
def get_absolute_point(list):
    """ """
    rlist = []
    for pos in list:
        if len(pos) == 6:
            (x, y, rx1, ry1, rx2, ry2) = pos
            x1 = x + rx1
            y1 = y + ry1
            x2 = x + rx2
            y2 = y + ry2
        else:
            (x, y) = pos
            x1 = x
            y1 = y
            x2 = x
            y2 = y
        rlist.extend([
            x1,
            y1,
            x,
            y,
            x2,
            y2,
            ])
    return rlist

# 絶対座標取得
def get_absolute_point2(x, y, list):
    """ """
    rlist = []
    bx = x
    by = y
    for pos in list:
        if len(pos) == 6:
            (rx0, ry0, rx1, ry1, rx2, ry2) = pos
            bx = bx + rx0
            by = by + ry0
            x1 = bx + rx1
            y1 = by + ry1
            x2 = bx + rx2
            y2 = by + ry2
        else:
            (rx0, ry0) = pos
            bx = bx + rx0
            by = by + ry0
            x1 = bx
            y1 = by
            x2 = bx
            y2 = by
        rlist.extend([
            x1,
            y1,
            bx,
            by,
            x2,
            y2,
            ])
    return rlist

# パス作成(アンカー・制御点相対座標指定)
## パスを作成
### image : レイヤーを追加する画像データ
### points : パス座標
### mode : 0:描画しない、1:最後を閉じないストローク(初期値)、2:最後を閉じるストローク、3:塗りつぶし
### delete_path : TRUE:パスを削除する(初期値)、FALSE:パスを残す
def make_path_relative(
    image,
    points,
    mode=1,
    delete_path=TRUE,
    ):
    """ パスを作成する。 """
    new_points = get_absolute_point(points)
    make_path(image, new_points, mode, delete_path)

# パス作成(座標・アンカー・制御点相対座標指定)
## パスを作成
### image : レイヤーを追加する画像データ
### x : 開始X座標
### y : 開始Y座標
### points : パス座標
### mode : 0:描画しない、1:最後を閉じないストローク(初期値)、2:最後を閉じるストローク、3:塗りつぶし
### delete_path : TRUE:パスを削除する(初期値)、FALSE:パスを残す
def make_path_relative2(
    image,
    x,
    y,
    points,
    mode=1,
    delete_path=TRUE,
    ):
    """ パスを作成する。 """
    new_points = get_absolute_point2(x, y, points)
    make_path(image, new_points, mode, delete_path)

# メイン
def main():
    image = create_image(1100, 600)
    layer = add_layer(image, "背景")
    set_color(0, 0, 0, 1.0)
    set_antialias(TRUE)
    # 値は(アンカーX, Y[, 制御開始点増分X, Y, 制御終了点増分X, Y])
    #
    points1 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +1,  +0,   0,   0,   0,   0),
        ]
    points2 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +2,  +0,   0,   0,   0,   0),
        ]
    points3 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +3,  +0,   0,   0,   0,   0),
        ]
    points4 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +4,  +0,   0,   0,   0,   0),
        ]
    points5 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +5,  +0,   0,   0,   0,   0),
        ]
    points6 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +6,  +0,   0,   0,   0,   0),
        ]
    points7 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +7,  +0,   0,   0,   0,   0),
        ]
    points8 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +8,  +0,   0,   0,   0,   0),
        ]
    points9 = [
        ( +0,  +0,   0,   0,   0,   0),
        ( +9,  +0,   0,   0,   0,   0),
        ]
    points10 = [
        ( +0,  +0,   0,   0,   0,   0),
        (+10,  +0,   0,   0,   0,   0),
        ]
    points11 = [
        ( +0,  +0,   0,   0,   0,   0),
        (+10, -10,   0,   0,   0,   0),
        (+10, +10,   0,   0,   0,   0),
        (+10, +10,   0,   0,   0,   0),
        (+10, -10,   0,   0,   0,   0),
        ]
    points12 = [
        ( +0,  +0,   0,   0,   0,  -5),
        (+10, -10,  -5,   0,  +5,   0),
        (+10, +10,   0,  -5,   0,  +5),
        (+10, +10,  -5,   0,  +5,   0),
        (+10, -10,   0,  -5,   0,   0),
        ]
    points13 = [
        ( +0,  +0,   0,   0,   0,   0),
        (+10, -10,   0,   0,   0,   0),
        (+10, +10,   0,   0,   0,   0),
        (+10, +10,   0,   0,   0,   0),
        ]
    points14 = [
        (+10,   0,   0,   0,   0,   0),
        (-10, +10,   0,   0,   0,   0),
        (-10, -10,   0,   0,   0,   0),
        (+10, -10,   0,   0,   0,   0),
        ]
    points15 = [
        (+10,   0,   0,  -5,   0,  +5),
        (-10, +10,  +5,   0,  -5,   0),
        (-10, -10,   0,  +5,   0,  -5),
        (+10, -10,  -5,   0,  +5,   0),
        ]
    points16 = [
        ( +0,  +0,   0,   0,   0,   0),
        (+10, -10,   0,   0,   0,   0),
        (+10, +10,   0,   0,   0,   0),
        (+10, +10,   0,   0,   0,   0),
        (+10, -10,   0,   0,   0,   0),
        (-10, +10,   0,   0,   0,   0),
        (-10, -10,   0,   0,   0,   0),
        (-10, -10,   0,   0,   0,   0),
        (-10, +10,   0,   0,   0,   0),
        ]
    #
    set_line_width(1)
    x =  50
    y =  50
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(2)
    x =  50
    y = 100
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(3)
    x =  50
    y = 150
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(4)
    x =  50
    y = 200
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(5)
    x =  50
    y = 250
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(6)
    x =  50
    y = 300
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(7)
    x =  50
    y = 350
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(8)
    x =  50
    y = 400
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(9)
    x =  50
    y = 450
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    set_line_width(10)
    x =  50
    y = 500
    make_path_relative2(image, x +   0, y, points1, 1, TRUE)
    make_path_relative2(image, x +  20, y, points2, 1, TRUE)
    make_path_relative2(image, x +  40, y, points3, 1, TRUE)
    make_path_relative2(image, x +  60, y, points4, 1, TRUE)
    make_path_relative2(image, x +  80, y, points5, 1, TRUE)
    make_path_relative2(image, x + 100, y, points6, 1, TRUE)
    make_path_relative2(image, x + 120, y, points7, 1, TRUE)
    make_path_relative2(image, x + 140, y, points8, 1, TRUE)
    make_path_relative2(image, x + 160, y, points9, 1, TRUE)
    make_path_relative2(image, x + 180, y, points10, 1, TRUE)
    make_path_relative2(image, x + 200, y, points11, 1, TRUE)
    make_path_relative2(image, x + 260, y, points11, 2, TRUE)
    make_path_relative2(image, x + 320, y, points11, 3, TRUE)
    make_path_relative2(image, x + 380, y, points12, 1, TRUE)
    make_path_relative2(image, x + 440, y, points12, 2, TRUE)
    make_path_relative2(image, x + 500, y, points12, 3, TRUE)
    make_path_relative2(image, x + 560, y, points13, 1, TRUE)
    make_path_relative2(image, x + 620, y, points13, 2, TRUE)
    make_path_relative2(image, x + 680, y, points13, 3, TRUE)
    make_path_relative2(image, x + 740, y, points14, 1, TRUE)
    make_path_relative2(image, x + 780, y, points14, 2, TRUE)
    make_path_relative2(image, x + 820, y, points14, 3, TRUE)
    make_path_relative2(image, x + 860, y, points15, 1, TRUE)
    make_path_relative2(image, x + 900, y, points15, 2, TRUE)
    make_path_relative2(image, x + 940, y, points15, 3, TRUE)
    make_path_relative2(image, x + 980, y, points16, 1, TRUE)
    #
    display_image(image)

main()

#5.他の描画方法

上のスクリプトではgimp_drawable_edit_stroke_item()を使用しています。
アンチエイリアスが効かないgimp_edit_stroke()も試しましたが、こちらはclosedをTRUEにしても閉じる線が描画されてしまいました。

#6.回避策

  • 線を細くする(width=1)
  • 閉じる線が交わらないようにする
  • 閉じる線が交わりそうな時には線を複数に分ける
  • 線を閉じる

開始位置→終了位置→開始位置 と、逆順に座標を指定するのも一度試したのですが、線が何故か太くなっていまいちだったと記憶しています。余力があればもう一度試して追記します。
→追記しました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?