Ekspor batch Photoshop lapisan ke file PNG individu


130

Saya seorang web dev dan kompeten dalam Fireworks, tetapi tidak begitu banyak di Photoshop.

Saya baru saja menerima file PSD berlapis untuk berubah menjadi halaman web. Adakah yang bisa memberi tahu saya cara termudah untuk mengekspor semua lapisan ke file png individual?

Ada banyak lapisan dan melakukan ini secara manual sepertinya salah.

Saya telah melihat ini tetapi tampaknya harus ada fungsi asli untuk ini di PS.

Saya memiliki akses ke Photoshop CS4. Setiap petunjuk dihargai.


Apakah ada cara untuk menghindari .png berubah menjadi mode Indeks? Saya membutuhkannya RGB. Saya mungkin hanya bisa membuat tetesan untuk itu, tetapi tidak tahu apakah ada cara yang lebih mudah ... Terima kasih atas tipnya, ini hebat!

convertPerintah gratis dari Imagemagick dapat digunakan untuk ini (mungkin tidak memiliki cakupan fitur psd lengkap).
Uriel

Jawaban:


158

Metode 1: Script Internal dari Adobe

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

masukkan deskripsi gambar di sini

Inilah beberapa pertanyaan terkait ...

Mengekspor lapisan individual di Photoshop, menjaga ukurannya

Ekspor Lapisan ke File hanya mengekspor file 4 png dari 100 lapisan


Metode 2: Skrip Kustom

Saya menghabiskan waktu dan menulis file skrip saya sendiri untuk mengotomatiskan proses ini. Proses ini jauh lebih cepat daripada skrip bawaan yang disebutkan di atas.

Dapatkan skripnya sekarang di Github!

informasi tambahan

Saya menjalankan skrip ini pada file 100 layer, 450MB dalam waktu kurang dari 60 detik. Menjalankan skrip bawaan pada file yang sama membutuhkan waktu sekitar 30 menit.

Saat menguji dengan grup layer sarang, saya menemukan bahwa skrip saya berjalan dalam waktu sekitar 90 detik sedangkan skrip bawaan membutuhkan waktu sekitar 27 menit (dan sebenarnya mengekspornya salah).

Harap dicatat bahwa hasil ini akan bervariasi tergantung pada kerumitan file serta perangkat keras pada komputer Anda dan versi Photoshop. Data kinerja tambahan .

Skrip ini telah (selama beberapa tahun terakhir) mendapatkan berbagai peningkatan dari berbagai kontributor. Jika Anda mengalami masalah dengan skrip. Anda dapat mengajukan masalah dengan skrip di sini .

Silakan baca- baca saya untuk informasi tambahan, tambahan.

Penafian: Skrip ini tidak terkait dengan Adobe dengan cara apa pun. Silakan gunakan skrip dengan risiko Anda sendiri - selalu buat cadangan PSD Anda sebelum menggunakannya. Saya tidak bertanggung jawab atas data yang rusak atau hilang.


1
@Lucian - jika Anda menggunakan Photoshop CC Anda bisa melakukan ini sebaliknya, ajukan masalah pada Github . Terima kasih!
Hanna

Johannes telah membuat skrip yang luar biasa untuk pertanyaan ini dan harus berhak menerima upvote beberapa kali, tetapi tolong jangan mencari dukungan untuk ini dalam komentar. Jika Anda memiliki masalah dengan ini, silakan mencari solusi melalui repo sehingga mereka dapat dilacak sesuai.
DᴀʀᴛʜVᴀᴅᴇʀ

Pelaporan dari 2018. Alat ini, sekarang, di bawahFile -> Export -> Layers to Files...
akinuri

Jika ada orang lain yang bingung, ini adalah skrip Photoshop dan karenanya diperlukan Photoshop. Saya pikir itu akan menjadi skrip shell. :)
Chris Rae

1
@Hanna ini EPIC !! Kerja bagus dan terima kasih!
Chris Emerson

18

Saya telah memperbarui solusi Johannes setahun yang lalu dengan banyak perbaikan. Secara signifikan:

  • Grup layer sekarang ditangani dengan benar sehingga semua layer ditulis.
  • Nama file bertambah secara otomatis untuk mencegah tabrakan (ini terjadi ketika lebih dari satu lapisan memiliki nama yang sama).
  • Performanya meningkat. Script dapat menyimpan 500 layer sederhana dalam beberapa menit.

Selain itu, kode telah dibersihkan. Sebagai contoh, variabel global telah diintegrasikan ke dalam satu array.

Perhatikan bahwa pesan munculan awal hanya akan memberi tahu Anda jumlah lapisan tingkat atas . Ini untuk menghindari penurunan kinerja. Saya benar-benar tidak bisa membayangkan kasus di mana Anda tidak tahu apa-apa tentang file yang Anda hadapi, jadi ini seharusnya tidak banyak kompromi.

Ambil skripnya di sini . Terima kasih kepada penulis sebelumnya karena telah memimpin.


Sangat baik dilakukan untuk mempertahankan skrip ini. Ini bekerja dengan sangat baik mengekspor beberapa waktu yang melewati koreksi pada ribuan layer :)
iwasrobbed

7

KREDIT PERGI KE JOHANNES UNTUK MENGONTRIBUSI FILE. TERIMA KASIH BANYAK!

Saya telah menambahkan fungsi yang membantu saya menelusuri file layer 2448 saya dalam waktu sekitar 3 jam.

Berikut ini tautan ke file yang dimodifikasi Unduh Di Sini


6

Saya memperbarui skrip untuk menggunakan BackgroundLayer inti dari dokumen. Sehingga setiap jpg yang diekspor dikompilasi dengannya.

Akan lebih bagus jika seseorang menambahkan penandaan ke lapisan untuk menjadikannya lapisan Master alih-alih BackgroundLayer default ;-)

skrip lengkap:

    // 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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.