Xuất hàng loạt các lớp Photoshop sang các tệp PNG riêng lẻ


130

Tôi là một nhà phát triển web và có năng lực trong Fireworks, nhưng không nhiều về Photoshop.

Tôi vừa nhận được một tệp PSD phân lớp để biến thành một trang web. Ai đó có thể cho tôi biết cách dễ nhất để xuất tất cả các lớp sang các tệp png riêng lẻ không?

Có rất nhiều lớp và làm điều này bằng tay có vẻ sai.

Tôi đã thấy điều này nhưng có vẻ như nên có chức năng riêng cho việc này trong PS.

Tôi có quyền truy cập vào Photoshop CS4. Bất kỳ con trỏ đánh giá cao.


Có cách nào để tránh việc .pngs chuyển sang chế độ Index không? Tôi cần chúng RGB. Tôi có lẽ chỉ có thể tạo ra một giọt cho nó, nhưng không biết có cách nào dễ dàng hơn không ... Cảm ơn vì tiền boa, điều này thật tuyệt!

Lệnh miễn phí converttừ Imagemagick có thể được sử dụng cho việc này (nó có thể thiếu phạm vi bảo hiểm tính năng psd hoàn chỉnh).
Uriel

Câu trả lời:


158

Phương pháp 1: Tập lệnh tích hợp từ Adobe

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

nhập mô tả hình ảnh ở đây

Dưới đây là một số câu hỏi liên quan ...

Xuất các lớp riêng lẻ trong Photoshop, giữ nguyên kích thước của chúng

Xuất lớp sang tệp chỉ xuất 4 tệp png từ 100 lớp


Phương pháp 2: Tập lệnh tùy chỉnh

Tôi đã dành một chút thời gian và viết tập tin kịch bản của riêng tôi để tự động hóa quá trình này. Quá trình này nhanh hơn nhiều so với tập lệnh tích hợp được đề cập ở trên.

Nhận kịch bản ngay bây giờ trên Github!

thông tin thêm

Tôi đã chạy tập lệnh này trên một tệp 100 lớp, 450 MB trong vòng dưới 60 giây. Chạy tập lệnh tích hợp trên cùng một tệp mất khoảng 30 phút.

Khi thử nghiệm với các nhóm lớp tổ, tôi thấy rằng tập lệnh của tôi chạy trong khoảng 90 giây trong khi tập lệnh tích hợp mất khoảng 27 phút (và thực sự xuất nó sai).

Xin lưu ý rằng những kết quả này sẽ thay đổi tùy thuộc vào độ phức tạp của các tệp cũng như phần cứng trên máy tính của bạn và phiên bản Photoshop. Dữ liệu hiệu suất bổ sung .

Kịch bản này đã (trong vài năm qua) đã nhận được nhiều cải tiến từ những người đóng góp khác nhau. Nếu bạn gặp phải bất kỳ vấn đề với kịch bản. Bạn có thể gửi các vấn đề với tập lệnh ở đây .

Vui lòng đọc qua phần đọc để biết thêm thông tin bổ sung.

Tuyên bố miễn trừ trách nhiệm: Tập lệnh này không được liên kết với Adobe dưới bất kỳ hình thức nào. Vui lòng sử dụng tập lệnh có nguy cơ của riêng bạn - luôn sao lưu PSD của bạn trước khi sử dụng. Tôi không chịu trách nhiệm cho bất kỳ dữ liệu bị hư hỏng hoặc bị mất.


1
@Lucian - nếu bạn đang sử dụng Photoshop CC, bạn có thể làm điều này nếu không, hãy gửi một vấn đề trên Github . Cảm ơn!
Hanna

Johannes đã tạo ra một kịch bản tuyệt vời cho câu hỏi này và đáng được nhận một cách đúng đắn nhiều lần nhưng xin đừng tìm kiếm sự hỗ trợ cho điều này trong các bình luận. Nếu bạn gặp vấn đề với điều này, vui lòng tìm kiếm giải pháp thông qua repo để chúng có thể được theo dõi.
DVᴀᴅᴇʀ

Báo cáo từ năm 2018. Công cụ này, bây giờ, dướiFile -> Export -> Layers to Files...
akinuri

Trong trường hợp bất kỳ ai khác bị nhầm lẫn, đây là một tập lệnh Photoshop và do đó cần có Photoshop. Tôi nghĩ rằng nó sẽ là một kịch bản shell. :)
Chris Rae

1
@Hanna đây là EPIC !! Làm việc tốt và cảm ơn bạn!
Chris Emerson

18

Tôi đã cập nhật giải pháp của Julian một năm trước với nhiều cải tiến. Đáng kể:

  • Các nhóm lớp hiện được xử lý đúng cách để tất cả các lớp được viết.
  • Tên tệp được tự động tăng để tránh va chạm (điều này xảy ra khi có nhiều hơn một lớp có cùng tên).
  • Hiệu suất được tăng lên. Kịch bản có thể lưu 500 lớp đơn giản trong vài phút.

Bên cạnh đó, mã đã được làm sạch. Ví dụ, các biến toàn cục đã được tích hợp vào một mảng duy nhất.

Lưu ý rằng thông báo bật lên ban đầu sẽ chỉ cho bạn biết số lớp cấp cao nhất . Điều này là để tránh sự suy giảm hiệu suất. Tôi thực sự không thể tưởng tượng được một trường hợp bạn không biết gì về tập tin bạn đang xử lý, vì vậy điều này không nên thỏa hiệp nhiều.

Lấy kịch bản ở đây . Cảm ơn các tác giả trước đã dẫn đầu.


Thực sự rất tốt về việc duy trì kịch bản này. Nó hoạt động rất tốt khi xuất một số thời gian hiệu chỉnh trên hàng ngàn lớp :)
iwasrobbed


6

Tôi đã cập nhật tập lệnh để sử dụng BackgroundLayer cốt lõi của tài liệu. Vì vậy, mỗi jpg mà xuất khẩu được biên dịch với nó.

Sẽ thật tuyệt nếu ai đó thêm gắn thẻ vào các lớp để biến chúng thành các lớp Master thay vì BackgroundLayer mặc định ;-)

kịch bản đầy đủ:

    // 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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.