PhotoshopUXPで調整レイヤーの情報を取得、調整する。

UXP

Photoshopの調整レイヤー、当たり前のように使う機能ですのでどなたにとっても必須の機能でしょう。しかしこの調整レイヤーですがscriptで調整しようとするとオブジェクトモデルに該当のオブジェクトがなかったりと悩みの種でもありました。今回その調整レイヤーをUXPで調整する方法がPhotoshop UXPのdeveloperコミュニティーに投稿されていたのでこちらを参照して行ってみました。

必要な知識

今回UXPのbatchPlayから調整するのでbatchPlayの知識が必要です。batchPlayに関してはPhotoshopUXP batchPlayでPhotoshopの特定の処理を実行する。の記事を。またCC2022からはexecuteAsModalスコープ内でしかPhotoshop関係のメソッドを実行できなくなったのでPhotoshop UXP 2022 executeAsModalを参照してください。その他さらに詳しい情報はPhotoshop UXP 2022 BatchPlay descriptors,プロパティーの取得等を参照してください。今回Photoshop 23.3を使って実行します。

まずは既にドキュメントに存在する調整レイヤーの値を取得する。

以下のようなトーンカーブの調整レイヤーの値を取得してみましょう。

curve

とりあえず既存のapiを通じて取得してみましょう。activeDocument,activeLayersからアクティブな調整レイヤーのプロパティを取得します。(公式ドキュメント参照。)

console

レイヤーの種類は判別できましたが肝心の調整レイヤーの中身を確認できません。公式のドキュメントにもそれらしき記述はありません。仕方ないのでbatchPlayから取得してみましょう。

consoleBatch

adojustmentという項目を取得できましたが思ったような値を取得できていません。トーンカーブレイヤーの情報を取得しているのにこれではカーブの情報との関連性がわかりません。

調整レイヤーの情報の取得に関してはExtendScriptの頃から需要こそありつつもなかなかやり方がありませんでした。しかし前述のフォーラムで上記とは違った形で取得する方法が発見されています。実際のコードは以下のようになります。

全く検討がつきませんでしたがJSONプロパティーを取得することにより該当のレイヤーの調整レイヤーの値も含めたプロパティーを取得できるようです。

カーブの値

取得できる値は当初string型になっているのでJSONにパースする必要があります。ターゲットはアクティブなレイヤーでしたがドキュメントの情報も一緒に取得しています。それで実際にトーンカーブの値をhorizontalとverticalのオブジェクトの配列型で取得できました。正直なぜJSONなのかよくわかっていないのですが通常scriptで取得できないネイティブの値をJSONとして取得できるみたいです。ただここで注意が必要なのがこのget:JSONは直接特定のレイヤーにアクセスできないので上の階層から必ず該当のレイヤーを見つける必要があるということです。ただしグループレイヤーがドキュメントに含まれているとどのような場合でも全てのグループレイヤーを必ず取得します。つまりグループレイヤーの中に入ったレイヤーは必ず上の階層から探していく必要があるわけです。例えば以下のようなレイヤーからidを指定して取得してみます。

レイヤー

layerssonole

上記のconsoleのようにid14以外のグループレイヤーまで取得しています。(その他のレイヤーは省略されている)実際の何かしらの実践的な機能実装時にめんどくさいことになりそうです。

次に全てのレイヤーを再帰的に取得してみますが取得するだけなら簡単です。

再帰的にfor文を回したりする必要があるのかと思いましたが結果としてはbatchPlayのターゲットをdocumentにするだけでレイヤーもまとめて取得できます。。

recursive layers

グループレイヤーの中のレイヤーも取得して尚且つ調整レイヤーの値も取得できています。layerInfoとincludeAncestorsというオプションがありますが正直これがなくても再帰的に取得できました。ただ今回念のためつけてはいます。
とりあえず調整レイヤーの中身の取得はできました。次は中身を実際に触ってみます。

調整レイヤーの値を実際に調整する

実際に調整する場合ですが今回もbatchPlayから調整します。
調整する場合はターゲットとなる調整レイヤーの中身に沿ったオブジェクトをそのままsetでセットします。batchPlayからのアクセスなどは先程のconsoleで取得したオブジェクトモデルをそのまま当てはまるだけなのでそこまで難しくはないと思います。以下トーンカーブの例。

上記のコードは以下のトーンカーブのオブジェクトを見比べるとどことどこが対応しているか大体わかると思います。

curveObject

ちなみに全てのチャンネルを補正する場合以下のようになります。

また以下は色相、彩度の例です。

後は応用すれば大体調整できそうですね。

調整レイヤーを新しく作成する

これは簡単ですね。Alchemistプラグインでそのまま調べればすぐにbatchPlayのコードを生成できます。以下トーンカーブの場合。

その他のレイヤーもAlchemistプラグインで調べれば直ぐにわかるでしょう。

Beer 寄付してサイトを応援する。