1

GIMP の基本的なスクリプトを作成しようとしていますが、正しく動作しないようです。選択を行った後、次の順序に従う必要があります: アクティブ レイヤーを下げ、選択範囲を 2px 拡張し、前景色で塗りつぶし、アクティブ レイヤーを上げます。最終製品は、最上層の私の線の下に無地になるはずです. しかし、私が書いたコードでは、アクティブなレイヤーをジャンプしますが、下のレイヤーではなく、一番上のレイヤーで塗りつぶします。ここに私が持っているコードがあります:

(define (quick-fill image drawable)
  (gimp-undo-push-group-start image)
  (let* ((layer (car (gimp-image-get-active-layer image))))
    (gimp-selection-grow image 2)
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 1))
    (gimp-bucket-fill drawable FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 0)))
  (gimp-undo-push-group-end image)
  (gimp-displays-flush))
4

1 に答える 1

2

下のレイヤーの背後に塗りつぶしを作成することにより、現在のレイヤー上のオブジェクトの周りに2ピクセルの境界線を作成するフィルターを作成しようとしている場合(少なくともそれがあなたがやろうとしているように見えます)、試してくださいこれ:

(define (quick-fill image)
  (gimp-undo-push-group-start image)
  (gimp-selection-grow image 2)
  (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 1))
  (let* ((active-drawable (car (gimp-image-get-active-drawable image))))
    (gimp-bucket-fill active-drawable FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 0)))
  (gimp-undo-push-group-end image)
  (gimp-displays-flush))

いくつかのメモ:

layer1)セクションで変数を使用することはないため、let*削除しました。

2)Gimpは、アクティブなレイヤーで描画、塗りつぶし、または何もしません...むしろ、アクティブなドローアブルで機能します。下のレイヤーで塗りつぶしたいときに一番上のレイヤーで塗りつぶしを取得している場合、それは一番上のレイヤーのドローアブルを渡していることを意味するため、一番上のレイヤーで塗りつぶすことになります...アクティブを切り替えますレイヤーを下のレイヤーに変更しても、渡されたドローアブルの値は変更されません。したがって、この変更では、現在アクティブなドローアブルactive-drawable初期化されるセクションに新しい変数を作成しましたlet*アクティブなレイヤーを最上位レイヤーから下のレイヤーに変更しました。そうすれば、最上位レイヤーである元の渡されたドローアブルではなく、下のレイヤーであるドローアブルを埋めることができます。実際、アクティブなレイヤーから新しいドローアブルを取得できるため (この変更で行われていることです)、ドローアブル引数を渡す必要はまったくありません。

于 2011-04-25T22:00:23.010 に答える