Amazonで商品を見るセール会場へ

Photoshopスクリプト(jsx)│レイヤーの一番上にある効果レイヤーを各パーツレイヤーに適用する方法

Photoshopで最上位にある効果レイヤーをパーツ分けされた各レイヤーへ適用するスクリプトを紹介します。

キャラクターイラストの仕上げやLive2Dのパーツ作成に役立ちます。

目次

スクリプトを使用するメリット

  • 効果レイヤーをパーツ分けされた各レイヤーへ一括適用できる
  • 手作業では手間がかかる大量のパーツ処理を自動化できる
  • スクリプトを調整すれば特定のレイヤーのみへの適用にも対応できる

注意点

  • 結合先のレイヤーが非表示だと適用できないため、事前に表示状態を確認しておくこと
  • レイヤー構造が複雑な場合は、実行前にファイルのバックアップを作成しておくこと

最上位の効果レイヤーを各レイヤーに適用する手順

本スクリプトを使用すると、各パーツレイヤーに効果レイヤーを個別に適用して統合できます。

STEP.1 スクリプトを保存

  1. 下記のコードをテキストエディタ等に貼り付けて保存します。

ConbineLayer.jsx

app.bringToFront();

if (app.documents.length === 0) {
    // ドキュメントが開かれていない場合は処理をしない。
} else {
    var doc = activeDocument;
    
    // グローバルなレイヤーリスト(全レイヤー、選択レイヤー、結合対象レイヤー)
    var allLayers = [];
    var selectedLayers = [];
    var targetLayers = [];

    // 全レイヤーを再帰的に収集
    collectAllLayers(doc);

    // 選択レイヤーを取得
    collectSelectedLayers(selectedLayers);

    // 全レイヤーから選択レイヤーを除外し、結合対象レイヤーを決定
    filterTargetLayers(targetLayers);

    if (selectedLayers == null || allLayers == null) {
        alert("結合させるレイヤーを選択してください。\n処理をキャンセルします。");
    } else {
        // 結合対象レイヤーに非表示レイヤーがある場合は処理中断
        var allVisible = true;
        for (var i = 0; i < targetLayers.length; i++) {
            if (!targetLayers[i].visible) {
                allVisible = false;
                break;
            }
        }
        if (!allVisible) {
            alert("結合対象のレイヤーに非表示のレイヤーがあります。\n非表示レイヤーは結合できませんので、削除するか表示状態にしてください。\n\n処理をキャンセルします。");
        } else {
            var message = "";
            for (var i = 0; i < selectedLayers.length; i++) {
                message += selectedLayers[i].name + " [" + (selectedLayers.length - i) + "]\n";
            }
            message += "をすべてのレイヤーに結合します。([]内の数字は結合順)\n\nよろしいですか?\n\n【注意】\n結合させたい効果レイヤーは全てレイヤーの一番上に配置してください。";

            if (confirm(message)) {
                doc.suspendHistory("結合処理", "mergeLayers()");
                alert("結合が完了しました。\n効果レイヤーは非表示にしています。");
            } else {
                alert("処理がキャンセルされました。");
            }
        }
    }
}

// 各結合対象レイヤーに対して、選択レイヤーを複製・移動・結合する
function mergeLayers() {
    for (var i = 0; i < targetLayers.length; i++) {
        var backIndex = selectedLayers.length - 1;
        for (var j = 0; j < selectedLayers.length; j++) {
            selectedLayers[backIndex - j].duplicate();
            doc.activeLayer = activeDocument.layers[backIndex - j];
            activeDocument.layers[backIndex - j].move(targetLayers[i], ElementPlacement.PLACEBEFORE);

            try {
                // レイヤークリッピング処理
                var idGrpL = charIDToTypeID("GrpL");
                var desc = new ActionDescriptor();
                var idnull = charIDToTypeID("null");
                var ref = new ActionReference();
                var idLyr = charIDToTypeID("Lyr ");
                var idOrdn = charIDToTypeID("Ordn");
                var idTrgt = charIDToTypeID("Trgt");
                ref.putEnumerated(idLyr, idOrdn, idTrgt);
                desc.putReference(idnull, ref);
                executeAction(idGrpL, desc, DialogModes.NO);
            } catch (e) {
                // クリッピング処理失敗時は無視
            }
            doc.activeLayer.merge();
        }
    }
    // 結合後、元の選択レイヤーを非表示にする
    for (var i = 0; i < selectedLayers.length; i++) {
        selectedLayers[i].visible = false;
    }
}

// 選択レイヤーを収集(グループ化イベントを利用)
function collectSelectedLayers(selectedLayersArray) {
    if (doc.activeLayer) {
        var idGrp = stringIDToTypeID("groupLayersEvent");
        var descGrp = new ActionDescriptor();
        var refGrp = new ActionReference();
        refGrp.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        descGrp.putReference(charIDToTypeID("null"), refGrp);
        executeAction(idGrp, descGrp, DialogModes.ALL);

        for (var i = 0; i < doc.activeLayer.layers.length; i++) {
            selectedLayersArray.push(doc.activeLayer.layers[i]);
        }
        undoAction();
    }
}

// アクションを元に戻す
function undoAction() {
    executeAction(charIDToTypeID("undo"), undefined, DialogModes.NO);
}

// 全レイヤーから選択レイヤーを除外し、結合対象のレイヤーリストを作成
function filterTargetLayers(targetLayersArray) {
    for (var i = 0; i < allLayers.length; i++) {
        var isSelected = false;
        for (var j = 0; j < selectedLayers.length; j++) {
            if (allLayers[i].name === selectedLayers[j].name) {
                isSelected = true;
                break;
            }
        }
        if (!isSelected) {
            targetLayersArray.push(allLayers[i]);
        }
    }
}

// 再帰的に全レイヤーを収集
function collectAllLayers(layerContainer) {
    var childLayers = layerContainer.layers;
    for (var i = 0; i < childLayers.length; i++) {
        if (childLayers[i].typename === "LayerSet") {
            // レイヤーセットの場合は再帰処理
            collectAllLayers(childLayers[i]);
        } else if (childLayers[i].typename === "ArtLayer") {
            allLayers.push(childLayers[i]);
        }
    }
}
  1. ConbineLayer.jsx以下のフォルダに保存します。
C:\Program Files\Adobe\Adobe Photoshop CC\Presets\Scripts\
  1. Photoshopを再起動します。

STEP.2 スクリプトを実行

  1. [ファイル][スクリプト][ConbineLayer] を選択します。
  2. 各パーツレイヤーに効果レイヤーが適用されます。

Photoshopに関するほかの操作解説は、関連記事から確認できます。

レイヤー操作を自動化するスクリプトは、ほかにも紹介しています。

まとめ

  • 最上位の効果レイヤーをすべてのパーツレイヤーへ一括適用できる
  • 適用後に自動で結合されるため、パーツごとの統合作業を効率化できる
  • Live2D用素材の書き出し前処理やイラスト制作に適している

レイヤー処理の手間を減らすために、効果レイヤーの一括適用と統合に本スクリプトを活用してみてください。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Photoshopのおすすめ書籍

Photoshop用PCの選び方

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次