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

Jog*_*ums 5 layer gimp

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

Mic*_*her 10

Shift +如果图层当前不可见,则单击图层对话框中图层的眼睛图标(eycon?)或其应该放置的位置.

这将:

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

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

要返回到先前的状态,我将使用File-> Revert,这会丢弃所有更改并从磁盘重新加载文件

但...

...这是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])
Run Code Online (Sandbox Code Playgroud)

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

但是...层组?

是的,我们还没到那里.

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

我们可以判断在for循环中遇到的图层是否是图层组 - pdb.gimp_item_is_group(图层)将返回true.因此,在迭代时,我们可以检查当前项是否是一个组,并开始迭代其子项.

Python有一个很好的方法来过滤列表(和gimp.Image.layers是一个)由任意布尔filter-expression,我们得到其中一个,见上文.

因此,我们可以这样做,而不是使用额外的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])
Run Code Online (Sandbox Code Playgroud)

但是......嵌套层组?

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

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