1、在桌面新建一个 All 文件夹
2、执行以下脚本 导出所有图层(保持图像尺寸)到这个文件夹(组看作一个图层)
javascript
// export_layers_to_all.jsx
// 将所有图层(组也视作一个图层)分别导出为 PNG,保留画布尺寸,导出到 桌面/All 文件夹。
// 适用于 Photoshop ExtendScript(.jsx)
// 使用:File > Scripts > Browse... 运行此脚本
#target photoshop
app.bringToFront();
if (!documents.length) {
alert("没有打开的文档。请先打开一个 PSD 文件再运行此脚本。");
} else {
var srcDoc = app.activeDocument;
// 创建导出文件夹:桌面/All
var outFolder = new Folder(Folder.desktop + "/All");
if (!outFolder.exists) outFolder.create();
// 收集所有"导出项"(ArtLayer 与 LayerSet 都视作导出目标)
var exportItems = [];
function traverse(layerContainer, path) {
for (var i = 0; i < layerContainer.layers.length; i++) {
var lyr = layerContainer.layers[i];
var itemPath = path ? (path + "/" + lyr.name) : lyr.name;
// 记录当前层/组为一个导出目标
exportItems.push({ layer: lyr, path: itemPath });
// 重要修改:如果是组(LayerSet),**不再递归其内部** ------ 将组视作单一导出项
// 之前的代码会遍历组内部并把子层也加入 exportItems,现在我们不做这件事。
// if (lyr.typename === "LayerSet") {
// traverse(lyr, itemPath);
// }
}
}
traverse(srcDoc, "");
// sanitize filename
function sanitizeFilename(name) {
// 替换 Windows/Unix 不允许或不方便的字符
var s = name.replace(/[:\\\/\*\?"<>\|]/g, "_");
// 去掉多余空格与控制字符
s = s.replace(/^\s+|\s+$/g, "");
s = s.replace(/[\r\n]+/g, "");
// 限制长度
if (s.length > 120) s = s.substring(0, 120);
return s;
}
// map document mode to NewDocumentMode for app.documents.add
function modeToNewDocMode(mode) {
// DocumentMode enums: RGB, CMYK, GRAYSCALE, LAB, BITMAP
// NewDocumentMode constants: NewDocumentMode.RGB, CMYK, GRAYSCALE, LAB, BITMAP
try {
switch(mode) {
case DocumentMode.RGB: return NewDocumentMode.RGB;
case DocumentMode.CMYK: return NewDocumentMode.CMYK;
case DocumentMode.GRAYSCALE: return NewDocumentMode.GRAYSCALE;
case DocumentMode.LAB: return NewDocumentMode.LAB;
case DocumentMode.BITMAP: return NewDocumentMode.BITMAP;
default: return NewDocumentMode.RGB;
}
} catch(e) {
return NewDocumentMode.RGB;
}
}
// 导出项计数
var exported = 0;
var errors = [];
// 主循环:对每一项创建同尺寸新文档,duplicate 层/组 到新文档,保存为 PNG,然后关闭新文档
for (var i = 0; i < exportItems.length; i++) {
try {
var item = exportItems[i].layer;
var itemPath = exportItems[i].path;
// 使用图层/组本身的原名称作为文件名(sanitize 过)
var safeName = sanitizeFilename(item.name);
var outFile = new File(outFolder.fsName + "/" + safeName + ".png");
// 新建文档(与源文档相同尺寸与分辨率,透明背景)
var ndMode = modeToNewDocMode(srcDoc.mode);
var newDoc = app.documents.add(srcDoc.width, srcDoc.height, srcDoc.resolution, safeName, ndMode, DocumentFill.TRANSPARENT);
// 复制目标层/组 到新文档
// 注意:duplicate 在 Layer 和 LayerSet 上都可用
// 我们使用 try/catch 防止某些特殊层类型时报错
try {
// 需要把目标图层在源文档中激活(有时 duplicate 要求源是活动文档)
app.activeDocument = srcDoc;
// duplicate 到 newDoc
item.duplicate(newDoc, ElementPlacement.INSIDE);
} catch (dupErr) {
// 备选办法:如果 duplicate 失败,尝试选中并复制像素(尽量避免,但保留错误消息)
throw new Error("duplicate 失败: " + dupErr);
}
// 切换到新文档并仅保留复制进去的图层(通常新文档只有复制的图层)
app.activeDocument = newDoc;
// 保存为 PNG(保持透明)
var pngOptions = new PNGSaveOptions();
// pngOptions.interlaced = false; // 可选
// 使用 saveAs,覆盖现有文件
newDoc.saveAs(outFile, pngOptions, true, Extension.LOWERCASE);
// 关闭新文档(已保存),不保存追加更改
newDoc.close(SaveOptions.DONOTSAVECHANGES);
exported++;
} catch (e) {
// 记录并继续
errors.push({index: i+1, name: exportItems[i].path, error: e.toString()});
// 如果 newDoc 仍然打开,尝试关闭以避免堆积
try { if (app.documents.length > 0 && app.activeDocument && app.activeDocument.name == safeName) app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); } catch(ignore) {}
}
}
// 切回原文档
try { app.activeDocument = srcDoc; } catch(e) {}
// 结果提示
var msg = "导出完成。\n\n目标总数: " + exportItems.length + "\n成功导出: " + exported + "\n输出目录: " + outFolder.fsName;
if (errors.length) {
msg += "\n失败: " + errors.length + "(详情请在脚本控制台查看)";
// 在 ExtendScript Toolkit / ESTK 或 Console 打印错误详情
$.writeln("===== export_layers_to_all.jsx 错误详情 =====");
for (var k = 0; k < errors.length; k++) {
$.writeln("[" + errors[k].index + "] " + errors[k].name + " -> " + errors[k].error);
}
$.writeln("============================================");
}
alert(msg);
}