新シリーズ投稿。Photoshopフィルタとしてsbsarを使う
フォトショップに最近サブスタンス連携が追加されたが、マテリアルをパラメーター調整して2Dペイントするための物のようだ。入力レイヤーなどがとれない。そのような感じではなくビットマップレイヤーに対するフィルターとして使ってみたい。利点は高速に動くフィルターがサブスタンスデザイナーのノードグラフで作れること。
最近別件で忙しいので、これを実現するための考察だけ先に書いておく。
技術選定
Photoshop
結論 UXP Plugin API を使う。各種開発向け情報は以下にある。2023年2月においては。(よく場所が変わる。)
https://developer.adobe.com/photoshop/
C++ SDK
自分がC++明るくないのと、のSDKダウンロードするとCS4あたりのドキュメントPDFが入っていて不安を覚えるので利用しない。クロスプラットフォーム対応もしずらい。
CEP and ExtendScript
CEP はモダンなJavascriptでGUIを作るもの。ExtendScript はいわゆるjsxでレガシーなjavascript。通常フォトショップでなにか作ろうとしたら今でもjsxになる事が多い。CEPとjsxとのやり取りはテキストコードを送りあってevalするという凝ったものを作るのはさらにかなり大変な感じ。経験があるので知っている。
フォトショップの裏で NodeJS を動かして ImageMagick で画像処理させる例は何度か見たことがあるが、Typescriptなどの補佐を使うとしても厳しい。いくつもjsエンジンが動くことになる。
Photoshop API
これはサーバーサイドで広告を作ったりするもののようだ。ちゃんと調べてないので詳細は違うかもしれない。今回は使わない。
UXP for Adobe Photoshop
これがここ数年でAdobeXDとともに成長している新しいプラグイン作成方法。XDで多少使ってみたが、モダンな開発自体は楽になったが、セキュリティ的な制約や手続きが多くイマイチ使いづらい印象を受ける。大きな制約が外部アプリケーションを直接叩けない事。代替手段としてソケット通信を使う。マルチプラットフォームとしては動作するので、今回はこれを使う。
ローカルアプリケーションサーバー
というところで、UXPプラグインと送受信ソケットの送受信を行う外部アプリケーションを作る必要がある。ここは Python で適当なビルトインのモジュールを使う。もしかすると Flask くらい使うかもしれない。
ここまでで本音を言うとやはりフォトショップでPythonを使いたいし、権限を持ったアプリは直接外部アプリケーションを叩けるようになってほしい。まあ仕方がない。
フィルタの実装
ここにサブスタンスを利用する。コマンドベースで画像を入力として画像を出力することは sbsrender という、サブスタンスデザイナーもしくは旧サブスタンスオートメーションツールキット(新しい名前なんだっけ)付属のコマンドを使えば可能。
今回の全体構成
ビットマップレイヤーを選択した状態で、フォトショップのトップメニュー(コンテキストメニュー利用が可能ならそこから)からフィルター適用実行する。UXPによりレイヤー画像を書き出しソケット経由でpython呼び出し、そこからさらにsbsrenerを叩きフィルターのかかった画像をエクスポート、pythonでUXPに戻し、画像を挿げ替える。
制限事項
- 2のべき乗のイメージサイズのみ対応
サブスタンス側の制限。正確に言うとどんなサイズでも可能だが処理結果が劣化すると思われる。 - ダイナミックフィルターではない
UNDO で戻すことは可能だが on/offは気軽にできない。 - グループへの適用はできない パスへの適用はできない
純粋なビットマップレイヤーだけに対応する 処理実行時に結合やラスタライズすれば可能だが - 今回、複数の画像入力は持たない
できるかもしれないが、大変なので - 今回、フィルターパラメータインターフェースは作らない
UXPで作れるはずが、GUIは大変なので今回は用意しない。レイヤーの名前ベースで引数を受けわたす程度はやるかもしれない。 - レイヤー効果の扱い未定
一度外してフィルタかけて戻して再度効果適用するか?
まとめ
上記のような構成で作ってみる。まずは最低限の画像のエクスポートとインポートのUXPアプリ作成から。結構大変なので、ぜひAdobeに実装してほしい。要望出してみたい。自分で制作している間に公式に実装されるならそのほうがいい。他の人が作っていたらそれを使いたい。
※ そういえば昔、シェーダーでフォトショップフィルター書くソリューションが標準機能にあったと思うけどあれはどこいったんだ。あれを復活してくれてもいいんだが。







