kick the base

Houdiniと、CG技術と、日々のこと。

Photoshop/JSX: スクリプトで復帰を実現する

今回はPhotoshopの「復帰」をスクリプトで実行する方法をご紹介します。非常に簡単なコードなので単発記事となります。

とあるポイントを基準に繰り返し画像処理を行う場合などに便利なので覚えておくとよいかと思います。(勿論、そのポイントに戻るときに「復帰」を使うわけです)

最終的なコード

(function() {
    var desc = new ActionDescriptor();
    var revertID = charIDToTypeID('Rvrt');
    app.executeAction(revertID, desc, DialogModes.NO);
})();

たったの5行。これだけです。例のごとくコードを書いた順番に見ていきます。

アクションを作成し、実行する

var desc = new ActionDescriptor();
var revertID = charIDToTypeID('Rvrt');
app.executeAction(revertID, desc, DialogModes.NO);

実質コードは上記の3行です。そしてその中でも重要なのは3行目で、1行目・2行目はその準備として変数を用意しているだけです。つまりワンライナーで書くと下記のようになります。

app.executeAction(charIDToTypeID('Rvrt'), new ActionDescriptor(), DialogModes.NO);

このexecuteActionメソッドについて見ていきましょう。

executeAction(イベントID, アクションデスクリプター, ダイアログモード)

executeActionメソッドはその名の通りアクションを実行するメソッドです。ここで重要なのは第一引数のイベントIDです。このイベントIDによってアクションの挙動が指定されます。

ちなみにこのイベントIDはPhotoshopが理解できるIDなので、人間がわかりやすく管理できるようcharIDToTypeID関数が用意されています。この関数に4文字のコードを渡してあげることでPhotoshopが理解できるIDに変換してくれます。

下記表に乗っているコードはほんの一例です。公式ドキュメントに載っていないものも多々あるので、実際にはつど調査しながら実装する形になります

charIDToTypeIDに渡すコード(文字列) 意味
'Rvrt' 復帰
'quit' 終了
'Msk ' マスクID

コードは4文字しばりなので、MskではなくMsk␣となるところが注意です(最後にスペースが入っています)

また第三引数についても少し見ていくと下記のようになります。

ダイアログモード 意味
DialogModes.ALL ダイアログ、アラートともに表示する
DialogModes.NO ダイアログ、アラートともに表示しない
DialogModes.ERROR ダイアログは非表示、アラートは表示する

今回はサクサク動かしたいのでDialogModes.NOを採用しているわけです。

最後に即時関数にくるんでおしまい

(function() {
    var desc = new ActionDescriptor();
    var revertID = charIDToTypeID('Rvrt');
    app.executeAction(revertID, desc, DialogModes.NO);
})();

(function() { ... })();で処理をくるむことでグローバルスコープへの名前空間汚染がなくせます。

例外処理

上記コードでほとんどのケースで動作するのですが、実は下記状況でエラーがでます。

  • 一度も保存していない場合

「復帰」をスクリプトに組み込んでいる以上、一度も保存していないケースは想定しにくいのですが、こちらにちゃんと対応する場合は下記のように例外処理をはさめばよいでしょう。

もちろん、コメントアウトしたdo anythingのところにエラー時の処理を書いてあげることになります。

(function () {
    var desc = new ActionDescriptor();
    var revertID = charIDToTypeID('Rvrt');
    try {
        app.executeAction(revertID, desc, DialogModes.NO);
    } catch (e) {
        // do anything
    }
})();

まとめ

いくつかの画像サイズにリサイズして書き出しを繰り返すなどという作業はよくやると思います。そんなとき、ファイルをつど開き直すのも手ですが、復帰を利用しても良いでしょう。