Stapelexport von Photoshop-Ebenen in einzelne PNG-Dateien

130

Ich bin ein Webentwickler und kompetent in Fireworks, aber nicht so sehr in Photoshop.

Ich habe gerade eine PSD-Datei mit mehreren Ebenen erhalten, die in eine Webseite umgewandelt werden soll. Kann mir jemand sagen, wie ich am einfachsten alle Ebenen in einzelne PNG-Dateien exportieren kann?

Es gibt viele Ebenen und es scheint falsch, dies manuell zu tun.

Ich habe gesehen , dies aber es scheint es für diese nativen Funktionalität in PS sein sollte.

Ich habe Zugriff auf Photoshop CS4. Alle Hinweise geschätzt.

user256888
quelle
Gibt es eine Möglichkeit zu vermeiden, dass die .pngs in den Indexmodus geschaltet werden? Ich brauche sie RGB. Ich könnte wahrscheinlich nur ein Tröpfchen dafür erstellen, wusste aber nicht, ob es einen einfacheren Weg gibt ... Vielen Dank für den Tipp, das ist großartig!
convertHierfür kann der kostenlose Befehl von Imagemagick verwendet werden (es fehlt möglicherweise die vollständige Abdeckung der PSD-Funktionen).
Uriel

Antworten:

158

Methode 1: Das integrierte Skript von Adobe

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

Bildbeschreibung hier eingeben

Hier sind einige verwandte Fragen ...

Exportieren einzelner Ebenen in Photoshop unter Beibehaltung ihrer Größe

Ebenen in Dateien exportieren exportiert nur 4 PNG-Dateien aus 100 Ebenen


Methode 2: Benutzerdefiniertes Skript

Ich habe einige Zeit damit verbracht, meine eigene Skriptdatei zu schreiben, um diesen Prozess zu automatisieren. Dieser Prozess ist viel schneller als das oben erwähnte eingebaute Skript.

Holen Sie sich das Skript jetzt auf Github!

zusätzliche Information

Ich habe dieses Skript in weniger als 60 Sekunden auf einer 100-Layer-Datei mit 450 MB ausgeführt. Das Ausführen des integrierten Skripts für dieselbe Datei dauert ungefähr 30 Minuten.

Beim Testen mit Verschachtelungsebenengruppen stellte ich fest, dass mein Skript in ungefähr 90 Sekunden ausgeführt wird, während das integrierte Skript ungefähr 27 Minuten dauert (und es tatsächlich falsch exportiert).

Bitte beachten Sie, dass diese Ergebnisse von der Komplexität der Dateien sowie der Hardware auf Ihrem Computer und der Version von Photoshop abhängen. Zusätzliche Leistungsdaten .

Dieses Skript wurde (in den letzten Jahren) von verschiedenen Autoren verbessert . Wenn Sie auf Probleme mit dem Skript stoßen. Sie können hier Probleme mit dem Skript einreichen .

Bitte lesen Sie die Readme-Datei , um zusätzliche Informationen zu erhalten.

Haftungsausschluss: Dieses Skript ist in keiner Weise mit Adobe verknüpft. Verwenden Sie das Skript auf eigenes Risiko. Erstellen Sie immer eine Sicherungskopie Ihrer PSD, bevor Sie sie verwenden. Ich bin nicht verantwortlich für beschädigte oder verlorene Daten.

Hanna
quelle
1
@Lucian - Wenn Sie Photoshop CC verwenden , können Sie dies auch auf andere Weise tun. Melden Sie ein Problem bei Github an . Vielen Dank!
Hanna
Johannes hat ein großartiges Skript für diese Frage geschrieben und sollte zu Recht mehrmals eine Gegenstimme verdienen, aber bitte suchen Sie in den Kommentaren keine Unterstützung dafür. Wenn Sie ein Problem damit haben, suchen Sie bitte im Repo nach einer Lösung, damit sie entsprechend nachverfolgt werden können.
DᴀʀᴛʜVᴀᴅᴇʀ
Berichterstattung ab 2018. Dieses Tool ist jetzt unterFile -> Export -> Layers to Files...
akinuri
Für den Fall, dass jemand verwirrt wird, handelt es sich um ein Photoshop-Skript, für das Photoshop erforderlich ist. Ich dachte, es würde ein Shell-Skript werden. :)
Chris Rae
1
@Hanna diese sind EPISCH !! Gute Arbeit und danke!
Chris Emerson
18

Ich habe Johannes 'Lösung vor einem Jahr mit vielen Verbesserungen aktualisiert. Bedeutend:

  • Layergruppen werden nun korrekt behandelt, sodass alle Layer geschrieben werden.
  • Dateinamen werden automatisch inkrementiert, um Kollisionen zu vermeiden (dies geschieht, wenn mehr als eine Ebene denselben Namen hat).
  • Die Leistung wird gesteigert. Das Skript kann in wenigen Minuten 500 einfache Ebenen speichern.

Außerdem wurde der Code aufgeräumt. Beispielsweise wurden globale Variablen in ein einzelnes Array integriert.

Beachten Sie, dass die anfängliche Popup-Meldung nur die Anzahl der obersten Ebenen angibt. Dies dient zur Vermeidung von Leistungseinbußen. Ich kann mir keinen Fall vorstellen, in dem Sie nichts über die Datei wissen, mit der Sie es zu tun haben, daher sollte dies kein großer Kompromiss sein.

Besorgen Sie sich das Skript hier . Vielen Dank an den vorherigen Autor für die Vorreiterrolle.

escalation746
quelle
Wirklich gut gemacht bei der Pflege dieses Skripts. Es funktionierte sehr gut einige Zeit Export Korrekturen auf Tausende von Schichten :) verfallen
iwasrobbed
7

KREDIT GEHT AN JOHANNES, UM DIE DATEI BEITRAGEN ZU KÖNNEN. ICH DANKE DIR SEHR!

Ich habe eine Funktion hinzugefügt, mit der ich meine 2448-Layer-Datei in ca. 3 Stunden durcharbeiten konnte.

Hier ist der Link zur modifizierten Datei Download Here

Mike June Bug Captain
quelle
6

Ich habe das Skript so aktualisiert, dass es die zentrale Hintergrundebene des Dokuments verwendet. Damit wird jedes exportierte JPG damit kompiliert.

Wäre großartig, wenn jemand Ebenen Tags hinzufügt, um sie zu Master-Ebenen zu machen, anstatt der Standard-Hintergrundebene ;-)

Vollständiges Skript:

    // 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();
Arturino
quelle