Photoshopレイヤーを個々のPNGファイルにバッチエクスポート


130

私はWeb開発者であり、Fireworksには精通していますが、Photoshopではそれほど優れていません。

Webページに変換するレイヤー化されたPSDファイルを受信しました。誰もがすべてのレイヤーを個々のPNGファイルにエクスポートする最も簡単な方法を教えてもらえますか?

多くのレイヤーがあり、これを手動で行うのは間違っているようです。

私はこれを見てきましたが、PSにはこのためのネイティブ機能があるはずです。

Photoshop CS4にアクセスできます。任意のポインタを高く評価しました。


.pngがインデックスモードに変わるのを避ける方法はありますか?RGBが必要です。たぶんそれ用の液滴を作成することはできたかもしれませんが、もっと簡単な方法があるかどうかは知りませんでした。

convertImagemagick の無料コマンドをこれに使用できます(完全なpsd機能をカバーしていない場合があります)。
ウリエル

回答:


158

方法1:Adobeの組み込みスクリプト

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

ここに画像の説明を入力してください

関連する質問がいくつかあります...

Photoshopで個々のレイヤーをエクスポートし、サイズを維持する

[レイヤーをファイルにエクスポート]は、100レイヤーから4つのpngファイルのみをエクスポートします


方法2:カスタムスクリプト

少し時間をかけて、このプロセスを自動化する独自のスクリプトファイルを作成しました。 このプロセスは、上記の組み込みスクリプトよりもはるかに高速です。

今すぐGithubでスクリプトを入手してください!

追加情報

このスクリプトを100レイヤー、450MBファイルで60秒以内に実行しました。同じファイルで組み込みスクリプトを実行すると、約30分かかります。

ネストレイヤーグループでテストすると、スクリプトは約90秒で実行されますが、ビルトインスクリプトは約27分かかります(実際に間違ってエクスポートされます)。

これらの結果は、ファイルの複雑さ、コンピューターのハードウェア、Photoshopのバージョンによって異なることに注意してください。追加のパフォーマンスデータ

このスクリプトは(過去数年にわたって)さまざまな貢献者からさまざまな改善を受けています。スクリプトで問題が発生した場合。ここでスクリプトの問題を報告できます。

追加の追加情報については、read-meをお読みください。

免責事項:このスクリプトは、Adobeとは一切関係ありません。自己責任でスクリプトを使用してください。使用する前に、常にPSDのバックアップを作成してください。破損または紛失したデータについては責任を負いません。


1
@Lucian -あなたは、PhotoshopのCC使用している場合、あなただけのこの操作を行うことができ、それ以外のGithub上の問題を提出します。ありがとう!
ハンナ

ヨハネスはこの質問に対して素晴らしいスクリプトを作成しており、正当に数回の賛成に値するはずですが、コメントでこれに対するサポートを求めないでください。これに問題がある場合は、レポから解決策を探して、適切に追跡できるようにしてください。
DᴀʀᴛʜVᴀᴅᴇʀ

2018年からの報告。このツールは現在、以下のFile -> Export -> Layers to Files...
とおりです

他の人が混乱した場合に備えて、これはPhotoshopスクリプトであるため、Photoshopが必要です。シェルスクリプトになると思った。:)
クリス・レイ

1
@ハンナこれらはEPICです!! 良い仕事とありがとう!
クリスエマーソン

18

1年前にJohannesのソリューションを更新し、多くの改良を加えました。重要なこと:

  • レイヤーグループが適切に処理されるようになり、すべてのレイヤーが書き込まれるようになりました。
  • ファイル名は、衝突を防ぐために自動的にインクリメントされます(これは、複数のレイヤーが同じ名前を持つ場合に発生します)。
  • パフォーマンスが向上します。このスクリプトは、数分で500個の単純なレイヤーを保存できます。

これに加えて、コードはクリーンアップされています。たとえば、グローバル変数は単一の配列に統合されています。

最初のポップアップメッセージでは、トップレベルのレイヤーの数のみが通知されることに注意してください。これは、パフォーマンスの低下を防ぐためです。あなたが扱っているファイルについて何も知らない場合を本当に想像することはできないので、これはあまり妥協すべきではない。

ここでスクリプトを取得します。道をリードしてくれた前作者に感謝します。


このスクリプトのメンテナンスは本当にうまくいきました。数千のレイヤーで時間の経過した修正をエクスポートすることは非常にうまく機能しました:)
iwasrobbed、14年


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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.