※この記事は「古籏一浩のJavaScriptラボ」の第24回です。過去の記事も合わせてご覧ください。
Adobe Creative Suiteの「Adobe Bridge」は、JavaScriptを使ってさまざまな画像処理を自動化できます。前回はサーバーからRSSファイルを取得する方法を解説しました。今回は、BridgeからPhotoshopを操作し、サーバーから取得したRSSを元に画像を作成する処理を作成します。BridgeのJavaScriptは、単純にBridgeからPhotoshopのスクリプトを実行するだけでなく、Photoshopからの戻り値を受け取れます。つまり、Bridge←→Photoshop間でデータをやり取りできるのです。
■シリーズラインナップ
- 第1回 Webサーバーのデータを取得
- 第2回 RSS(XML)の処理
- 第3回 BridgeからPhotoshopのJavaScriptを実行(この記事)
- 第4回 Photoshopで作成した画像をFTP転送
- 第5回 Bridgeで画像フィルタを作成
- 第6回 GUI (グラフィカルユーザーインターフェース)の処理
BridgeとPhotoshopでデータをやり取りする
BridgeとPhotoshopなどのアドビ製アプリケーションと通信するには、「Bridge Talk」という機能を使います。Bridge Talkは専用のオブジェクトをnew BridgeTalk()で作成して使用します。
BridgeTalkオブジェクトを生成したらtargetプロパティに実行したいアプリケーション名を指定します。Bridgeのスクリプトの1行目に記述する#target(関連記事)と同じように、Photoshopなら「Photoshop」、Illustratorなら「Illustrator」のように指定します。また、「Photoshop-10」のようにバージョンも指定できます。
ターゲットを設定したら実行したいスクリプトをbodyプロパティに設定します。簡単な例として、Photoshopで320×240サイズ(単位を指定していないので320cm×240cmサイズのキャンバスが作成される場合もあります)の新規ドキュメントを作成してみましょう。Photoshopで新規ドキュメントを作成するには、以下のようにapp.documents.add()とします。作成するドキュメントの横幅、縦幅を引数に指定します。
app.documents.add(320, 240)
このスクリプトを文字列としてBridge Talkオブジェクトのbodyプロパティに入れます。あとはsend()メソッドを呼び出すと、Photoshop上でスクリプトが実行されます。サンプル01を実行するとPhotoshopで新規にドキュメントが作成されます。
●サンプル01
#target "Bridge"
var bt = new BridgeTalk();
bt.target = "Photoshop";
bt.body = "app.documents.add(320, 240)";
bt.send();
サンプル01のように、Bridgeのスクリプト内にPhotoshopのスクリプトを直接書くと、プログラムにバグがあるときに、原因がBridgeなのかPhotoshopなのか特定しにくいなど、いろいろ不都合があります。そこで、Photoshopのスクリプトは別のファイルとして保存しておき、Bridgeのスクリプトから呼び出す方法を採りましょう。以後は、Photoshopで実行するスクリプトファイルが、ユーザーのホームフォルダ内にあるものとします。
サンプル01のPhotoshopのスクリプト部分を「ps_newdoc.jsx」として保存したものを実行するには、サンプル02のようにファイルとして読み込み、bodyプロパティに入れます。BridgeのスクリプトからPhotoshopのスクリプトを呼び出す方法にしておけば、PhotoshopのスクリプトはPhotoshop上で動作テストができるのでスクリプトの作成も楽になります。また、既存のスクリプトファイルも流用できます。
ここまでは、BridgeからPhotoshopへの一方通行でした。次に、PhotoshopからBridgeにデータを受け渡してみましょう。
●サンプル02
#target "Bridge"
var bt = new BridgeTalk();
bt.target = "Photoshop";
var fileObj = new File("~/ps_newdoc.jsx");
var flag = fileObj.open("r");
if (flag){
bt.body = fileObj.read();
}
bt.send();
●サンプル03
app.documents.add(320, 240);