在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)
但是......嵌套层组?
是的,仍然不完全 - 如果你有嵌套的图层组.上面的代码只进入第一级组,不会影响深层嵌套组结构中的任何层.
这是递归过程比迭代循环更有用的地方,因此请继续关注其他更新.