将Photoshop图层批量导出到单个PNG文件


130

我是一名Web开发人员,并且可以胜任Fireworks的工作,但在Photoshop中却没有那么多。

我刚收到一个分层的PSD文件,它将变成一个网页。谁能告诉我将所有图层导出到单个png文件的最简单方法吗?

有很多层,手动执行此操作似乎是错误的。

我已经看到了这一点,但看来PS中应该对此具有本机功能。

我可以使用Photoshop CS4。任何指针表示赞赏。


有什么方法可以避免将.png转换为索引模式?我需要它们RGB。我可能只为它创建了一个小滴,但是不知道是否有更简单的方法……不过,感谢您的提示,这很棒!

convertImagemagick 的free 命令可用于此目的(它可能缺少完整的psd功能介绍)。
Uriel 2015年

Answers:


158

方法1:Adobe的内置脚本

File >> Scripts >> Export layers to files...

在此处输入图片说明

这是一些相关的问题...

在Photoshop中导出单个图层,并保持其大小

将图层导出到文件仅从100层导出4个png文件


方法2:自定义脚本

我花了一些时间并编写了自己的脚本文件来自动化该过程。 此过程比上面提到的内置脚本快得多。

立即在Github上获取脚本!

附加信息

我在60秒内在100层450MB文件上运行了该脚本。在同一文件上运行内置脚本大约需要30分钟。

在使用嵌套图层组进行测试时,我发现我的脚本运行大约90秒,而内置脚本大约需要27分钟(实际上将其导出错误)。

请注意,这些结果将根据文件的复杂性,计算机上的硬件以及Photoshop的版本而有所不同。其他性能数据

在过去的几年中,该脚本得到了不同贡献者的各种改进如果脚本遇到任何问题。您可以在此处提交脚本问题

请通读自述文件以获取其他任何附加信息。

免责声明:此脚本不以任何方式与Adobe相关联。使用脚本需要您自担风险-使用前请务必备份PSD。对于任何损坏或丢失的数据,我概不负责。


1
@Lucian-如果您使用的是Photoshop CC ,则可以执行其他操作,然后在Github上提交问题。谢谢!
汉娜(Hanna)

约翰内斯(Johannes)为这个问题写了一个很棒的剧本,应该理应多次投票,但请不要在评论中寻求支持。如果您对此有疑问,请通过回购寻求解决方案,以便对其进行相应的跟踪。
DᴀʀᴛʜVᴀᴅᴇʀ

从2018年开始报告。此工具现在位于File -> Export -> Layers to Files...
akinuri

万一其他人感到困惑,这是一个Photoshop脚本,因此是必需的Photoshop。我认为这将是一个shell脚本。:)
克里斯·雷

1
@Hanna这些是史诗!!做得好,谢谢!
克里斯·爱默生

18

我已经在一年前更新了Johannes的解决方案,并进行了许多改进。重要的是:

  • 现在可以正确处理图层组,以便写入所有图层。
  • 文件名会自动增加以防止冲突(当多个图层具有相同的名称时会发生这种情况)。
  • 性能提高。该脚本可以在几分钟内保存500个简单图层。

除此之外,代码已被清理。例如,全局变量已集成到单个数组中。

请注意,初始弹出消息只会告诉您顶层的数量。这是为了避免性能下降。我实在无法想象您对正在处理的文件一无所知的情况,因此这应该不是什么妥协。

此处获取脚本。感谢前一位作者的领导。


维护此脚本确实做得很好。在数千个图层上输出一些耗时的校正结果时,它的工作效果非常好:)
iwasrobbed

7

信用将用于贡献文件。非常感谢!

我添加了一个功能,可以帮助我在大约3个小时内浏览2448图层文件。

这是修改后的文件的链接在这里下载


6

我更新了脚本以使用文档的核心BackgroundLayer。这样,导出的每个jpg都将随之编译。

如果有人在图层中添加了标记以使其成为主图层,而不是默认的BackgroundLayer ;-),那就太好了

完整脚本:

    // NAME: 
//  SaveLayers

// DESCRIPTION: 
//  Saves each layer in the active document to a PNG or JPG file named after the layer. 
//  These files will be created in the current document folder (same as working PSD).

// REQUIRES: 
//  Adobe Photoshop CS2 or higher

//Most current version always available at: https://github.com/jwa107/Photoshop-Export-Layers-as-Images

// enable double-clicking from Finder/Explorer (CS2 and higher)
#target photoshop
app.bringToFront();

function main() {
    // two quick checks
    if(!okDocument()) {
        alert("Document must be saved and be a layered PSD.");
        return; 
    }

    var len = activeDocument.layers.length;
    var ok = confirm("Note: All layers will be saved in same directory as your PSD.\nThis document contains " + len + " top level layers.\nBe aware that large numbers of layers may take some time!\nContinue?");
    if(!ok) return

    // user preferences
    prefs = new Object();
    prefs.fileType = "";
    prefs.fileQuality = 12;
    prefs.filePath = app.activeDocument.path;
    prefs.count = 0;

    //instantiate dialogue
    Dialog();
    hideLayers(activeDocument);
    saveLayers(activeDocument);
    toggleVisibility(activeDocument);
    alert("Saved " + prefs.count + " files.");
}

function hideLayers(ref) {
    var len = ref.layers.length;
    for (var i = 0; i < len; i++) {
        var layer = ref.layers[i];
        if (layer.typename == 'LayerSet') hideLayers(layer);
        else layer.visible = false;
    }
}

function toggleVisibility(ref) {
    var len = ref.layers.length;
    for (var i = 0; i < len; i++) { 
        layer = ref.layers[i];
        layer.visible = !layer.visible;
    }
}

function saveLayers(ref) {
    var len = ref.layers.length;
    // rename layers top to bottom
    for (var i = 0; i < len; i++) {
        var layer = ref.layers[i];
        if (layer.typename == 'LayerSet') {
            // recurse if current layer is a group
            hideLayers(layer);
            saveLayers(layer);
        } else {
            // otherwise make sure the layer is visible and save it
            layer.visible = true;

    // NEW MASTER BACKGROUND LAYER -- comment this line if u dont want to see that layer compiled in the jpgs
       activeDocument.backgroundLayer.visible = true;

    saveImage(layer.name);

     layer.visible = false;
        }
    }
}

function saveImage(layerName) {
    var fileName = layerName.replace(/[\\\*\/\?:"\|<> ]/g,''); 
    if(fileName.length ==0) fileName = "autoname";
    var handle = getUniqueName(prefs.filePath + "/" + fileName);
    prefs.count++;

    if(prefs.fileType=="PNG" && prefs.fileQuality=="8") {
        SavePNG8(handle); 
    } else if (prefs.fileType=="PNG" && prefs.fileQuality=="24") {
        SavePNG24(handle);
    } else {
        SaveJPEG(handle); 
    }
}

function getUniqueName(fileroot) { 
    // form a full file name
    // if the file name exists, a numeric suffix will be added to disambiguate

    var filename = fileroot;
    for (var i=1; i<100; i++) {
        var handle = File(filename + "." + prefs.fileType); 
        if(handle.exists) {
            filename = fileroot + "-" + padder(i, 3);
        } else {
            return handle; 
        }
    }
} 

function padder(input, padLength) {
    // pad the input with zeroes up to indicated length
    var result = (new Array(padLength + 1 - input.toString().length)).join('0') + input;
    return result;
}

function SavePNG8(saveFile) { 
    exportOptionsSaveForWeb = new ExportOptionsSaveForWeb();
    exportOptionsSaveForWeb.format = SaveDocumentType.PNG
    exportOptionsSaveForWeb.dither = Dither.NONE;



    activeDocument.exportDocument( saveFile, ExportType.SAVEFORWEB, exportOptionsSaveForWeb );
} 

function SavePNG24(saveFile) { 
    pngSaveOptions = new PNGSaveOptions(); 
    activeDocument.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE); 
} 

function SaveJPEG(saveFile) { 
    jpegSaveOptions = new JPEGSaveOptions(); 
    jpegSaveOptions.quality = prefs.fileQuality;
   activeDocument.saveAs(saveFile, jpegSaveOptions, true, Extension.LOWERCASE); 
} 

function Dialog() {
    // build dialogue
    var dlg = new Window ('dialog', 'Select Type'); 
    dlg.saver = dlg.add("dropdownlist", undefined, ""); 
    dlg.quality = dlg.add("dropdownlist", undefined, "");
    dlg.pngtype = dlg.add("dropdownlist", undefined, "");


    // file type
    var saveOpt = [];
    saveOpt[0] = "PNG"; 
    saveOpt[1] = "JPG"; 
    for (var i=0, len=saveOpt.length; i<len; i++) {
        dlg.saver.add ("item", "Save as " + saveOpt[i]);
    }; 

    // trigger function
    dlg.saver.onChange = function() {
        prefs.fileType = saveOpt[parseInt(this.selection)]; 
        // decide whether to show JPG or PNG options
        if(prefs.fileType==saveOpt[1]){
            dlg.quality.show();
            dlg.pngtype.hide();
        } else {
            dlg.quality.hide();
            dlg.pngtype.show();
        }
    }; 

    // jpg quality
    var qualityOpt = [];
    for(var i=12; i>=1; i--) {
        qualityOpt[i] = i;
        dlg.quality.add ('item', "" + i);
    }; 

    // png type
    var pngtypeOpt = [];
    pngtypeOpt[0]=8;
    pngtypeOpt[1]=24;
    dlg.pngtype.add ('item', ""+ 8 );
    dlg.pngtype.add ('item', "" + 24);

    // trigger functions
    dlg.quality.onChange = function() {
        prefs.fileQuality = qualityOpt[12-parseInt(this.selection)];
    };
    dlg.pngtype.onChange = function() {
       prefs.fileQuality = pngtypeOpt[parseInt(this.selection)]; 
    };

    // remainder of UI
    var uiButtonRun = "Continue"; 

    dlg.btnRun = dlg.add("button", undefined, uiButtonRun ); 
    dlg.btnRun.onClick = function() {   
        this.parent.close(0); 
    }; 

    dlg.orientation = 'column'; 

    dlg.saver.selection = dlg.saver.items[0] ;
    dlg.quality.selection = dlg.quality.items[0] ;
    dlg.center(); 
    dlg.show();
}

function okDocument() {
     // check that we have a valid document

    if (!documents.length) return false;

    var thisDoc = app.activeDocument; 
    var fileExt = decodeURI(thisDoc.name).replace(/^.*\./,''); 
    return fileExt.toLowerCase() == 'psd'
}

function wrapper() {
    function showError(err) {
        alert(err + ': on line ' + err.line, 'Script Error', true);
    }

    try {
        // suspend history for CS3 or higher
        if (parseInt(version, 10) >= 10) {
            activeDocument.suspendHistory('Save Layers', 'main()');
        } else {
            main();
        }
    } catch(e) {
        // report errors unless the user cancelled
        if (e.number != 8007) showError(e);
    }
}

wrapper();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.