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);
}
相关推荐
AIGCmitutu1 天前
PS 物体底部阴影怎么做?3 步做出自然逼真的投影效果
人工智能·电子商务·photoshop·ps·美工
繁星流动 >_<2 天前
Axure-局部放大图片交互
交互·axure·photoshop
呉師傅3 天前
【使用技巧】Adobe Photoshop 2024调整缩放与布局125%后出现点菜单项漂移问题的简单处理
运维·服务器·windows·adobe·电脑·photoshop
XPii3 天前
Photoshop应用——将图片变为水墨画效果
ui·photoshop
Dontla8 天前
Axure RP(Rapid Prototyper)原型图设计工具介绍
ui·axure·photoshop
XPii8 天前
Photoshop应用——将图片变为油画效果
ui·photoshop
布兰妮甜9 天前
Photoshop中通过图层混合模式实现图像元素透明度渐变过渡的完整指南
人工智能·ui·生活·photoshop·文化
AIGCmitutu9 天前
Photoshop抠图插件2026选择指南,Ps抠图插件哪个好用?
人工智能·ui·ai绘画·photoshop·ps
AIGCmitutu9 天前
Ps怎么把图片2D转3D?新手图文详细教程!
计算机视觉·photoshop·ps·美工
GIS小小研究僧10 天前
如何使用Photoshop扣透明底电子签名
ui·photoshop