hirax.net::Keywords::PDLS

「PDLS」について

「PDLS」のブログ

PDLSとは?

Photoshopプラグイン環境

Photoshop DLL Linking System (PDLS)

jun hirabayashi jun@hirax.net

Photoshopのプラグインを「通常のDLLを作るのと同じやりかた」で簡易に作成できるソフトウェアです。Photoshopと一緒に使う分には、Windows専用です。ただし、同ソースから生成されるプラグインがLinux用でも使えるLinux用のアプリケーションも別途あります。

プラグインのユーザーとしての使い方

インストールの仕方

  • PDLS.dllをPhotoshopのアプリケーションがあるディレクトリ(例えば"C:\Program Files\Adobe\Photoshop 6.0")へ移動する
  • ディレクトリDllPlugins?もPhotoshopのアプリケーションがあるディレクトリ(例えば"C:\Program Files\Adobe\Photoshop 6.0")へ移動する
  • DLLmulti.8BFをPhotoshopのプラグインディレクトリの下のフィルタープラグインのディレクトリ(例えば"C:\Program Files\Adobe\Photoshop 6.0\Plug-Ins")にコピーする

使い方

通常のプラグインと基本的には同じ、です。[フィルタ]-[hirax.net]-[PDLS...]をメニューから選択すると、こんなダイアログ

http://www.hirax.net/misc/pdls/images/1.gif

が表示されます。読み込まれている拡張機能がリストボックス内に表示されていますから、それをダブルクリックすれば、それぞれの処理がされることになります。

プラグイン開発者をする方からの使い方

 とりあえずは、添付されているVisual C++とC++ Builderのサンプルプロジェクトをご覧下さい。どんなに簡単か判ると思います。

 ちなみに、Borland C++ Builderで作成された鳥瞰図プラグインはサンプルプロジェクトに(大雑把に言えば)

   MainForm = new TMainForm(NULL);
   int i=0;
   for(int y=0; y < iHeight; y++)
       for(int x=0; x < iWidth; x++)
           MainForm->DataSeries->AddXYZ(y, fpData[i++], x,"",clTeeColor);
   MainForm->ShowModal();
   delete MainForm;

という記述を加えただけ、です。この環境とBorland C++ Builderが組み合わさると(Visual C++でも難しくはないですが) 驚くほど簡単に色んなプラグインを作ることができます。

仕組みとファイル配置

 Photoshopのプラグインディレクトリに置かれたphotoshop_multi.8bfがまずPhotoshopからフィルタ処理を行う際に呼ばれ、次にPhotoshop アプリケーションディレクトリに置かれたPDLS.dllがphotoshop_multi.8bfにより呼ばれます。そして、最後に DllPlugins?ディレクトリに置かれた各DLLがPDLS.dllから呼ばれるという(オーバーヘッドの多い)システムです。

 また、マクロは拡張子*.mcrというテキストファイルで保存すると、 DLLと同じように読み込むことができるようになります。なお、今のバージョンではマクロファイルは

bc55
{
Value=0.5,WhichPlane=2
}

というような記述になります。また、空白行が(最後にも)あってはいけません。つまり、最後の行は"}"の後にすぐEOFがあることになります。

対応モード

色モードは

  • RGB
  • Gray
  • CMYK
  • Lab

となっており、各PlaneのBit深度は

  • 8bit
  • 16bit

に対応しています。プレビューダイアログ周りの描画とかマスク処理とかBit深度の違いとかは PDLSが処理するので、とても簡単にプラグインが作成できるか、と思います。

DLL側からは画像データは全て[0.0…1.0]のfloat型データとして扱うことになります。 PDSL中で色々処理を行う場合には、全てこのfloat型データの精度で処理が行われますので、二次元数値計算っぽい使い方も十分できるのではないでしょうか。

データは複素数扱いできるようになっています。といっても、虚数部は実数部の後ろに配置されているだけのシンプルな作りです。

また、背景レイヤー以外のレイヤーの場合、Photoshop場では非表示のアルファチャンネルが 1チャンネル追加されています。ですから、例えばRGBモードであっても、4チャンネル存在することになります。その場合、最後のチャンネルを変えてしまうと透明度が変わってしまいます。ご注意下さい。

マクロ対応

作業の記録

GUIを使って色々なDLLで作業をした結果は、テキスト形式のマクロとして保存することができます。保存されたマクロファイル(拡張子=.mcr)はさらに機能拡張として使うことができます。マクロファイルからはDLLと全く同じように他のマクロファイルを呼ぶこともできます。

マクロの書式

各DLL(プラグイン)のさまざまなパラメータ設定はテキスト形式で受け渡されます。 DoFilter?のchar *cParametersを介してパラメータが渡されます。 cParametersの文字数は4096文字までです。 PDLSからダブルクリックでDLLが起動された場合には、cParametersには"NONE"という文字が入っています。マクロの記述は例えば、添付したBorland C++ Compiler 5.5のサンプルbc55というプラグインを使うのであればパラメータも含めて

bc55
{
Value=0.5,WhichPlane=2
}

というように書きます。

また、マクロの冒頭でのみ"Def"文を使うことができます。例えば、

Def
{
cValue=0.5, cPlane=2
}
bc55
{
Value=cValue,WhichPlane=cPlane
}

なんていう風に書くこともできます。こういうマクロを作成して、例えばSample.mcrという名前で保存しておけば、このマクロは他のマクロから

Sample
{
cValue=0.2, cPlane=1
}

なんていう風に呼び出すこともできるようになります。

DLL作成者のための注意

PDLSは各DLLの処理を簡単にするために、各行の"="以前の文字はDLLには渡しません。つまり、このマクロの場合にはbc55.dllが呼ばれ、*cParametersには"0.5,2"という文字列が入っています。

DLLの処理後に、DLLがPDLSに返す文字列*cParametersには"Value="というような文字列は(ユーザーへの判りやすさのために)含まれているべきです。また、指定したチャンネルにのみ処理を行う場合には、(単にマクロの使い勝手の共通化のために)できるだけそのチャンネル指定は末尾のパラメータとして下さい。

また、GUIを使ったプラグインの場合にも、使用したパラメーターは*cParametersに入れてPDLSに返すようにします。そうすれば、ユーザーは簡単に「マクロ作成・理解」をすることができるようになります。そして、ユーザーがDLLの機能を組み合わせるマクロプログラムをとても容易に書くこともできるようになります。

PDLSを使ったプラグインの作り方

各DLLは以下の関数を含まなければなりません。詳しくは書き足していきますが、とりあえずはサンプルファイルを改造してみるのが一番早いと思います。

関数の説明

 次のような四つの関数を書くだけです。といっても、サンプルプログラム(全部でわずか80行)をそのまま流用すれば良いです。つまり、実際にはDoFilter?に適当な処理ルーチンを書けば良いだけです。それでPhotoshopに対応したプラグインができあがります。

int DoFilter(        //フィルター処理ルーチン
   float* fpData,    // 画像データへのポインター Planeオーダーでデータが並んでる
   int iWidth,       // 画像の幅
   int iHeight,	   // 画像の高さ
   int iPlaneNum,    // Plane数
   int ColorMode,	    // カラーモード
   char *cParameters,  // パラメータ受け渡し用 4096文字まで
   int iComplex     // 複素数モードかどうか 0=実数、1=複素数
   )
bool DoAbout(void)                    // About表示時の処理
bool Discription(char *cDiscription) //プラグインの説明文章を返す
bool IsOK(int iColorMode)            // 現在のカラーモードに対応しているか?

アイコンを作る

必ず作らなければならないわけではないですが、もし***.dllというプラグインを作ったならば、 64 * 64 pixelの***.bmpという画像ファイルと16 * 16 pixelの***s.bmpという画像ファイルを DllPlugins?ディレクトリに置けば、その画像がダイアログ内で用いられるアイコンとして使用されることになります。きっと判りやすい画像はユーザーの役に立つことでしょう(マニュアル風な言い方)。

Borland C++ Builderでのプラグイン作成

添付したサンプルプロジェクトを適当にいじってみて下さい。

Borland C++ Compiler 5.5(Free 配布版)でのプラグイン作成

http://www.borland.co.jp/cppbuilder/freecompiler/bcc55download.html

からBorland C++ Compiler 5.5をダウンロードして、インストールした後に Autoexec.batにPath追加(添付ファイルを参考に)して、添付のBCC32.CFGをディレクトリBORLAND\BCC55\BINにおいた後に、ディレクトリBORLAND\BCC55\BINで

bcc32 -WD -ps bcc55.cpp

でコンパイル、です。

__stdoutの指定のために、コンパイルオプションを含めて

bcc32 -WD -ps ***.cpp

というようにコンパイルして下さい。コンパイルが上手くいったならば***.dllが作成されているはずです。

添付したBorland C++ Compiler 5.5用のサンプルファイルは指定した値で塗りつぶすサンプルファイルです。マクロ対応もしています。マクロで呼ばれた場合には、塗りつぶすチャンネルも指定できます。

Microsoft Visual C++でのプラグイン作成

添付したサンプルプロジェクトはBorland C++ Compiler 5.5と同様のソース・機能のものです。

PDLSを使ったプラグイン

PDLSから利用できるさまざまなプラグインです。

AverageOffset?プラグイン

画像のピクセル値の平均値で値をシフト。

Correl

チャンネル間の相関値計算プラグイン。

Copyプラグイン

マクロ対応。任意のチャンネルから、任意のチャンネルへ値をコピーします。Photoshopの16bitモードではコピー・ペーストができないので、そんな時に有効になります。マクロ記述は、

Copy
{
Src. = 0,Dest. = 1
}

Src.がコピー元チャンネルで、Dest.がコピー先チャンネルです。

CopyFrom?プラグイン

チャンネルの間、任意の領域でコピーをする。

Linerプラグイン

マクロ対応。チャンネル間で線形演算を行います。それぞれのチャンネルのピクセル値に係数を掛けた和(および切片成分)をDestinationチャンネルに代入します。マクロ記述例は下のようになります。

Liner
{
Dest. = 0,
Chanel0=0.3,
Chanel1=-0.1,
Chanel2=0.3,
Other=0.1
}

上のマクロの例であれば、(RGBモードでなれば) R = 0.3*R + 0.1*G + 0.3*B 0.1 という変換をすることになります。

Normalizeプラグイン

マクロ対応。画像値をノーマライズするプラグインです。マクロ記述は以下のようになります。

Normalize
{
Min.=0,Max.=1,Common=1,Channel=-1
}

Clipプラグイン

マクロ対応。値を上限あるいは下限でクリッピングするプラグインです。マクロ記述は

Clip
{
Min Clip = 1,Max Clip = 0,Min.=0.3,Max.=1,Channel=-1
}

で、最初の二つの引数は最小値・最大値それぞれをクリップするかどうか、です。1でクリップする。0でしない、です。そして、クリップする値の閾値が後の二つの引数です。

Subtractionプラグイン

マクロ対応。チャンネル間、あるいはチャンネル内で減算をするプラグインです。チャンネルAの相対位置(x, y)からチャンネルBの値を引いて、チャンネルCに代入します。マクロ記述は以下のようになります。

Subtraction
{
Channel1=0,Channel2=1,Channel3=0,Xoffset=0,Yoffset=0
}

SurfacePlot?プラグイン

マクロ対応。画像を鳥瞰図にして眺めるプラグインです。グラフをWindows Meta Fileにして保存する機能有り。マクロ記述は

SurfacePlot
{
Channel=0,
Save=1,
SaveFileName=C:\Documents and Settings\Administrator\デスクトップ\test.wmf
}

という感じです。

Tableプラグイン

 マクロ対応。画像データの各ピクセルの値を「エクセルのような表」スタイルで眺めたり、いじったり、保存したりすることができます。マクロ記述は

Table
{
Channel=2,Save=1,SaveFileName=C:\test2.csv,Load=0,LoadFileName=none
}

となります。

Channel=表示チャンネル
Save= CSV保存する→1
SaveFileName=保存ファイル名
Load= CSV読み込みする→1
LoadFileName=読み込みファイル名
  • 機能
    • 画像値変更
      • セルの値書き換えによる画像値変更
      • セル画面におけるコピー・ペースト機能
    • ファイル保存、読み込み
      • CSV形式による画像保存 選択されたチャンネルをCSVファイルに保存する
      • CSV形式からの画像読み込み (03.03.14) 画像サイズとCSVファイルの画像サイズが同じ場合にのみ、CSVファイルを画像に取り込むことができる

http://www.hirax.net/misc/pdls/images/3.gif

3次元グラフレンダリング・プラグイン

もっとリアリスティックな3次元グラフを描くプラグインです。はっきり言ってしまえばPovRay?プラグインです。

Fourierプラグイン

フーリエ変換、逆フーリエ変換をするプラグイン

MathParserプラグイン

数式を入力して計算を行った結果に変換するプラグインです。FilterFactoryと同様の機能を持ちます。

  • 特徴
    • 16bitモードやCMYKモード時にも動作する (FilterFactoryでは8bit RGBモードに限定される)
  • 文法
    • 変数
      • X x座標
      • Y y座標
      • Z ピクセル値
    • 関数
      • Atok数式プラグインと同等

PoliFitプラグイン

多項式近似プラグインです。

C++プラグイン・メイカー

C++で画像変換部を記述することができる。何とビックリのプラグイン処理時にプラグインをコンパイルするという無意味さ。

  • 動作に必要な環境
    • Borland C++ Builder 5.5

ダウンロード

最新版のプラグイン

ソース等

  • PDLSプラグイン一式
    • プラグイン動作のためのファイル
      • SurfacePlot(マクロ対応)、Table(マクロ対応)、2DFFT、Nornalize(マクロ対応)、 Subtract(マクロ対応)、POVRayプラグイン、数式処理プラグイン
    • Visual C++ サンプルプロジェクト
    • Borland C++ Builder 4.0 サンプルプロジェクト
    • Borland C++ 5.5(Free版) サンプルソース

変更履歴

  • 04.08.07メモリ機能拡張 (New, Delete追加)
  • 04.02.07 マクロ機能拡張
  • 03.04.19 Linerプラグイン作成(マクロ対応)
  • 03.04.19 SurfacePlotマクロ対応
  • 03.04.18 Tableプラグインマクロ対応

「PDLS」を含む記事