Toplu Photoshop katmanlarını ayrı PNG dosyalarına dışa aktarma


130

Fireworks'te yetenekli ve yetenekli bir webciyim, ancak Photoshop'ta çok değil.

Bir web sayfasına dönüşmek için katmanlı bir PSD dosyasını yeni aldım. Biri bana tüm katmanları bireysel png dosyalarına vermenin en kolay yolunu söyleyebilir mi?

Çok fazla katman var ve bunu elle yapmak yanlış görünüyor.

Gördüğüm bu ama PS bunun için özgün işlevleri olmalıdır görünüyor.

Photoshop CS4’e erişimim var. Herhangi bir işaretçi takdir etti.


.Pngs'nin Dizin moduna alınmasını önlemenin herhangi bir yolu var mı? Onlara RGB'ye ihtiyacım var. Muhtemelen bunun için bir damlacık yaratabilirdim, ama daha kolay bir yolu olup olmadığını bilmiyordum ... İpucu için teşekkürler, bu harika!

convertImagemagick'in serbest komutu bunun için kullanılabilir (psd'nin tüm özelliklerini kapsamayabilir).
Uriel

Yanıtlar:


158

Yöntem 1: Adobe'den yerleşik komut dosyası

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

görüntü tanımını buraya girin

İşte bazı ilgili sorular ...

Tek tek katmanları Photoshop'ta dışa aktarma, boyutlarını koruyarak

Katmanları Dosyalara Aktar, 100 katmandan yalnızca 4 png dosyasını dışa aktarır


Yöntem 2: Özel Komut Dosyası

Biraz zaman geçirdim ve bu işlemi otomatikleştirmek için kendi senaryo dosyamı yazdım. Bu işlem yukarıda belirtilen yerleşik komut dosyasından çok daha hızlı.

Senaryoyu şimdi Github'da alın!

ek bilgi

Bu betiği 60 saniyenin altındaki bir 100 MB 450MB dosya üzerinde çalıştırdım. Yerleşik komut dosyasını aynı dosya üzerinde çalıştırmak yaklaşık 30 dakika sürer.

Nest katman gruplarıyla test ederken, betiğimin yaklaşık 90 saniye içinde çalıştığını, bununla birlikte yerleşik betiğin yaklaşık 27 dakika sürdüğünü (ve aslında yanlış verdiğini) gördüm.

Lütfen bu sonuçların, dosyaların donanımının yanı sıra bilgisayarınızdaki donanıma ve Photoshop sürümüne bağlı olarak değişeceğini unutmayın. Ek performans verileri .

Bu senaryo (son birkaç yılda) çeşitli katılımcılardan çeşitli iyileştirmeler aldı . Senaryo ile herhangi bir sorunla karşılaşırsanız. Burada komut dosyasıyla ilgili sorunları dosyalayabilirsiniz .

Diğer ek bilgiler için lütfen beni oku .

Yasal Uyarı: Bu komut dosyası, Adobe ile hiçbir şekilde ilişkili değildir. Lütfen betiği kullanmak kendi sorumluluğunuzdadır - kullanmadan önce daima PSD'nizi yedekleyin. Zarar görmüş veya kaybolan verilerden sorumlu değilim.


1
@Lucian - Photoshop CC kullanıyorsanız , bunu başka türlü yapabilirsiniz , Github'a bir sorun bildirin . Teşekkürler!
Hanna

Johannes bu soru için harika bir senaryo hazırladı ve birkaç kez haklı olarak hak etti. Ancak yorumlarda bunun için destek arama. Bununla ilgili bir sorununuz varsa lütfen depodan bir çözüm arayınız, böylece takip edilebilirler.
DᴀʀᴛʜVᴀᴅᴇʀ

Bu araç altında, şimdi olduğu 2018 den RaporlamaFile -> Export -> Layers to Files...
akinuri

Başka birinin kafası karışırsa, bu bir Photoshop betiğidir ve bu nedenle de Photoshop gereklidir. Bir kabuk betiği olacağını düşündüm. :)
Chris Rae,

1
@ Bunları epik! İyi iş ve teşekkür ederim!
Chris Emerson

18

Johannes'in bir yıl önceki çözümünü birçok iyileştirme ile güncelledim. Büyük ölçüde:

  • Katman grupları artık tüm katmanların yazılması için düzgün bir şekilde işleniyor.
  • Dosya adları, çakışmaları önlemek için otomatik olarak artırılır (bu, birden fazla katman aynı ada sahip olduğunda gerçekleşir).
  • Performans arttırıldı. Komut birkaç dakika içinde 500 basit katman kaydedebilir.

Bunun yanı sıra, kod temizlendi. Örneğin, global değişkenler tek bir diziye entegre edilmiştir.

İlk açılan mesajın sadece üst seviye katmanların sayısını söyleyeceğini unutmayın . Bu, performansın düşmesini önlemek içindir. Gerçekten, uğraştığınız dosya hakkında hiçbir şey bilmediğiniz bir durumu hayal edemiyorum, bu yüzden bu bir uzlaşma olmamalıdır.

Senaryoyu buradan al . Yolu açan önceki yazara teşekkür ederiz.


Bu senaryoyu korumak konusunda gerçekten çok başarılı. Binlerce katmanda yapılan düzeltmelerin zaman
aşımına uğramasına

7

KREDİ DOSYAYI KATKI İÇİN JOHANNES'E GELİYOR. ÇOK TEŞEKKÜR EDERİM!

2448 katman dosyamı yaklaşık 3 saat içinde geçirmeme yardımcı olan bir işlev ekledim.

İşte değiştirilmiş dosyanın bağlantısı Buradan İndirin


6

Komut dosyasını, belgenin temel BackgroundLayer özelliğini kullanacak şekilde güncelledim. Böylece ihracata her jpg onunla derlenir.

Birisi varsayılan BackgroundLayer ;-) yerine Asıl katmanlar yapmak için katmanlara etiketleme eklerse çok iyi olurdu.

tam komut dosyası:

    // 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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.