PS导出所有图层到png文件 脚本

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);
}
相关推荐
我命由我123452 天前
Photoshop - Photoshop 调整画布大小
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
YANshangqian3 天前
免Adobe Photoshop 2025
ui·adobe·photoshop
2016bits4 天前
photoshop将一张图片的水印加到另一张图片上
ui·photoshop
街灯L5 天前
【Photoshop】使用画笔预设建立路径描边
ui·photoshop
街灯L5 天前
【Photoshop】使用滤镜库的玻璃效果制造金箔质感贴图
ui·制造·photoshop
聊天QQ:6882388617 天前
自动潜航器的高效控制:修正C/GMRES算法探秘
photoshop
MediaTea23 天前
Photoshop 调整命令使用详解(合集 · 2026版)
ui·photoshop
覆东流1 个月前
Photoshop图形工具组与图层样式
ui·photoshop
覆东流1 个月前
Photoshop合成的核心知识
ui·photoshop