在 Photoshop 脚本中打开和关闭多个图层

Posted

技术标签:

【中文标题】在 Photoshop 脚本中打开和关闭多个图层【英文标题】:Turning Multiple Layers On and Off in Photoshop Script 【发布时间】:2012-03-13 01:22:26 【问题描述】:

我在 Photoshop 中有 6 个组,每个组包含多个图层。我希望打开/关闭每个组中的图层以创建图像的所有可能组合。

有人能指出我正确的方向吗?

我从未在 Photoshop 中编写过脚本,但我试图自己解决这个问题。

【问题讨论】:

看看这个答案:***.com/a/8544923/327466 【参考方案1】:

我自己对 CS5 脚本编写还很陌生,但我想我可以解释一下它是如何工作的。代码示例可能不是最有效的方法,但可以解决问题。

一组图层或单个图层本身之间存在很大差异。 所有图层和组都以 DOM 格式排序。要获取您的根,您可以使用全局实例 app 来获取活动文档:app.activeDocument

混乱的部分是单个层和组有两个单独的数组。 要获得单层数组,请对组使用 app.activeDocument.layersapp.activeDocument.layerSets

要深入了解层次结构,请使用 layerSets 数组向下迭代。

例如,让我们假设以下层次结构:

-Border
+Icons
   +Left
       -Star
       -Home
   +Right
       -Add
       -Remove

这里BorderStarHomeAddRemove都是单层,而IconsLeftRight是组。

要打开Left 组,我们需要向下迭代Icon 组:

Icons = app.activeDocument.layerSets.getByName("Icons");
Left = Icons.layerSets.getByName("Left");
Left.visible = true;

如果您在 CS5 中通过单击鼠标来显示图层/组,则所有父组也将自动显示。通过编写脚本并非如此,您还必须启用所有父母。

Icons = app.activeDocument.layerSets.getByName("Icons");
Icons.visible = true;
Left = Icons.layerSets.getByName("Left");
Left.visible = true;

要显示边框图层,您需要使用图层数组。

app.activeDocument.layers.getByName("Border").visible = true;

如果你想显示添加层,同样的事情。

Icons = app.activeDocument.layerSets.getByName("Icons");
Icons.visible = true;
Right = Icons.layerSets.getByName("Right");
Right.visible = true;
AddLayer = Right.layers.getByName("Add");
AddLayer.visible = true;

如果您有很多组和层,这可能会有点混乱。我创建了一个函数,它遵循提供的路径来获取最终对象。它会自行判断是图层还是组。

//******************************************
// GET BY PATH
// Author: Max Kielland
//
// Gets the LayerSet or Layer at the path's end.
// Example path "Icons/left" will return the LayerSet object "Left"
// while "Icons/left/Star" will return the Layer object "Star"
// If fSetPath is true, all the parents will be visible as well.

function GetByPath(fPath,fSetPath) 

  var lGroup = null;
  var lPathArray = new Array();

  lPathArray = fPath.split('/');
  try 
    lGroup = app.activeDocument.layers.getByName(lPathArray[0]);
   catch (err) 
    lGroup = app.activeDocument.layerSets.getByName(lPathArray[0]);
  

  if (fSetPath)
    lGroup.visible = true;

  for (n=1; n<lPathArray.length; n++) 
    try 
      lGroup = lGroup.layerSets.getByName(lPathArray[n]);
     catch(err) 
      lGroup = lGroup.layers.getByName(lPathArray[n]);
    
    if (fSetPath == true)
      lGroup.visible = true;
  

  return lGroup;

...还有一个函数可以通过路径简单地设置或清除组或层。

//******************************************
// SET STATUS
// Author: Max Kielland
//
// Sets the Group or Layer's visible property
// at the end of the path to fStatus.

function SetStatus(fPath, fStatus) 

  Obj = GetByPath(fPath,false);
  Obj.visible = fStatus;

..最后我写了这个函数来隐藏用户指定的根目录中的所有组和/或层。

/******************************************
// CLEAR GROUP
// Author: Max Kielland
//
// Clears the visible property in a single
// group/layer with the option to clear all
// its children as well (fRecurs = true).
// fLayerSet can be a layerSet object or a
// String path.

function ClearGroup(fLayerSet,fRecurs) 

  var n;
  var TargetGroup;

  // Get LayerSet Object if reference is a string.
  if (typeof fLayerSet == "string")
    TargetGroup = GetByPath(fLayerSet);
  else
    TargetGroup = fLayerSet;

  // Iterate through all LayerSets
  for (n=0; n<TargetGroup.layerSets.length; n++) 
    if (fRecurs == true)
      ClearGroup(TargetGroup.layerSets[n],true);
    else
     TargetGroup.layerSets[n].visible = false;
  

  // Iterate through all layers
  for (n=0; n<TargetGroup.layers.length; n++) 
    TargetGroup.layers[n].visible = false;
  

  // Clear self
  TargetGroup.visible = false;

这里是一个如何使用函数的例子

// Hide group "Icon" and its children
ClearGroup("Icons",true);

//Show the layer "Home"
GetByPath("Icons/Left/Home",true);

// To just get the object "Right"
var MyGroup = GetByPath("Icons/Right");

// Save the current document as a PNG file
app.activeDocument.saveAs(File("Scripted Document.png"),PNGSaveOptions);

我希望这对我以外的人有用:)

【讨论】:

以上是关于在 Photoshop 脚本中打开和关闭多个图层的主要内容,如果未能解决你的问题,请参考以下文章

Photoshop 脚本,重新打开上一个文档

如何在 jsx Photoshop 脚本中提取图层旋转(变换)?

ps的批量处理脚本为啥显示无法处理图片?

用于导出图层组合的 Photoshop 脚本

将图层名称复制到 Photoshop 中的文本框的脚本

Photoshop 脚本 - 如何在 2 个链接图层组之间切换