使用场景
- 大批量图片去除水印
- 图片尺寸/水印形状位置 每张都不相同,需手动划定选区
- 使用 PS AI消除功能(需正版账号登录)

思路
先手动为多张图片划定水印选区,随后:
- 自动依次执行“消除”功能
- 自动保存PNG到指定文件夹
- 保存后自动关闭
依次对所有打开的、划定了选区的工程执行以上操作。
JSX代码
#target photoshop
app.displayDialogs = DialogModes.NO;
// 你录制的动作组名
var ACTION_SET_NAME = "AI_Action";
// 你录制的动作名
var ACTION_NAME = "AI_Remove";
var outputFolder = Folder.selectDialog("选择 PNG 输出文件夹");
if (!outputFolder) {
alert("未选择输出文件夹");
exit();
}
// 如果执行移去失败,是否也关闭 PSD
// 建议 false,避免失败时误关闭没处理好的文件
var CLOSE_FAILED_DOCS = false;
var total = app.documents.length;
var successCount = 0;
var skipCount = 0;
var failList = [];
for (var i = total - 1; i >= 0; i--) {
app.activeDocument = app.documents[i];
var doc = app.activeDocument;
var docName = getOriginalDocName(doc);
try {
if (!hasSelection()) {
skipCount++;
failList.push(docName + ":没有活动选区,已跳过");
continue;
}
// 执行你录制的“移去 / Remove”动作
app.doAction(ACTION_NAME, ACTION_SET_NAME);
// 导出 PNG,使用原始 PSD / PSB 文件名
var baseName = docName.replace(/\.[^\.]+$/, "");
var saveFile = makeUniqueFile(outputFolder, baseName, ".png");
var opts = new PNGSaveOptions();
opts.compression = 6;
opts.interlaced = false;
doc.saveAs(saveFile, opts, true, Extension.LOWERCASE);
successCount++;
// 关闭 PSD / PSB,不保存修改
doc.close(SaveOptions.DONOTSAVECHANGES);
} catch (e) {
failList.push(docName + ":失败 - " + e.message);
if (CLOSE_FAILED_DOCS) {
try {
doc.close(SaveOptions.DONOTSAVECHANGES);
} catch (closeErr) {}
}
}
}
var msg = "完成。\n\n成功导出:" + successCount + " 个\n跳过:" + skipCount + " 个";
if (failList.length > 0) {
msg += "\n\n问题列表:\n" + failList.join("\n");
}
alert(msg);
// =========================
// 工具函数
// =========================
function getOriginalDocName(doc) {
try {
return decodeURI(doc.fullName.name);
} catch (e) {
return decodeURI(doc.name);
}
}
function hasSelection() {
try {
var b = app.activeDocument.selection.bounds;
return true;
} catch (e) {
return false;
}
}
function makeUniqueFile(folder, baseName, ext) {
var file = new File(folder.fsName + "/" + baseName + ext);
var index = 1;
while (file.exists) {
file = new File(folder.fsName + "/" + baseName + "_" + index + ext);
index++;
}
return file;
}


