Photoshop脚本 选区与通道

选区(Selection)是 Photoshop 中最基本也最强大的功能之一。通过 ExtendScript,你可以用程序化的方式创建、修改和应用选区。

选区对象

每个文档都有一个 selection 属性,代表当前选区:

javascript
var doc = app.activeDocument;
var sel = doc.selection;

如果文档没有选区,selection 对象仍然存在,但其 bounds 属性返回 null

选区属性

选区对象提供两个只读属性:

javascript
// 获取选区边界(像素值)
var bounds = sel.bounds;
if (bounds) {
  alert("选区范围: 左=" + bounds[0] + " 上=" + bounds[1] +
            " 右=" + bounds[2] + " 下=" + bounds[3]);
}

// 检查是否为实心选区(无羽化或半透明边缘)
alert("选区是否实心: " + sel.solid);

bounds 返回包含四个 UnitValue 的数组 [left, top, right, bottom]。无选区时返回 null

选区基本操作

javascript
// 全选 — 选中整个画布
sel.selectAll();

// 反选
sel.invert();

// 取消选择
sel.deselect();

所有选区操作都是同步的,无需 async/await

创建选区

使用 select 方法创建矩形选区:

javascript
var doc = app.activeDocument;
var sel = doc.selection;

// 创建一个 200x200 的矩形选区,替换现有选区,羽化 5 像素
sel.select([[100, 100], [300, 100], [300, 300], [100, 300]],
           SelectionType.REPLACE, 5, false);

// 在当前选区上添加新区域
sel.select([[250, 250], [400, 250], [400, 400], [250, 400]],
           SelectionType.EXTEND, 0, false);

// 从当前选区减去区域
sel.select([[150, 150], [250, 150], [250, 250], [150, 250]],
           SelectionType.DIMINISH, 0, false);

SelectionType 支持四种模式:REPLACE(替换)、EXTEND(添加)、DIMINISH(减去)、INTERSECT(交集)。

修改选区

选区创建后,可以对其进行各种变换:

javascript
// 扩展选区 10 像素
sel.expand(10);

// 收缩选区 5 像素
sel.contract(5);

// 羽化 3 像素
sel.feather(3);

// 选区平滑(消除锯齿边缘)
sel.smooth(2);

// 向右移动 50 像素,向下移动 30 像素
sel.translateBoundary(50, 30);

// 调整选区边界大小(水平 110%,垂直 90%,锚点居中)
sel.resizeBoundary(110, 90, AnchorPosition.MIDDLECENTER);

// 选区旋转 45 度
sel.rotate(45, AnchorPosition.MIDDLECENTER);

选区的保存与载入

选区可以保存到 Alpha 通道中,之后重新载入:

javascript
// 创建通道引用
var channel = doc.channels.add();
channel.name = "自定义选区";

// 将选区保存到通道
sel.store(channel, SelectionType.REPLACE);

// 取消选择
sel.deselect();

// 从通道重新载入选区
sel.load(channel, SelectionType.REPLACE, false);

选区填充与描边

javascript
// 创建填充颜色
var fillColor = new SolidColor();
fillColor.rgb.hexValue = "FF0000";

// 填充选区(正常模式,100% 不透明度)
sel.fill(fillColor, ColorBlendMode.NORMAL, 100, false);

// 选区描边(红色,3 像素,内部)
sel.stroke(fillColor, 3, StrokeLocation.INSIDE, ColorBlendMode.NORMAL, 100, false);

// 清除选区内容(删除选中区域的像素)
sel.clear();

// 复制选区内容(合并图层)
sel.copy(true);

// 剪切选区内容
sel.cut();

StrokeLocation 可选 INSIDECENTEROUTSIDE

高级选区操作

javascript
// 根据容差扩展选区(选择相似颜色区域)
sel.grow(32, true);

// 选择整个图像中所有相似颜色区域
sel.similar(32, true);

// 选区边界(只保留选区轮廓线)
sel.selectBorder(5);

// 将选区转换为工作路径(容差 2 像素)
sel.makeWorkPath(2);

通道操作

通道(Channel)是存储选区信息和颜色分量的容器:

javascript
var doc = app.activeDocument;
var channels = doc.channels;

通道属性

javascript
// 遍历所有通道
for (var i = 0; i < channels.length; i++) {
  var ch = channels[i];
  alert("通道 " + i + ": " + ch.name + "\n  类型: " + ch.kind + "\n  不透明度: " + ch.opacity);
}

channel.kind 可取以下 ChannelType 值:

  • COMPONENT — 颜色分量通道(RGB 红绿蓝)
  • MASKEDAREA — 被蒙版区域
  • SELECTEDAREA — 选中区域
  • SPOTCOLOR — 专色通道

通道操作

javascript
// 创建新通道(Alpha 通道)
var alpha = doc.channels.add();
alpha.name = "蒙版通道";
alpha.color.rgb.hexValue = "FF0000"; // 通道显示颜色
alpha.opacity = 50; // 通道叠加显示不透明度

// 复制通道
var copy = alpha.duplicate(doc);
copy.name = "通道副本";

// 合并专色通道
if (alpha.kind == ChannelType.SPOTCOLOR) {
  alpha.merge();
}

使用示例:为图片添加边框选区

以下完整示例演示了选区操作的典型流程:

javascript
var doc = app.activeDocument;
var sel = doc.selection;

// 全选画布
sel.selectAll();

// 收缩 20 像素得到内边框区域
sel.contract(20);

// 反选得到边框区域
sel.invert();

// 用白色填充边框
var fillColor = new SolidColor();
fillColor.rgb.hexValue = "FFFFFF";
sel.fill(fillColor, ColorBlendMode.NORMAL, 100, false);

// 取消选区
sel.deselect();