| ▲ | 画像処理ソフトのベスト・セラー「Adobe Photoshop」は残念ながらAppleScript未対応。だが諦めきれないユーザーのために、今回は「Tempo II plus」「PreFab Player」「PhotoMatic」といった最新ユーティリティーを使って自動化に挑戦。 |
|
|
| ▲ | どれも、キー入力やマウス・クリック、メニューやボタンの操作を擬似的に発生させるものだが、スクリプタブルなのがミソ。「click(クリック)」「type(キーをタイプ)」「do menu(メニューを実行)」といった命令をAppleScriptで送れる。 |
連載[8-1] 難攻不落?Photoshop自動化の秘密兵器
|
《 AppleScriptに対応していないPhotoshopだが…
》
|
|||||||||||||
|
?
|
先生、今日は「Adobe Photoshop」ですね! | ||||||||||||
|
? |
デザイナーの僕には、前回の「QuarkXPressスクリプティング入門」はなかなか勉強になりました。 今日もよろしくお願いします。 |
||||||||||||
|
先生
|
OK、今日はDTP特集第2弾といこうか。 | ||||||||||||
|
?
|
でも先生、確かPhotoshopはAppleScriptに対応していないとおっしゃってましたけど、大丈夫なんですか? | ||||||||||||
|
先生
|
そう、Photoshopは確かにそれ自体はAppleScriptに対応していない。だけど、それをカバーするいくつかのユーティリティーがあるから何とかなるだろう。今日はPhotoshopを例に、AppleScriptに対応していないアプリケーションをうまく自動操縦するためのユーティリティーをいくつか紹介しよう(表1)。 | ||||||||||||
|
表1 Photoshop自動化に役立つAppleScriptのユーティリティー
|
|||||||||||||
|
?
|
ということは、IllustlatorとかもAppleScriptで操作できると…。 | ||||||||||||
|
先生
|
まぁ、やり方は同じだからね。 | ||||||||||||
|
注:Tempo II Plusは、1998年12月現在、
残念ながら海外・国内のいずれでも販売されておりません。 |
|
《 AppleScriptでマウスをクリック、クリック…
》
|
||
|
?
|
でも、AppleScriptに対応していないソフトを、どうやって自動操縦するんですか。 | |
|
?
|
そうそう、まず簡単な仕組みから説明していただけませんか。 | |
|
先生
|
それはひとえに、マウス操作やキーボード操作をあやつれるからなんだ。例えばPreFab Playerの例なんだが、AppleScriptで、 tell application "PreFab Player" to click location {10,20} などと書くとする。 | |
|
?
|
これはPreFab Playerに対して命令を送るAppleScriptですよね。こうすると、どうなるんですか。 | |
|
?
|
「click」ってひょっとして、マウス・クリックですか? | |
|
先生
|
そう、この文は 座標(10,20)でマウスをクリックしなさいという命令なんだ。 | |
|
?
|
ということは、PreFab Playerは「マウスをクリックしろ」ってAppleScriptの命令を実行できるアプリケーションなんですね。 | |
|
先生
|
そう、ほかの2つのユーティリティーも原理は同じだ。 | |
|
?
|
その、「マウスをクリックしろ」って命令を受けたPreFab Playerは何をするんですか。まさかソフトがマウスを握ってボタンをクリックするわけじゃないでしょう。 | |
|
先生
|
あたかもマウスがクリックされたかのように、ほかのアプリケーションやシステムをだますんだよ。「偽のクリック」を発生させる、ってことだな。大まかな仕組みは図1のような感じになる。 | |
|
図1 PreFabPlayerの仕組み
|
||
|
?
|
あれっ、PreFab Playerってシステム機能拡張なんですね。それなのに「tell application "PreFab Player"」っておかしいな。 | |
|
先生
|
機能拡張でもスクリプタブルならば、AppleScriptから命令を送る方法はアプリケーションと同じだよ。 | |
|
《 疑似キー入力やマウス操作でPhotoshopをだます
》
|
|
|
?
|
う〜ん、図1は一体どこがポイントなんでしょう。 |
|
先生
|
まず、ユーザーの入力がどのようにしてアプリケーションに伝わるかを理解する必要があるな。マウスやキーボードなどの入力はすべて「イベント」としてアプリケーションに送られるんだ。マックにはイベントを管理するシステムがあるんだよ。 |
|
?
|
それはAppleScriptとは関係ない話ですね。 |
|
先生
|
うん、関係ない。マックのアプリケーションの基本的な動作原理だね。PreFab Playerなどはこのイベントをユーザーの代わりに擬似的に発生させることができる。ところがアプリケーションには、あたかもユーザーがマウスやキーボードを操作したかのように見えて、その通りに動いてしまう。 |
|
?
|
そうか、それでAppleScript未対応のアプリケーションでも、マウスやキーボードのイベントを発生させることで、だましだまし自動化できるというわけですね。 |
|
先生
|
別にだますつもりはないがね。 AppleScript非対応のアプリケーションは、「ちゃんとAppleScript対応させる」か「イベントを疑似的に発生させる」か、どちらかしか自動化の方法がない。前者はソフト・メーカーのやることだから我々は関知しないんだが、後者はこうしたユーティリティーで何とかなるんだ。 |
|
?
|
あの〜、さっきの「click location」に戻りますけど。つまり我々がやるのは、AppleScriptでこうした命令をユーティリティーに送るってことですよね。 |
|
先生
|
そう。結果的には、AppleScriptを使ってユーティリティーを介して、Photoshopに偽のイベントを送るってことになるね。 |
|
?
|
なんかAppleScriptの可能性が広がりますね。 |
|
?
|
表1を見ると、3つのユーティリティーでそれぞれ違いがあるようですが、どれが一番使いやすいんですか。 |
|
先生
|
気が早いね。それぞれ一長一短だからね、自分の目的に合ったものを選べばいいんじゃないかな。ここでは3つそれぞれの違いが分かるように、Photoshopの自動化方法を述べて行こう。 |
|
??
|
お願いします。 |
|
《 本日のテーマは「レベル補正」》
|
|
|
先生
|
では例題として、「レベル補正」を自動化してみよう。 |
|
?
|
レベル補正って? |
|
?
|
像処理の一種だよ。 Photoshopのメニューにあるんだけど、例えばスキャナーから取り込んだ写真の明るさやコントラストなんかを調整するんだ。 |
|
先生
|
さすがデザイナー。では3つのユーティリティーでそれぞれレベル補正を自動化してみよう。まずはPreFab Playerだ。 |
|
?
|
っと言われましても、何から取りかかるか見当も付きません。 |
|
先生
|
では最初にPreFab Playerの用語説明を見てみようか。PreFab Playerはシステム機能拡張なんだけど、スクリプト編集プログラムで用語説明を開くことができる。ほら,do menu menu item や clickなどがあるよね。 |
![]() |
|
|
?
|
スクリプト編集プログラムで、これらの命令を使ってスクリプトを書けばいいんですよね。 |
|
先生
|
基本的には、PreFab Playerに「do menu」や 「click」というAppleScript命令を送ると、PreFab Playerがそれに対応するキーやマウスのイベントを発生させてくれる仕組みだ。レベル補正ならば、こんなスクリプトを書けばいい。 |
|
?
|
なるほど、menu とか click…なじみのある単語がでてきてますね。直観的に何をしようとしているのか分かりますね。 |
|
先生
|
そうだね。まさに処理を行う時のマウス操作の流れが記述 されているといっていいだろう。じゃ、1つひとつ詳しく見てい こうかな。 |
![]() |
|
|
《 do menuコマンドでメニューを実行
》
|
|
|
?
|
1行目の tell application "Adobe Photoshop 3.0J" to activate っていうのは、Photoshopを前面に持ってくることですね。 |
|
先生
|
PreFab Playerが発生させたイベントは、一番手前にあるアプリケーションに送られるからだよ。さて、実際の処理内容だけど、
do menu menu item "レベル補正" of submenu "色調補正" of menu "イメージ" ってのは分かるかな。 |
|
?
|
これはまさに、「イメージ」メニューの中の「色調補正」サブメニューの中の「レベル補正」を行う、ってことですか。 |
![]() |
|
|
先生
|
ご名答! メニュー操作に関しては、PreFab Playerに対して「 do menu」というスクリプトを送ればいいんだ。すると、PreFab Playerがメニュー操作のイベントを発生させてくれるんだね。用語説明を見れば、もう使い方は分かるよね。メニューが階層になっている場合は、of submenuを追加すればいい。 |
|
《 マウスのクリックはclickコマンドで
》
|
|
|
?
|
先生、次の click location {78, -72} てのは何ですか。 |
|
先生
|
うん。これはちょっとミソなんだな。難しくするつもりはないから安心してくれ。数字は座標(画面の位置)を表わしているんだ。横方向が78ドット、縦方向が-72ドットの座標をマウス・クリックしろということになるね。 |
|
?
|
一体、何をクリックするんですか。 |
|
先生
|
レベル補正を実行すると、通常はこのようなダイアログ・ボックスが出てくる。ここでは「読み込み」というボタンをクリックしているんだよ。 |
![]() |
|
|
?
|
レベル補正では、その場で設定を行う場合と、ファイルに設定を保存しておいてそれを読み出す方法がありますよね。ここでは後者を行っているんですね。 |
|
先生
|
その通り。「読み込み」ボタンをクリックすると、ファイルを選ぶダイアログ・ボックスが出てくる。ここでファイルを選んで「OK」ボタンをクリックすればいいわけだ。 |
![]() |
|
|
?
|
ボタンをクリックしなくても、enterキーを押してもOKですよね。 |
|
先生
|
そう、スクリプト中にある type enter がまさにそれだ。 |
|
?
|
先生、「with timeout」で囲まれてますが、これは何でしょう? |
|
先生
|
これは処理に時間制限を設けるステートメントだ。 with timeout of 秒数 seconds (処理内容) end timeout という形で用いる。スクリプトでは「600 seconds」とあるだろ、600秒つまり10分経って処理が終わらなければ、強制的に処理を中断するんだ。これがなくても動くけど、まぁなるべく安全なスクリプトを書くコツかな。 |
|
《 一筋縄では行かない「ボタンのクリック」
》
|
||
|
?
|
先生、PreFab Playerの用語説明を見ると、 click button
"ボタン名" という命令があります。 これで先ほどの 「click location {78,-72}」は、「click button "読み込み"」って書けませんか? この方が分かりやすいと思いますけど。 |
|
|
先生
|
お、文句が言えるまでなりましたか。すばらしい。たしかに君の言う通りだ。でもね、Photoshopはちょっと特殊なんだ。結論から言うと、名前でボタンを指定できないんだよ。 | |
|
??
|
え〜〜! なぜ何ですか。 | |
|
先生
|
それはね、Photoshopがボタンを制御する方法が、PreFab Playerが想定している方法とちょっと違うからなんだ。詳しく言うと、PreFab
Playerで制御するソフトは「Mac ToolKit」と呼ばれるソフト開発ツールで作られたものが望ましい。Photoshopは「MacApp」という別の開発ツールで作られているから、ボタンとかの管理方法が違う。 こういう場合、ボタンのある座標をクリックするしか手がないんだ。 |
|
|
?
|
でも例えばマルチスキャン・モニターで19インチと21インチとか解像度を切り替えると、座標ってその都度変わりませんか。 | |
|
先生
|
そうなんだ。メニューの位置なんかが変わるとうまく動かないから注意が必要だね。 | |
|
?
|
そもそもボタンの座標って、物差しかなんかで測るんですか。 | |
|
先生
|
実はPreFab Playerにはショートカット・キーがあって、 Optionキー Controlキー /(スラッシュ)キー を同時に押すと、バルーンヘルプのような吹き出しが出てきて座標を教えてくれるんだ。これをメモしてAppleScriptで書けば問題なしだよ。ボタンやメニューの「ID番号」を知ることもできる。 | |
|
||
|
?
|
ID番号って? | |
|
先生
|
ボタンやメニューにはそうした認識番号があるんだ。実はPreFab Playerでは、名前ではなくID番号でボタンを指定することもできる。アプリケーションによっては、こっちを使う手もあるね。 | |
|
?
|
一筋縄に行かない時は、いろいろな手があるわけですね。 | |
|
先生
|
まぁ、AppleScript対応のソフトを自動操縦するほどスカっとは行かないが、それでもできないよりはヨシとしなくちゃ。じゃぁ次にPhotoMaticを使ってみようか。 | |
AppleScript救急隊事務局(ASQs) info-asqs@fsight.co.jp