Photoshop UXP Imaging API beta触ってみた

UXP

Photoshop UXPのImaging APIのベータ版が公開されました。2023年1月現在Photoshop 24.2ベータ版で使用できます。これはピクセル操作をJavaScriptから直接操作できるAPIで既存のExtendScriptのように一ピクセルづつ選択範囲を作って抽出、塗りつぶすような操作をする必要もありません。UXPでもImaging API以前はピクセル操作に関しては従来のExtendScriptとはそこまで大差はありませんでした。

*ExtendScriptのピクセル操作に関してはこちらの記事を参照してください。Photoshop Extensionの開発28 フィルター作成

Imaging APIでできること

まずとにかく処理速度が速いです。今までピクセル操作をしようとすると100X100ピクセルでも2~3分程かかって1000X1000ピクセルともなると全く実用とは程遠い速度でした。しかし今回MacBook Pro 2.3GHzデュアルコアIntel Core i5 8GBメモリというスペックでも1000X1000ピクセルくらいの処理、30秒以下で処理してくれます。

rgb filter
現状以下のようなことができます。

  • ピクセルを抽出してその後に書き出し
  • レイヤーマスクの抽出、書き出し。
  • 選択範囲の生成。
  • JavaScriptでピクセルを直接生成。
  • リサイズ

その他カラーモードはRGBとLabとGrayのみサポートしています。
また画像の解析、ピクセル操作、抽出といったことがJavaScriptでできるようになる可能性があります。

まずはドキュメントの画像の抽出

imagingモジュールですが以下のように呼び出します。

betaと名づいているように当分ベータ版のみの運用が予想されます。また早くなったとはいえ大きな画像を扱うと簡単に止まりやすいので注意してください。(実際公式のドキュメントでもメモリの使用に気をつけるよう触れられている)
ちなみに基本imaging APIはmodalスコープ内で実行します。過去の記事参照。
以下のコードでアクティブドキュメントのピクセルを読み込めます。

getPixelsメソッドでピクセル情報を抽出するのですがいくつかオプションがあります。
ターゲットのドキュメント、カラープロファイルなどありますが上記の場合アクティブなドキュメントのイメージからsourceBoundsの範囲、x:0,y:0
からx:1000,y:1000の範囲までsourceBoundsオブジェクトで指定しています。すると以下のような値を取得できます。

imagedata console

PhotoshopImageData class内に取得したピクセル情報の詳細が保持されています。しかしこのままではピクセル操作ができないのでgetDataメソッドでArrayBufferオブジェクトを取得します。これはArray形式で大量のnumber値が保持されているのですが実はRGBの場合R,G,B….と並んでいます。この数値を増減すればそのまま画像に反映されます。ただしオプションでchunkyがfalseだとRGBが分離して違った結果になる。その場合planar形式になりますが通常chunky形式しか使わないでしょう。
ちょっとしたフィルターのようなものを実装すると以下のようになります。

これは抽出したピクセルからGの値を引いてMに傾いた画像を生成します。数値が0より小さくなったら255を超えるとどうも値がループして0から255になったり255から0になるようなのでMath.minとMath.maxメソッドで調整しています。

putPixelsメソッドでピクセルをドキュメントに書き出せます。メモリを食うらしいので最後に必ず取得したイメージデータを解放してください。既にドキュメント上にある選択範囲からピクセルを抽出したい場合はgetSelectionを使えば選択範囲内から抽出できます。

選択範囲を生成したい

なんと選択範囲も生成できます。ちなみに色域指定を使ってる方ならご存知ですが選択範囲の選択域というのは二進法で0か1ではなくピクセルによっては完全に選択されている部分と半分だけ選択されている部分、または30%のみ選択されている部分、全く選択されていない部分とRGBでいう0~255の値で選択の値がピクセルによって異なります。なので色域指定で特定の色域を選択、塗りつぶすを等を行うと指定の色で完全に塗りつぶされている部分からなだらかに選択されていない部分と別れて塗りつぶされます。

selection image
このように一見ただの長方形の選択範囲も境界線にぼんやりと選択されている部分からされてない部分になだらかな変化がある。

以上のことを踏まえてImaging APIで選択範囲を作ります。
まずグレースケールのピクセルを先ほどのように生成します。それをデータとして渡せばPhotoshop側が選択範囲に変換してくれます。
それでは試しにグラーデーションの選択範囲を作ってみます。

グレースケールの画像をfor文で生成。0の数値が全く選択されてない箇所、255の数値が完全に選択されている箇所になります。これで生成された選択範囲に塗りつぶしを行うと以下のようにグラデーションになります。

gradients

画像を解析して解析結果を元にマスクの作成もできそうです。

レイヤーマスク

レイヤーマスクの操作もAPIで可能です。マスクデータを所持しているレイヤーからマスクデータの抽出、生成したピクセルをマスクに貼り付けるといったことが前述の工程とほとんど同じような感じで可能です。マスクデータなのでもちろん基本はグレー画像です。

以上とりあえずのPhotoshop UXP Imaging APIの紹介でした。
今後もっと処理速度が上がればフィルターの作成、Scriptからイメージの生成といったことがもっとできるようになるでしょう。本来Photoshop自体ビットマップ画像編集ソフトウェアなので今までピクセル操作ができなかっったのもおかしな話でしたがともあれベータ版から製品版に移行されればこれでできることの幅がかなり広がるでしょう。

Beer 寄付してサイトを応援する。