Photoshop脚本 图层与图层组

图层是 Photoshop 文档的基本组成单元。ExtendScript 中图层分为两种:

  • ArtLayer — 普通图层(像素、文本、形状、调整层等)
  • LayerSet — 图层组(可包含 ArtLayer 和其他 LayerSet)

文档提供三个集合来访问:

javascript
doc.artLayers  // 仅普通图层(不含组)
doc.layerSets  // 仅图层组
doc.layers     // 全部图层 + 组的合集

获取图层

遍历文档的所有图层

javascript
var doc = app.activeDocument;
var layerList = "";
for (var i = 0; i < doc.layers.length; i++) {
  var layer = doc.layers[i];
  layerList += i + ": " + layer.name + " — " + layer.typename + "\n";
}
alert("图层列表:\n" + layerList);

doc.layers 索引 0 对应最顶层的图层。layer.typename 返回 "ArtLayer""LayerSet"

按名称查找

javascript
var logo = doc.layers.getByName("Logo");

名称不唯一时返回第一个匹配项。

判断图层类型

使用 layer.typenameisinstance

javascript
for (var i = 0; i < doc.layers.length; i++) {
  var layer = doc.layers[i];
  if (layer.typename === "ArtLayer") {
    alert(layer.name + " 是普通图层");
  } else if (layer.typename === "LayerSet") {
    alert(layer.name + " 是图层组");
  }
}

使用 LayerKind 枚举判断 ArtLayer 的具体类型:

javascript
var layer = doc.artLayers[0];
switch (layer.kind) {
  case LayerKind.NORMAL:
    alert("普通像素图层");
    break;
  case LayerKind.TEXT:
    alert("文字图层");
    break;
  case LayerKind.SMARTOBJECT:
    alert("智能对象");
    break;
  case LayerKind.SOLIDFILL:
    alert("纯色填充层");
    break;
}

ArtLayer 属性

属性类型说明
layer.namestring图层名称(可读写)
layer.kindLayerKind图层类型(只读)
layer.visibleboolean可见性(可读写)
layer.opacitynumber不透明度 0–100(可读写)
layer.fillOpacitynumber填充不透明度 0–100
layer.blendModeBlendMode混合模式(可读写)
layer.groupedboolean是否为剪贴蒙版
layer.isBackgroundLayerboolean是否为背景图层
layer.allLockedboolean全部锁定
layer.pixelsLockedboolean像素锁定
layer.positionLockedboolean位置锁定
layer.boundsArray[left, top, right, bottom] UnitValue 数组
layer.boundsNoEffectsArray不含效果边界
layer.itemIndexnumber内部索引号
layer.linkedLayersArray链接的图层数组
layer.textItemTextItem文本图层时有效
javascript
var layer = doc.artLayers[0];
layer.name = "新名称";
layer.visible = false;
layer.opacity = 50;
layer.blendMode = BlendMode.MULTIPLY;
layer.allLocked = true;

ArtLayer 方法

调整与滤镜

javascript
layer.adjustBrightnessContrast(20, 10);        // 亮度/对比度
layer.adjustCurves([[0, 0], [128, 180], [255, 255]]); // 曲线
layer.adjustLevels(0, 255, 1.0, 0, 255);       // 色阶
layer.adjustColorBalance([0, 0, 0], [10, 0, -10], [0, 0, 0], true); // 色彩平衡
layer.applyAddNoise(12, NoiseDistribution.UNIFORM, false); // 添加杂色
layer.applyBlur();    // 模糊
layer.applyAverage(); // 平均模糊
layer.applyClouds();  // 云彩

图层内容操作

javascript
layer.clear();       // 清空内容
layer.copy(true);    // 复制(合并/不合并透明度)
layer.cut();         // 剪切
layer.desaturate();  // 去色
layer.equalize();    // 色调均化
layer.invert();      // 反相

变换

javascript
layer.resize(150, 150, AnchorPosition.MIDDLECENTER); // 缩放 150%
layer.rotate(45.0, AnchorPosition.MIDDLECENTER);      // 旋转 45°
layer.translate(100, 50);                              // 移动

栅格化

javascript
layer.rasterize(RasterizeType.ENTIRELAYER);     // 整个图层
layer.rasterize(RasterizeType.FILLCONTENT);     // 填充内容
layer.rasterize(RasterizeType.LAYERCLIPPINGPATH); // 剪贴路径
layer.rasterize(RasterizeType.TEXTCONTENTS);    // 文本内容
layer.rasterize(RasterizeType.SHAPECLIPPINGPATH); // 形状

复制、移动、删除

javascript
// 复制到本文档最顶层
var copy = layer.duplicate(doc, ElementPlacement.PLACEATBEGINNING);

// 移动到最底层
layer.move(doc, ElementPlacement.PLACEATEND);

// 合并向下(返回合并后的图层)
var merged = layer.merge();

// 删除
layer.remove();

ElementPlacement 可选值:

  • PLACEATBEGINNING — 目标的最顶层
  • PLACEATEND — 目标的最底层
  • PLACEBEFORE — 在指定元素之前
  • PLACEAFTER — 在指定元素之后

链接

javascript
layer.link(anotherLayer);   // 建立链接
layer.unlink();             // 取消链接

图层组(LayerSet)

图层组本身也有图层集合:

javascript
var group = doc.layerSets.add();
group.name = "UI 元素";

// 访问子图层
var childList = "";
for (var i = 0; i < group.layers.length; i++) {
  childList += "  子图层: " + group.layers[i].name + "\n";
}
alert("子图层列表:\n" + childList);

// 嵌套图层组
var subGroup = group.layerSets.add();

LayerSet 属性

属性说明
group.name组名称(可读写)
group.visible可见性
group.opacity不透明度 0–100
group.blendMode混合模式
group.artLayers组内图层集合(不含子组)
group.layerSets组内子组集合
group.layers组内全部图层 + 子组
group.bounds边界
group.linkedLayers链接图层

创建与添加图层

javascript
// 创建新图层(返回 ArtLayer)
var newLayer = doc.artLayers.add();
newLayer.name = "新图层";

// 创建新图层组(返回 LayerSet)
var newGroup = doc.layerSets.add();
newGroup.name = "新组";

// 创建文本图层
var textLayer = doc.artLayers.add();
textLayer.kind = LayerKind.TEXT;
textLayer.name = "标题";

综合示例

遍历文档所有图层的层次结构,创建新图层并调整属性:

javascript
function printLayers(layers, indent) {
  indent = indent || 0;
  var prefix = "";
  for (var i = 0; i < indent; i++) prefix += "  ";
  var output = "";
  for (var i = 0; i < layers.length; i++) {
    var layer = layers[i];
    output += prefix + layer.name + " [" + layer.typename + "] " + (layer.visible ? "" : "(隐藏)") + "\n";
    if (layer.typename === "LayerSet") {
      output += printLayers(layer.layers, indent + 1);
    }
  }
  return output;
}

var doc = app.activeDocument;
if (doc) {
  var treeOutput = "文档: " + doc.name + "\n";
  treeOutput += printLayers(doc.layers);
  alert(treeOutput);

  // 创建新图层并设为最底层
  var bg = doc.artLayers.add();
  bg.name = "背景";
  bg.move(doc, ElementPlacement.PLACEATEND);
  bg.opacity = 80;
  bg.blendMode = BlendMode.MULTIPLY;

  alert("图层操作完成");
}

小结

  • doc.artLayers 仅图层、doc.layerSets 仅组、doc.layers 全部
  • doc.artLayers.add() / doc.layerSets.add() 创建新元素
  • layer.typename 判断 ArtLayer / LayerSet;layer.kind 区分 ArtLayer 子类型
  • namevisibleopacityblendMode 等属性可读写
  • duplicatemovemergeremove 管理图层生命周期
  • ElementPlacement 枚举控制插入位置
  • resizerotatetranslate 变换图层
  • 图层组通过 group.layers 嵌套访问,支持递归遍历