Photoshop Scriptを高速化する場合のメモ
「Flashデベロッパー向けPhotoshopスクリプト集」を作成する際に工夫した、Photoshop Scriptの処理を高速化するためのポイント(JavaScript限定)
http://www.libspark.org/wiki/yoshihiko/jsx
1.アクションを併用する
PhotoshopScriptを最大に高速化するには、アクションでできることはアクションで行うことです。
全体的な処理の負荷は
アクション > JavaScript Object
となっているみたいで、アクションだと一瞬で終わる作業をJSで実装すると倍以上の時間がかかることも多いです。特にレイヤー関係で顕著で、JSで全レイヤーの表示・非表示などを行うと、レイヤー数によっていはフリーズすることもあります。
アクションをJSの中に組み込む
アクションの起動はJSかVBからできます(今回はJS)。まず準備として、PhotoshopのアクションをJSの状態で記録するプラグインを導入します。
Photoshop CSの[スクリプティングガイド]フォルダ内の[ユーティリティ]フォルダ内にある、[ScriptListener.8li]というプラグインを、[プラグイン]フォルダ内の[自動実行]フォルダにコピーし、Photoshopを再起動します。
この状態でPhotoshopを操作すると、アクションパネルで記録できる動作がすべてJSとVBの状態でデスクトップに記録され続けます。JSの場合は以下のようになります。
// =======================================================
// =======================================================
var id238 = charIDToTypeID( “Hd ” );
var desc23 = new ActionDescriptor();
var id239 = charIDToTypeID( “null” );
var list15 = new ActionList();
var ref18 = new ActionReference();
var id240 = charIDToTypeID( “Lyr ” );
ref18.putName( id240, “レイヤー 1″ );
list15.putReference( ref18 );
desc23.putList( id239, list15 );
executeAction( id238, desc23, DialogModes.NO );
上記はレイヤー1を非表示にするアクションを実行するスクリプトです。
[ActionDescriptor]、[ActionList]、[ActionReference]、[charIDToTypeID]、[executeAction]の4つがJSの関数及びオブジェクトとして定義されています。
イメージとしては[ActionDescriptor]がアクションの定義、[ActionList]はアクションの設定の定義、[ActionReference]はアクションの引数の定義のようなものです。これらを作成した後、[executeAction]で実行する流れになります。
[charIDToTypeID]は上記の定義を作成する際に、4文字の文字列をコマンドタイプに変換する関数で、たとえば上記の例の場合、charIDToTypeID( “Hd ” )では「非表示にする」というコマンドを作成し、charIDToTypeID( “Lyr ” )は「レイヤー」であることを示すコマンドを作成しています。
これらをJSと連携してカスタマイズすることができます。
「Flashデベロッパー向けPhotoshopスクリプト集」では、全レイヤーの選択や表示、非表示の変更など、全レイヤーに対してループする処理などをアクションに置き換えることで高速化をおこなっています。
2.レイヤーカンプ機能を利用する
多少、使用する状況が限定的ですが、レイヤーの表示、非表示を元に戻す場合など、初期状態を記録するためにレイヤーカンプ機能を使用すると高速化できます。
全レイヤーを操作して、状態を記録するのではなく、レイヤーカンプを一枚作成しておき、処理が終了した際に最初のレイヤーカンプを選択すると、実行前の状態に戻ります。ただし、レイヤーの削除などを行った場合は戻らないのでご注意ください。
3.再帰関数を作成する
Photoshop Scriptに限らず、forループを入れ子にするより、再帰関数で実行するほうが高速化します。特にレイヤーの検索など対象のドキュメントのレイヤーセットが多数入れ子になっている場合に効果がありました。
4.全レイヤーへの操作を極力減らす
Photoshop Scriptを実行した際に特に処理が重くなったのが、レイヤーの選択を行うことでした。選択カーソルが動く時などは非常に遅くなります。この処理を極力減らし、処理の最後にすることでかなりの負荷が軽減できます。
もっと高速化する方法があれば教えてください。
まあ、Cでプラグインを作成するほうが早いとは思うんですが・・・