Gimp - 如何简单快速地将多个图层设为可见?

17
在Gimp中,我创建了一个包含大约200个图层的.xcf文件。有些图层是可见的,有些不可见。现在我想创建一张由所有图层组成的图片,所以我必须使所有图层可见。稍后,我还需要返回到某些图层可见而其他图层不可见的状态。如何在不点击数百个可见性复选框的情况下实现这一点?
1个回答

27

在图层对话框中,Shift+点击一个图层的眼睛图标(eycon?),或者该图层当前不可见的位置。

这将:

  • 使您点击的图层可见
  • 通过第一次点击使所有其他图层不可见,通过下一次点击使其可见

请参阅http://docs.gimp.org/2.8/en/gimp-dialogs-structure.html#gimp-layer-dialog

要返回到上一个状态,我会使用 文件->还原,这会丢弃任何更改并从磁盘重新加载文件

但是...

... 这里是Stack Overflow,所以我们需要用代码来实现...

我建议在GIMP的Python控制台中使用 Filters->Python-Fu->Console。假设您只在处理一个图像,则以下代码将使其所有图层可见:

pdb.gimp_image_undo_group_start(gimp.image_list()[0])
for layer in gimp.image_list()[0].layers:
    layer.visible = True

pdb.gimp_image_undo_group_end(gimp.image_list()[0])

代码的主要部分是对图像的所有层进行循环,将它们设置为可见。该循环被包装在撤销组中,允许在一个步骤中轻松撤消所有可见性更改。

但是...图层组呢?

是的,我们还没有涉及到那里。

如果您的图像使用图层组,您会注意到上述代码将使任何不在组中的图层和组本身可见,但不会影响任何组中的图层。

我们可以通过pdb.gimp_item_is_group(layer)来判断我们在for循环中遇到的图层是否是图层组,对于那些返回true。因此,在迭代时,我们可以检查当前项是否为组,并开始迭代其子项。

Python有一种巧妙的方法来通过任意布尔过滤表达式(gimp.Image.layers是其中之一)过滤列表,并且我们已经有了这样一个表达式,请参见上面的内容。

因此,我们可以这样做,而不是用额外的if语句使我们的当前循环变得复杂:

pdb.gimp_image_undo_group_start(gimp.image_list()[0])

# iterate layer groups
for group in [group for group in gimp.image_list()[0].layers if pdb.gimp_item_is_group(group)]:
    # you want a group.name check here to pick a specific group
    for layer in group.layers:
        layer.visible = True

# iterate non-group layers
for layer in gimp.image_list()[0].layers:
    layer.visible = True

pdb.gimp_image_undo_group_end(gimp.image_list()[0])

但是... 嵌套的图层组呢?

是的,还不太够 - 如果你有嵌套的图层组。上面的代码只进入第一级组,不会影响深度嵌套组结构中的任何图层。

这就是递归过程比迭代循环更有用的地方,因此请继续关注额外的更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接