Gimp - 使多个图层可见的简单方法?

Gimp - Easy way to make many layers visible?

在 Gimp 中,我创建了一个包含大约 200 个层的 .xcf 文件。有些是可见的,有些则不是。现在我想创建一个由所有层组成的图片,所以我必须使所有层都可见。稍后我将不得不 return 到某些图层可见而某些图层不可见的状态。如何在不点击数百个点击框的情况下实现这一目标?

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

代码的主要部分是遍历图像的所有层,将它们设置为可见。该循环包含在撤消组中,允许一步轻松撤消所有可见性更改。

但是...图层组?

是的,我们还没有完成。

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

我们可以判断我们在 for 循环中遇到的层是否是层组 - pdb.gimp_item_is_group(layer) 将 return 为真。因此在迭代时,我们可以检查当前项目是否是一个组,并开始迭代它的子项。

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

但是...嵌套图层组?

是的,仍然不完全 - 如果您有嵌套图层组。上面的代码只进入第一层组,不会影响深层嵌套组结构中的任何层。

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