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.typename 或 isinstance:
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.name | string | 图层名称(可读写) |
layer.kind | LayerKind | 图层类型(只读) |
layer.visible | boolean | 可见性(可读写) |
layer.opacity | number | 不透明度 0–100(可读写) |
layer.fillOpacity | number | 填充不透明度 0–100 |
layer.blendMode | BlendMode | 混合模式(可读写) |
layer.grouped | boolean | 是否为剪贴蒙版 |
layer.isBackgroundLayer | boolean | 是否为背景图层 |
layer.allLocked | boolean | 全部锁定 |
layer.pixelsLocked | boolean | 像素锁定 |
layer.positionLocked | boolean | 位置锁定 |
layer.bounds | Array | [left, top, right, bottom] UnitValue 数组 |
layer.boundsNoEffects | Array | 不含效果边界 |
layer.itemIndex | number | 内部索引号 |
layer.linkedLayers | Array | 链接的图层数组 |
layer.textItem | TextItem | 文本图层时有效 |
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 子类型name、visible、opacity、blendMode等属性可读写duplicate、move、merge、remove管理图层生命周期ElementPlacement枚举控制插入位置resize、rotate、translate变换图层- 图层组通过
group.layers嵌套访问,支持递归遍历