LoginSignup
1
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-11-07

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

Photoshopと同じ階層にあるフォルダと同名のグループ(レイヤーセット)を作成して、フォルダ内の画像を
設定に従ってレイヤ名 合成モード 不透明度 塗りの不透明度を調整してレイヤとして読み込みます
image.png
レイヤとして一括読み込みだけなら標準であるものの 合成モードや透明度の定型操作が多かったためこの仕様です

使い方

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

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

ファイル>スクリプト>参照で Load_layer_setings.jsx を選択すると読み込み処理が実行されます
image.png
現在前面にあるファイルの保存されている場所を基準にファイルを読み込むため、
あらかじめPhotshop上で読み込み用ファイルを開いて保存してある必要があります
image.png
フォルダ内のlayer_setting.txtで指定していないファイルは無視されます。
また、指定してあるファイルがなかった場合には読み込み処理後アラート表示します
image.png

スクリプト

layer_setting.txt
// //で始まる行はコメントとして無視します
//  上に記述してあるレイヤが上になるように1行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の方は通常は編集する必要がないようにしています

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 + "が開けませんでした")}
}

両方を拡張子に注意して適当な場所に保存して利用してください。

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3