ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

Photoshopのスクリプトを書いてみる

Photoshopにはアクションという便利な機能がありますが、かゆいところに手が届きません。
そういう場合に手作業を挟んでましたが、JavaScriptスクリプトを書けばアクションではやりにくいこと(変数を使うようなこととか)も可能です。

こちら、思いのほかお手軽だったのでメモっておきます。

ちなみに 赤めがねさんより色々と情報をいただきましたので、追記しました。
ありがとうございます!

 

大変お世話になりそうなサイト / 本


Adobe Photoshop CC自動化作戦
こちらに基本的な操作の記述例が沢山載っています。ありがたや‥!
ちょっとしたことはこれで大体いけそう。
今回作成した2つのスクリプトはどちらもこのページを参照するだけでほぼいけました。
フィルター関係の文法だけ見当たらない感じでしょうか。

Photoshop自動化基本編』
Googleブックス検索で見た感じとても良さそうです。KindleUnlimitedで0円。
スクロールのフィルターの記述をググったらヒットしたのがこちらでした。

Photoshop自動化基本編 (Adobe JavaScriptシリーズ(NextPublishing))

Photoshop自動化基本編 (Adobe JavaScriptシリーズ(NextPublishing))

 

Adobe CS6 バージョンJavaScript ファレンス
私が自宅で個人所有してるのがCS6なのでCS6のリファレンスのリンクになります。

API Documentation
こちらでクラスやプロパティを調べることが可能とのことです。

Photoshopの動作をJavaScriptで記録しよう - Photoshopの情報集
こちらは該当ファイルが見つからなかったのですぐに諦めたのですが、どうもCS6からは別途ダウンロードが必要になったみたいです。

既存フィルターやアクションをスクリプトに置き換えたい場合にぜひ利用したいですね!

スクリプトを書いて実行してみる


自宅でも会社でもちょっとしたコーディングには秀丸を使ってるのですが、コードを記述したらエンコードの種類をUTF-8 BOMありで保存して拡張子を jsx にするだけでOK。

ついでに jsx ファイルを通常開くプログラムとして秀丸に関連付けておきました。

スクリプトが用意できたら、Photoshopがインストールされたパスのスクリプトフォルダ内に放り込みます(Photoshop本体のショートカットのプロパティからインストール先のフォルダを簡単に開けます)。

次にPhotoshopを起動するとメニューの「ファイル>スクリプト」内に見つかるので、選択して実行します。
スクリプトの内容はPhotoshopを起動中に書き換えてもちゃんと反映されるので、まずはスクリプトフォルダに jsx ファイルを放り込んで起動してから、実行と修正を繰り返すと良いです。

もしPhotoshopがすでに起動中で新しく jsx を作成したなら、Photoshopのメニューの「ファイル>スクリプト参照」からでも実行できますが、実行する度に参照から選ばないといけないので再起動した方が良いですね。

また、何かやりたいことがある場合にその全ての工程をスクリプトにする必要は無くて、アクションに指定のスクリプト実行を含められるので、アクションの記録では手が届かない工程だけスクリプトで補うのでも十分アリだと思います。

それから、スクリプト実行後はヒストリーを辿れば1工程ずつ流れをチェックできるのでデバッグしやすいのがとても良い感じですね!

それと Adobe ExtendScript Toolkit がコーディングにとても便利ということです。
こちらまた使ってみたらレポートしてみたいと思いますっ


 

スクリプトのサンプル


シームレステクスチャ作成時にフィルタをかけるために、ドキュメントを縦横ともに倍のサイズに変更してタイリングするという下準備を行うスクリプト

/*
 Photoshopでタイリングする下準備
*/

//画像を統合する
activeDocument.flatten();

//背景レイヤーを複製
activeDocument.backgroundLayer.duplicate();

//ドキュメントの横幅、縦幅を調べる(単位関係なし)
preferences.rulerUnits = Units.PIXELS;
w = activeDocument.width.value;
h = activeDocument.height.value;

//キャンバスサイズを左上基準で倍に変更する
activeDocument.resizeCanvas(w*2,h*2,AnchorPosition.TOPLEFT);

//背景レイヤーを選択して黒で塗りつぶす
activeDocument.backgroundLayer;

RGBColor = new SolidColor();
RGBColor.red = 0;
RGBColor.green = 0;
RGBColor.blue = 0;
activeDocument.selection.fill(RGBColor,ColorBlendMode.NORMAL, 100, false);

//レイヤー1を選択して複製、元のドキュメントサイズ分右へ移動、下のレイヤーと結合
docObj = activeDocument;
docObj.activeLayer = docObj.layers[0];

activeDocument.activeLayer.duplicate();

docObj.activeLayer = docObj.layers[0];
activeDocument.activeLayer.translate(w,0);
activeDocument.activeLayer.merge();

//レイヤー1を選択して複製、元のドキュメントサイズ分下へ移動、下のレイヤーと結合
activeDocument.activeLayer.duplicate();

docObj.activeLayer = docObj.layers[0];
activeDocument.activeLayer.translate(0,h);
activeDocument.activeLayer.merge();

 

もうひとつ、フィルタを適用した後に元のドキュメントサイズで切り抜いてフィルタ「スクロール」で元の位置に戻すスクリプト

/*
Photoshopでタイリング状態から戻す
*/

//画像を統合する
activeDocument.flatten();

//ドキュメントの横幅、縦幅を調べる(単位関係なし)
preferences.rulerUnits = Units.PIXELS;
w = activeDocument.width.value;
h = activeDocument.height.value;

//キャンバスサイズを中央基準で1/2に変更するactiveDocument.resizeCanvas(w/2,h/2,AnchorPosition.MIDDLECENTER);

//フィルタ>スクロールで縦横をキャンバスサイズの半分だけ移動activeDocument.activeLayer.applyOffset(
  w/4, //水平方向の移動量
  h/4, //垂直方向の移動量
  OffsetUndefinedAreas.WRAPAROUND);


Googleドライブにアップしました。

PhotoshopScript - Google ドライブ

CS6では一応ちゃんと動作しています。
どちらのスクリプトも最初にドキュメントのレイヤーを統合してしまうので使用時にはご注意ください。