Photoshopのスクリプトを使ってみたい! まずはHelloWorldだ!!

Photoshopのスクリプトを使ってみたい! まずはHelloWorldだ!!

PC歴=Adobe歴な私ですが、最近今までにないほどPhotoshopを使っておりまして。アクションを組んで効率化を図っているものの、「ショートカットで実行して変数指定できたらもっと楽なのに…!」などと思うようになってしまい、フォトショでのプログラミングにチャレンジしたので作り方をまとめました。


記事作成時の筆者の環境

  • Windows7/10
  • Adobe Photoshop CC 2019

ファイルを用意して起動させるまで

jsxファイルを作成する

まずは下準備。中身はあとで書くので、からっぽなテキストファイルを用意して、拡張子を「.jsx」にします。名前は任意ですが、ここでは「myScript.jsx」を例とします。

言語はAppleScript、JavaScript、VBScriptの3つから選べるのでほかのものでも良いのですが、検索して情報が多いほうが解決しやすいのでJavaScriptでやります!(仕事でVB系使いまくってるくせに郷に入っては郷に従うタイプ)

スクリプトが格納されているフォルダに入れる

作ったjsxファイルを、Photoshopのスクリプトフォルダに入れます。

  • Win→ C:\Program Files\Adobe\Adobe Photoshop CC XXXX\Presets\Scripts
  • Mac→ Applications\Adobe Photoshop CC XXXX\Presets\Scripts

自分がWinユーザーなためMacは未検証なので間違ってたら教えてください!

環境によってはこのような表示が出ることがあります。管理者権限を持ったユーザーでログインしていれば「続行」で書き込むことができます。

この表示が出た方へご注意

まさに私の環境でのことだったんですが、このフォルダへ入れたjsxファイルを直接変更して上書き保存しても、権限の関係か実行時に変更が反映されずにハマりました…。

別の権限不要な場所(私はデスクトップにしてました)にて編集してスクリプトのフォルダにコピー、上書きすると上記の警告が出るので、そこを「続行」して認識させると反映されましたのでご参考までに。

起動する

Photoshopを起動します。すでに起動していた場合はスクリプトを認識させるため再起動します。

「ファイル」→「スクリプト」の中に、自作した「myScript」が入ってます。こいつをクリックすると起動します。

が、コードがないので怒られます。まだ書いてないのでしょうがないですね。

ショートカットを割り当てる

私が一番やりたかったのがココなんです。アクションも便利なんですが、アクションパネル表示、選択、再生ボタン、という作業が意外と煩わしく感じてしまって~~!! よく使う機能がショートカットで動いてくれたらなぁってずっと思ってたので、やっておくとすっごく便利です!

「編集」→「キーボードショートカット」にて、編集ウィンドウを開きます。

「ファイル」グループの中にいます。該当欄を選択して入力状態になったら、そこで使用したいキーを実際に押します。(ここでタイピングしようとして「??」ってなりました。)

私はPhotoshop内で検索あんまり使わないし左手で押しやすいから「Ctrl+F」を割り当ててみました。これで「OK」にすると当然ですが検索が使えなくなりますし、すでに割り当てられているキーは警告が出ます。お好きなキーでどうぞ。右上の「セット」で初期設定にはいくらでも戻せますので大丈夫!

これで、さっきのところを見てみると割り当てられてます。なんにも開いてなくても起動しますので押してみましょう。

怒られウィンドウが出ました。起動したということですね!

コードを書く

起動ができればあとは中身を書くだけです。めちゃめちゃお世話になってるリンクをおすすめ順に紹介します!

わかりやすくて使いやすいコード集

こちらのサイトが神。すんごいありがたいコード集で、コピペで使えるのがめちゃめちゃありがたい…!

HelloWorldしてみる!

それでは、上記のサイトにある「ウィンドウ/ダイアログ」→「01.アラートダイアログを表示する」を参考に、まだ何も書かれていない「myScript.jsx」にコードを書いてみましょう!

alert("HelloWorld!");

カッコ内に書かれたものを表示するダイアログ(小画面)が出てくるコードです。これを上書きして実行すると、

出ました! 新しいチャレンジのHelloWorldは良いものです…( ˘ω˘) あとはここのサイトからやりたいことを探して書いてみてトライ&エラーを繰り返せばOKです!

プラグインで自動記録されたコードを参考にする

とは言え、自動化したい作業ってけっこうマニアックなもので、やりたいことが見つからないってこと、ありますよね…(私はありまくりです…)、そこで便利なのがPhotoshopのプラグイン。

ScriptingListener プラグイン

こちらのサイトから「ScriptingListener プラグイン」の項目のとおりにファイルをDL&解凍して、Photoshopが閉じている状態で、該当の「Utilities」フォルダー(私は「Scripting Utilities」フォルダーでしたけども)を以下のプラグインフォルダーにコピー。

  • Win→ C:\Program Files\Adobe\Adobe Photoshop CC XXXX\Plug-ins
  • Mac→ Applications\Adobe Photoshop CC XXXX\Plug-ins

※コピーする場所はバージョンによると思うので本家リンクを参照してください。

これで、Photoshopを起動~終了までの操作をスクリプト化したlogをデスクトップに出力してくれるのです! すごーい!! JavaScriptとVBScript両方出してくれます。まさにExcelの「マクロの記録」ですねこれ。

ログは起動している間ずっと記録されるので、やめたい場合はPhotoshopを終了して、コピーした「Utilities」フォルダーを削除します。

自動記録されたコードを読む(設定値がないイベント)

「// ===」で操作が1つずつ区切られて記録されます。ちなみに以下は「画像の統合」の操作です。どうやら操作ごとに「イベントID(数値)」というものが割り当てられているようで、2行目で「”FltI”」というイベントの数値を取得、変数に格納して、3行目で変数を使ってイベントを実行しているみたい。

// =======================================================
var idFltI = charIDToTypeID( "FltI" );
executeAction( idFltI, undefined, DialogModes.NO );

ですので、以下のように書いても動きました。

// =======================================================
executeAction( charIDToTypeID( "FltI" ), undefined, DialogModes.NO );

公式リファレンス(後述します)を見てみると、executeAction( eventID [, descriptor] [, displayDialogs] )と書いてあるので、後ろ2つの引数は省略可っぽい。「descriptor」はイベントに対する設定、「displayDialogs」はダイアログのモードかなと。

// =======================================================
executeAction( charIDToTypeID( "FltI" ) );

これでも動く。ただ、イベントによっては設定値がないと動かないものとかもあるので、モノによるという感じですね。

activeDocument.flatten();

まぁでも単純な「画像の統合」なら↑のように書いたほうが早いかなw

自動記録されたコードを読む(設定値があるイベント)

では今度は設定値が必要なイベントのコードを見てみましょう。以下は「イメージ」→「色調補正」→「明るさ・コントラスト」で「明るさ」を「+30」にした操作を自動記録したものです。

// =======================================================
var idBrgC = charIDToTypeID( "BrgC" );
	var desc0 = new ActionDescriptor();
	var idBrgh = charIDToTypeID( "Brgh" );
	desc0.putInteger( idBrgh, 30 );
	var idCntr = charIDToTypeID( "Cntr" );
	desc0.putInteger( idCntr, 0 );
	var iduseLegacy = stringIDToTypeID( "useLegacy" );
	desc0.putBoolean( iduseLegacy, false );
executeAction( idBrgC, desc0, DialogModes.NO );

「desc0」(0は任意の数値)が設定を格納する変数で、その変数に関する処理はインデント(字下げ)してくれています。わかりやすい。自分が読みやすいように設定の部分だけ1行にまとめて、コメントをつけて成形したものが以下です。

// =======================================================
var idBrgC = charIDToTypeID( "BrgC" ); //「明るさ・コントラスト」のイベントIDを取得
	var desc0 = new ActionDescriptor(); //設定のための変数を作成
	desc0.putInteger( charIDToTypeID( "Brgh" ), 30 ); //明るさ
	desc0.putInteger( charIDToTypeID( "Cntr" ), 0 ); //コントラスト
	desc0.putBoolean( stringIDToTypeID( "useLegacy", false ); //「従来方式を使用」チェック
executeAction( idBrgC, desc0, DialogModes.NO ); //設定と共にイベントを実行

設定は2段階の場合もあります。以下は「イメージ」→「モード」→「モノクロ2階調」で「ハーフトーンスクリーン」を実行したログです。(ちょっと成形してあります)

// =======================================================
var idCnvM = charIDToTypeID( "CnvM" ); //「モノクロ2階調」のイベントIDを取得
	var desc1 = new ActionDescriptor(); //1段階の変数作成
		var desc2 = new ActionDescriptor(); //2段階の変数作成
		desc2.putUnitDouble( charIDToTypeID( "Rslt" ), charIDToTypeID( "#Rsl" ), 600 ); //2段階め設定
		desc2.putEnumerated( charIDToTypeID( "Mthd" ), charIDToTypeID( "Mthd" ), charIDToTypeID( "HlfS" ) );
		desc2.putUnitDouble( charIDToTypeID( "Frqn" ), charIDToTypeID( "#Rsl" ), line );
		desc2.putUnitDouble( charIDToTypeID( "Angl" ), charIDToTypeID( "#Ang" ), 45 );
		desc2.putEnumerated( charIDToTypeID( "Shp " ), charIDToTypeID( "Shp " ), charIDToTypeID( "Rnd " ) );
	desc1.putObject( charIDToTypeID( "T   " ), charIDToTypeID( "BtmM" ), desc2 ); //2段階めも使って1段階め設定
executeAction( idCnvM, desc1, DialogModes.NO ); //いろいろひっくるめて実行

「put~」で設定を定義して、「executeAction」で実行、という感じで読み解いていけばいいんじゃないでしょうかね。

自動記録でちょっとハマったところ

私だけかもしれないんですが、メモとして残しておきます。

吐き出されたログをそのままコピペして走らせようとすると、実行できないコマンドがいくつかあって、私の環境では主に「invokeCommand」と「layersFiltered」というイベントがエラーになりました。ひとつずつ検証していって該当部分を削除すると動きました。記録はされるけど実行には必要ないとか、そういうアレなのかなぁと。

公式リファレンスで補完

自動記録されたコードを見ながら、以下の公式リファレンスで検索して使い方を調べてみるとカスタマイズもがんばれます!

イベントを指定する「charIDToTypeID」や「stringIDToTypeID」は、巻末に「Event ID Codes」が載ってるので参考にするとよいですね! ただ全部は載ってないので自動記録と併用がイイ感じです~。

基礎的な部分はここまでで、別記事で私が実際に作ったものを紹介していけたらと思っています!

作成物(随時追記)

公開日:2019/05/12
更新日:2019/05/13

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)

YouTubeでQ&Aコンテンツを企画しています

運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。