Phostoshop Scriptingで自動化 - Tips篇
Photoshop(本記事でPSに略します)のスクリプトを書く時にあった問題とその解決方をこの記事でまとめてみました。PSのスクリプトが初めての方はまずこの記事を読んでもらえると分かりやすいかもしれないです:http://befool.co.jp/blog/chainzhang/photoshop-scripting-basic
パフォーマンス
カード自動化ツールを書いてた時に気になったのは、スクリプトでレイヤーを検索する動作が重いというとこです。例えば:
上記のコードは「myLayer」という名前のレイヤーを探して非表示にするスクリプトです。一回ぐらいなら、パフォーマンスとか全く考慮しなくてもいいですが、これが数百レイヤーだと、PSがフリーズするぐらい重くなります。
キャッシュする
レイヤー検索重い理由は、レイヤー名はユニックではないので、単純にループで探してる可能性が高いです。なので、よく使うレイヤーをキャッシュしてあげればパフォーマンスがかなり向上します。これが関数を二つ用意すればオッケーです。
キャッシュといっても、単純に配列に保存することだけです。
g_
で始まるのはglobal
という意味なんだけど、ここは個人の好き嫌いで変えても大丈夫です。ちなみに、グローバル変数はよくないという考えが普通ですが、小さなプラグインぐらいなら私は許します。
JSONデータ
JSONは幅広く使われているデータ形式です。JSONとJavaScriptはもっとも相性がよくて、PS自動化に使うデータの取り込むならJSON形式をおすすめします。
JSONの読み込みはライブラリが必要です。しかし、PSのスクリプトでは外部ソースを読む機能がないようです(たぶん)。一番乱暴な方法はライブラリを丸ごとスクリプトにコピーしますが、ここでもう一つちょっとトリッキーな方法を紹介します。それは、eval()
を使うのです:
これで、簡単なJSONデータは取り込めるようになります。もちろん、eval()
を使うのはよくない!という方もいると思います、そいう場合は素直にJSONライブラリをコピペするのが一番いいかもしれないです。
ファイル選び
PSのスクリプトにはFile.openDialog()
という便利な関数があります、これを利用すると、ファイル選びウィンドウが開かれて、ユーザーにファイルを選んでもらえます。簡単な使い方:
このスクリプトは特に問題はないですが、ユーザーがどんな形式なファイルでも選択できます。しかし、選べるファイル形式を絞りたいという時がありますよね、その時はFile.openDialog
の第二引数を使います。
$.os
が今使ってるOSを取得できます。Mac OSの場合はFile.openDialog()
の第二引数がfunction
タイプになります。このfunction
の第一引数にFile
オブジェクトが渡されます、このFile
のオブジェクトで判定を行って、true
かfalse
で選べるファイルを絞ります。
Windowsの場合は、*.json
という文字列を返せば問題ないです。(.json
拡張子のファイルという意味)
終わりに
PSのスクリプトはスコープ(PS)の制限で、できることは限られているが、真面目なコーディングより、ちょっとトリッキーな方法を考えてみたら、できることが多くなります。