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