Photoshopで画像をレイヤとして一括読み込み

3Dのレンダリングした複数の画像を決まった設定で Photoshopのレイヤとして読み込む作業が出たので
一括処理するPhotoshop用スクリプトを作成してみました

Photoshopと同じ階層にあるフォルダと同名の**グループ（レイヤーセット）を作成**して、フォルダ内の画像を
設定に従って**レイヤ名　合成モード　不透明度　塗りの不透明度**を調整してレイヤとして読み込みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/2b0cd586-9c65-1344-d8ca-81e389eab5aa.png)
レイヤとして一括読み込みだけなら標準であるものの　合成モードや透明度の定型操作が多かったためこの仕様です

## 使い方
今回のスクリプトは
スクリプト本体の**Load_layer_setings.jsx**と
レイヤの設定を記述するための**layer_setting.txt**の２つのファイルになります。

この２つのファイルは同じフォルダ階層に置いてください。
（作業するPSDとは全く別の場所で問題ありません。）

ファイル＞スクリプト＞参照で　Load_layer_setings.jsx を選択すると読み込み処理が実行されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/ec1c74be-c0c5-b8dc-2ec6-7712094e6e4f.png)
現在前面にあるファイルの保存されている場所を基準にファイルを読み込むため、
あらかじめ**Photshop上で読み込み用ファイルを開いて保存してある**必要があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/8fc8e67b-ccb7-798b-30e9-ee265dd98e91.png)
フォルダ内のlayer_setting.txtで指定していないファイルは無視されます。
また、指定してあるファイルがなかった場合には読み込み処理後アラート表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/806aaf31-cabb-197d-85f3-ea81c7c940e5.png)

## スクリプト
```JS:layer_setting.txt
// //で始まる行はコメントとして無視します
//  上に記述してあるレイヤが上になるように１行1レイヤとして読み込みます
//  それぞれの設定はコンマ（,）区切りで
//    ファイル名, レイヤ名, レイヤの合成モード, レイヤの不透明度, 塗りの不透明度
//  として読み込まれます
//　レイヤの合成モードの設定は
//    NORMAL     :通常 
//    DISSOLVE   :ディザ合成
//    DARKEN     :比較(暗)
//    MULTIPLY   :乗算
//    COLORBURN  :焼き込みカラー
//    LINEARBURN :焼き込み(リニア)
//    DARKERCOLOR:カラー比較(暗)
//    LIGHTEN    :比較(明)
//    SCREEN     :スクリーン
//    COLORDODGE :覆い焼きカラー
//    LINEARDODGE:覆い焼き(リニア)
//    LIGHTERCOLOR:カラー比較(明)
//    OVERLAY    :オーバーレイ
//    SOFTLIGHT  :ソフトライト
//    HARDLIGHT  :ハードライト
//    VIVIDLIGHT :ビビッドライト
//    LINEARLIGHT:リニアライト
//    PINLIGHT   :ピンライト
//    DIFFERENCE :差の絶対値
//    EXCLUSION  :除外
//    HUE        :色相
//    SATURATION :彩度
//    COLORBLEND :カラー
//    LUMINOSITY :輝度
//    PASSTHROUGH:透過（グループのみの設定）
//  という対応になっています

Emit0001.png,     Emit,     SCREEN,     100,100
GlossInd0001.png, GlossInd, LINEARDODGE,90,100
GlossDir0001.png, GlossDir, LINEARDODGE,20,100
DiffInd0001.png,  DiffInd,  SOFTLIGHT,  30,100
DiffDir0001.png,  DiffDir,  COLORDODGE, 100,20
Shadow0001.png,   Shadow,   DARKEN,     100,100
AO0001.png,       AO,       MULTIPLY,   100,100
DiffCol0001.png,  DiffCol,  NORMAL,     100,100
Alpha0001.png,    Alpha,    NORMAL,     100,100

```
設定ファイルで","で区切った名前の前後のスペースは無視するようになっています
Load_layer_setings.jsxの方は通常は編集する必要がないようにしています

```JS:Load_layer_setings.jsx
#target photoshop
//設定ファイルの名前
setting_txt = 'layer_setting.txt';

blend_mode_dic = {
    NORMAL     :BlendMode.NORMAL,
    DISSOLVE   :BlendMode.DISSOLVE,
    DARKEN     :BlendMode.DARKEN,
    MULTIPLY   :BlendMode.MULTIPLY,
    COLORBURN  :BlendMode.COLORBURN,
    LINEARBURN :BlendMode.LINEARBURN,
    DARKERCOLOR:BlendMode.DARKERCOLOR,
    LIGHTEN    :BlendMode.LIGHTEN,
    SCREEN     :BlendMode.SCREEN,
    COLORDODGE :BlendMode.COLORDODGE,
    LINEARDODGE:BlendMode.LINEARDODGE,
    LIGHTERCOLOR:BlendMode.LIGHTERCOLOR,
    OVERLAY    :BlendMode.OVERLAY,
    SOFTLIGHT  :BlendMode.SOFTLIGHT,
    HARDLIGHT  :BlendMode.HARDLIGHT,
    VIVIDLIGHT :BlendMode.VIVIDLIGHT,
    LINEARLIGHT:BlendMode.LINEARLIGHT,
    PINLIGHT   :BlendMode.PINLIGHT,
    DIFFERENCE :BlendMode.DIFFERENCE,
    EXCLUSION  :BlendMode.EXCLUSION,
    HUE        :BlendMode.HUE,
    SATURATION :BlendMode.SATURATION,
    COLORBLEND :BlendMode.COLORBLEND,
    LUMINOSITY :BlendMode.LUMINOSITY,
    PASSTHROUGH:BlendMode.PASSTHROUGH
}

//文字列の前後の空白文字を削除
function trim_str(txtdata){
    return(txtdata.replace(/(^\s*)|(\s*$)/g, ""))
}

//設定情報の読み込み
function load_setting(file_path){
    var txt_file =  File(file_path);
    var lines = load_text(txt_file).split('\n');
    var setting_list = [];
    for(var l=0;l<lines.length ;l++){
        if (lines[l].slice(0,2) == '//'){continue;}
        var attr_list = lines[l].split(',');
        if (attr_list.length == 5){
            setting_list.push([
                trim_str(attr_list[0]),
                trim_str(attr_list[1]),
                blend_mode_dic[trim_str(attr_list[2])],
                parseFloat(attr_list[3]),
                parseFloat(attr_list[4])
                ]);
        }
    }
    return(setting_list);
}

//画像ファイルをグループ内にレイヤとして読み込み
function load_layer(active_doc, grop_layer, image_directry, layer_property){
    var file_name = layer_property[0];
    var layer_name = layer_property[1];
    var blendMode = layer_property[2];
    var Opacity = layer_property[3];
    var fillOpacity = layer_property[4];
    var img_file =  File(image_directry +'/' + file_name);
    $.writeln(image_directry +'/' + file_name);
    flag= img_file.open("r");
    if (flag == true){
        //画像の読み込み
        var img = app.open( img_file );
        img.artLayers[0].duplicate(active_doc);
        img.close(SaveOptions.DONOTSAVECHANGES);
        //レイヤの設定を変更してグループの中に移動
        active_doc.active;
        var layer_obj = active_doc.artLayers[0];
        layer_obj.name = layer_name;
        layer_obj.blendMode = blendMode;
        layer_obj.opacity = Opacity;
        layer_obj.fillOpacity = fillOpacity;
        layer_obj.move(grop_layer, ElementPlacement.PLACEATEND);
        return('')
    }
    else {return(grop_layer.name+'/' + file_name +'\n');}
}

//PSD内の指定階層下のレイヤの一覧の取得（設定ファイルの作成用）
function print_layer_settings(parent){
    var Layer_count = parent.layers.length;
    for(var i=0;i<Layer_count ;i++){
        var current_layer=parent.layers[i];
        var layer_name = current_layer.name;
        var blendMode = current_layer.blendMode;
        var fillOpacity = current_layer.fillOpacity;
        var Opacity = current_layer.opacity;
        $.writeln("'" + layer_name +"'," + blendMode +',' + Opacity +',' + fillOpacity);
    }
}

//指定したファイルパスの下にあるフォルダの一覧を取得
function get_folder_list(folder){
    var files = folder.getFiles();
    var folder_list = [];
    for(var i=0; i<files.length; i++){
        if( files[i].constructor.name == 'Folder' ){
            folder_list.push(files[i]);          
        }
    }
    return (folder_list)
}

//テキストファイルの読み込み
function load_text(f_path){ 
    if (f_path){
        fileObj = new File(f_path);
        flag= fileObj.open("r");
        if (flag == true){
            var text = fileObj.read();
            fileObj.close();  
			}
		else{
            alert("ファイルが開けませんでした");
			}
		}
    return(text)
	}

app.active;
var active_doc = app.activeDocument;
//スクリプトファイル自身のパス
var script_path = $.fileName;
var path_list = script_path.split('/');
var current_dir = path_list.splice(0, path_list.length -1).join('/');
//設定情報の読み込み
setting_list = load_setting(current_dir +'/' +setting_txt);
//アクティブなPSDと同じ階層にあるフォルダの取得
var doc_path = active_doc.path;
if (doc_path){
    var folder_list = get_folder_list(doc_path);
    error_txt = ""
    //各フォルダの中身をグループとして読み込み
    for (var g=0;g<folder_list.length;g++){
        var image_directry = folder_list[g].toString();
        //フォルダの名前のグループ作成
        var grop_name = image_directry.split('/').pop();
        var grop_layer = active_doc.layerSets.add();
        grop_layer.name = grop_name;
        //レイヤの読み込み
        for(var i=0;i<setting_list.length ;i++){
            error_txt += load_layer(active_doc, grop_layer, image_directry, setting_list[i]);
        }
    }
    if (error_txt.length != 0) {alert(error_txt + "が開けませんでした")}
}
```
両方を拡張子に注意して適当な場所に保存して利用してください。