Scriptfu没有以正确的顺序执行,为什么?

时间:2011-04-25 11:44:36

标签: lisp scheme gimp script-fu

我正在尝试为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))

1 个答案:

答案 0 :(得分: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不会在活动图层上绘制或填充或执行任何操作...而是在活动的drawable上工作。如果您想要在顶层上填充顶层,那么这意味着您将传递顶层的drawable,因此它将填充顶层...切换活动图层到下面的图层不会改变传入的drawable的值。因此,在此修改中,我在active-drawable部分中创建了一个新的let*变量,该变量在之后被初始化为当前活动的drawable ,您已从其中更改了活动层顶层到下面的层。这样你就可以填充下面的图层,而不是作为顶层的原始传入的drawable。实际上,您根本不需要传入drawable参数,因为您可以从活动层获取新的drawable(这是在此修改中完成的)。