【Photoshopスクリプト】色検討レイヤーを他のレイヤーへ自動で適用したい(試作)

はじめに

先に公開した記事でPhotoshopスクリプトを書き出す準備をしました。

このときは公式のスクリプト「Scripting Listener」を使ったのですが、コードを修正しようとインターネットの記事と見比べてみると、どうやらScripting Listenerで書き出したコード以外にも、スクリプトの書き方があるようです。



公式のスクリプティングガイドのテキストを読んでみるとScripting Listener で書き出しているのは、特定の文字列(予約語)を使ったちょっと特殊な指示のようです。

Java scriptを下敷きとした書き方ができるようなので、こちらのほうがプログラミングをする人にとっては馴染みやすい書き方ですね。

コードのメンテナンス性も良さそうなので、今後はそちらを勉強していこうと考えています。

ただ自分でスクリプトを組んだ場合、それがどんな動きをするのかを見てみるにはちょうどよい規模だとおもったので、 Scripting Listenerで書き出したコードを整理し、試作ということでスクリプトを作ってみました。

Photoshopスクリプトの練習課題としては、今回の動きをもう一方の書き方で再現するというのも良さそうですね。


やりたいこと

やりたいことが文章だとわかりにくいかと思ったので、動画を作ってみました。

今回はグラデーションマップで色を検討しています。

動画の様にラフは後の工程を考えてある程度分けておきたいのですが、色は画面全体を見ながら検討していきたいので、ラフ検討のレイヤー構成を無視できたほうが直感的な検討ができます。

今回は一旦構成を無視したカラー検討レイヤーを、描き込みを行う前にラフ検討のレイヤー構成へ割当なおすというところを試作してみたいと思います。

ソースコード

Scripting Listener で書き出したコードを整理したソースコードは下記になります。

動画や下記のコードでは配ったカラー検討のレイヤーはグループ化までにしていますが、「//lyr_merge();」を「lyr_merge();」に変更すれば、結合まで自動で行います。

// =======================================================

var lyr_name = app.activeDocument.activeLayer.name;

var n = app.activeDocument.artLayers.length;
if (n > 0) {
	for (var i = 1; i < n; i++) {

		// 元のレイヤーをコピーしてグループ化していく
		lyr_select(lyr_name);
		lyr_copy();
		lyr_move(i);
		lyr_grpl();
		//lyr_merge();
		
		//レイヤー数が変化したはずなので更新
		n = app.activeDocument.artLayers.length;
		// コピーしたレイヤー分だけ移動
		i++;

	}
}

// 検討レイヤーを再選択し、削除する
lyr_select(lyr_name);
lyr_delete();

// 指定されたレイヤーを選択する
function lyr_select(lyr_name){
	var idslct = charIDToTypeID( "slct" );
	var desc = new ActionDescriptor();
	var idnull = charIDToTypeID( "null" );
	var ref1 = new ActionReference();
	var idLyr = charIDToTypeID( "Lyr " );
	ref1.putName( idLyr, lyr_name );
	desc.putReference( idnull, ref1 );
	var idMkVs = charIDToTypeID( "MkVs" );
	desc.putBoolean( idMkVs, false );
	executeAction( idslct, desc, DialogModes.NO );
}

// 指定された番号の場所へレイヤーを移動します
function lyr_move(lyr_num){
	var idmove = charIDToTypeID( "move" );
	var desc = new ActionDescriptor();
	var idnull = charIDToTypeID( "null" );
	var ref1 = new ActionReference();
	var idLyr = charIDToTypeID( "Lyr " );
	var idOrdn = charIDToTypeID( "Ordn" );
	var idTrgt = charIDToTypeID( "Trgt" );
	ref1.putEnumerated( idLyr, idOrdn, idTrgt );
	desc.putReference( idnull, ref1 );
	var idT = charIDToTypeID( "T   " );
	var ref2 = new ActionReference();
	var idLyr = charIDToTypeID( "Lyr " );
	ref2.putIndex( idLyr, lyr_num );
	desc.putReference( idT, ref2 );
	var idAdjs = charIDToTypeID( "Adjs" );
	desc.putBoolean( idAdjs, false );
	var idVrsn = charIDToTypeID( "Vrsn" );
	desc.putInteger( idVrsn, 5 );
	executeAction( idmove, desc, DialogModes.NO );
}

// 現在のレイヤーをコピーします。
function lyr_copy(){
	var idCpTL = charIDToTypeID( "CpTL" );
	executeAction( idCpTL, undefined, DialogModes.NO );
}

// レイヤーをクリップする
function lyr_grpl(){
	var idGrpL = charIDToTypeID( "GrpL" );
	var desc = new ActionDescriptor();
	var idnull = charIDToTypeID( "null" );
	var ref2 = new ActionReference();
	var idLyr = charIDToTypeID( "Lyr " );
	var idOrdn = charIDToTypeID( "Ordn" );
	var idTrgt = charIDToTypeID( "Trgt" );
	ref2.putEnumerated( idLyr, idOrdn, idTrgt );
	desc.putReference( idnull, ref2 );
	executeAction( idGrpL, desc, DialogModes.NO );
}

// レイヤーをマージする
function lyr_merge(){
	 var idMrgtwo = charIDToTypeID( "Mrg2" );
	 executeAction( idMrgtwo, undefined, DialogModes.NO );
}

// レイヤーを削除する
function lyr_delete(){
	var idDlt = charIDToTypeID( "Dlt " );
	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 );
    	var idLyrI = charIDToTypeID( "LyrI" );
        var list1 = new ActionList();
        list1.putInteger( 104 );
    	desc.putList( idLyrI, list1 );
	executeAction( idDlt, desc, DialogModes.NO );

この断片があなたの星へ続く道を、少しでも照らすことを願って

投稿者: 0.1

厚塗りで「存在感や重さ、質感による説得力」のあるイラストを目指しています。 日本では線画をベースとしたイラストが主流ですが、そこから外れたモノもイラストの世界を広げる為に必要だと考えています。「世界観にもう一味試したい」そんなときには、ぜひお声がけください。

「【Photoshopスクリプト】色検討レイヤーを他のレイヤーへ自動で適用したい(試作)」への1件のフィードバック

COMMENT