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))

几点注意事项:

1)您从不layer在您的部分中使用该变量let*,因此我已将其删除。

2) Gimp 不对活动层进行绘制或填充或做任何事情......而是在活动可绘制对象上工作。如果您想要在下面的图层上填充顶层,那么这意味着您正在为顶层传递可绘制对象,所以它将在顶层填充......切换活动layer 到下面的 layer 不会改变传入的 drawable 的值。因此,在此修改中,我在部分中创建了一个新active-drawable变量,该变量在之后let*被初始化为当前活动的可绘制对象您已将活动层从顶层更改为下面的层。这样,您将填充下面图层的可绘制对象,而不是顶层的原始传入可绘制对象。实际上,您根本不需要传入 drawable 参数,因为您可以从活动层获取新的可绘制对象(这是本次修改所做的)。

于 2011-04-25T22:00:23.010 回答