ホームページ  >  記事  >  ウェブフロントエンド  >  Photoshop 用のサードパーティ フィルター プラグインの開発の概要

Photoshop 用のサードパーティ フィルター プラグインの開発の概要

高洛峰
高洛峰オリジナル
2017-02-20 09:02:073140ブラウズ

Photoshop は、デジタル画像処理の分野で優れたソフトウェアです。同時に、サードパーティがプラグインの形でその機能を拡張することもできます。 Photoshop プラグインは現在、次の 9 種類に分類できます: オートメーション (バッチ処理) (「自動」サブメニューの下に表示されます)、カラー ピックアップ、インポート、エクスポート (「インポート」「エクスポート」サブメニューの下に表示されます)、拡張機能、フィルター、ファイル形式 ([開く]、[名前を付けて保存] の下に表示されます)、解析 (エクスポート機能を使用)、選択 ([選択] メニューの下に表示されます)。ここでは、ユーザーにとって最も馴染みのあるフィルターを例として取り上げます。
(1) プラグインの一般的な部分の紹介:
プラグインのメイン プログラム (ほとんどの場合、Photoshop (以下 PS) ) を呼び出すことでホストになります。実際には Windows システムのダイナミック リンク ライブラリです (拡張子名が異なるだけです)。 PS は LoadLibray を使用してプラグイン モジュールをロードします。ユーザーが対応するアクションを実行すると、プラグイン モジュールに対する一連の PS 呼び出しが発生します。これらの呼び出しはすべて同じエントリ ポイントを呼び出します。エントリ ポイントは次のように定義される関数です。 (PS は Windows と Mac と互換性があるため、ここでは Windows システムでの定義のみを示します)

void ENTRYPOINT (
) 長い* pluginData,
短い* 結果) ;


セレクター:
操作タイプのインジケーター。 selector=0 の場合、すべての種類のプラグインに対して同じ意味を持ちます。つまり、[バージョン情報] ダイアログ ボックスの表示を要求します。その他の値はプラグインの種類に応じて意味が異なります。

pluginParamBlock:
これは、ホストとプラグインの間で情報とデータを渡すために使用される大きな構造体へのポインターです。プラグインの種類ごとに異なる構造を持っています。

pluginData:
int32 型へのポインター。これは、PS がプラグインへの複数の呼び出しにわたって保存する値です。標準的な使用法の 1 つは、プラグインがこのパラメーターにグローバル データのポインターを与えて保存できることです。

result:
int16 へのポインター。プラグインが呼び出されるたびに結果を設定する必要があります。 0 が返されると、プラグイン コードでエラーが発生しなかったことを示します。エラーが発生した場合、この値はエラー コードを返します。エラーコードに関しては、ps はプラグインの種類ごとにエラーコードの範囲を分割し、SDK でいくつかの値を事前定義しています。

About ダイアログ:
すべてのプラグインは About 呼び出しに応答する必要があります。プラグインはカスタム ダイアログ ボックスを表示できます。ただし、一貫性を維持するために、次の規則に従う必要があります:
(1) メイン画面の水平方向の中央、垂直方向の 1/3 の高さに表示されます。
(2) [OK] ボタンを含める必要はありませんが、任意の場所のクリックと Enter キーに応答します。

(2) フィルタープラグインの紹介
フィルタープラグインの機能は、画像の選択範囲を変更することです。フィルターの動作は、彩度や明るさの調整から画像のフィルター処理などまで多岐にわたります。 Windows でのフィルターの拡張子は「.8BF」です。
次の図は、PS とフィルター プラグインの間の呼び出しシーケンスを示しています。これは、SDK ドキュメントにある図であり、ここに示されているのはフィルターです。プラグインの呼び出しシーケンス。


Photoshop 用のサードパーティ フィルター プラグインの開発の概要 フィルターは、最上位の呼び出し開始点であるフィルター メニューを使用して呼び出すことができます。一度呼び出した後、Photoshop は最新のフィルター操作をフィルターメニューの「最後のフィルター」サブメニューに配置します。このメニューをクリックすると、上の図の「最後のフィルターコマンド」に対応します。以下に、上記のプロセスを簡単に紹介します。まず、フィルターのエントリ ポイント関数の「テンプレート」を見てみましょう:

プラグインのEntryPoint :PlugInMain
// エクスポートされた関数の定義を作成します
#define DLLExport extern "C" __declspec(dllexport)
#define SPAPI

DLLExport SPAPI
void PluginMain(const int16 セレクター,
void * filterRecord,
int32
* data,
int16
* result)
{
switch (セレクター)
{
case filterSelectorAbout:
//DoAbout();
break;
case filterSelectorParameters:
DoParameters();
break;
case filterSelectorPrepare:
DoPrepare();
break;
case filterSelectorStart:
DoStart();
break;
case filterSelectorContinue:
DoContinue();
break ;
case filterSelectorFinish:
DoFinish();
break;
default:
*gResult = filterBadParameters;
break;
}
}

上記の関数はフィルターの最も重要な関数であることに注意してください。この関数は PS 呼び出しに提供されているため、この関数が Dll エクスポート関数として宣言されていることがわかります。呼び出しシーケンスからわかるように、このメカニズムにより、この関数の機能はウィンドウのウィンドウ プロシージャと非常によく似たものになります。ウィンドウ プロシージャは MSG ID に基づいてメッセージを処理するために使用され、この関数は主にセレクターに基づいて対応する操作を実行するために使用されます。したがって、それらはすべてスイッチケース分岐処理構造を含んでいます。

filterRecord
上記の関数で使用される 2 番目のパラメーターは、about が呼び出された場合 (つまり selector=0)、 AboutRecord 構造体へのポインターです。構造体は非常に大きく複雑な構造体であり、ps とフィルター間の通信とデータ転送の主要なキャリアであり、そのサイズは 452 バイトであり、このドキュメントには合計 7 ページが含まれています。この構造体のメンバーの意味を紹介します。 FilterRecord の完全な定義は、SDK のヘッダー ファイル:pifilter.h にあります。以下では、その最も基本的かつ重要なメンバーについて説明します。

(3) 呼び出しプロセスの紹介。

(3.1) filterSelectorParameters 呼び出し:
フィルターにユーザーが設定する必要があるパラメーターがある場合、パラメーターを場所に保存する必要があります。次に、第 3 パラメータのデータにアドレスを設定します。 PS はこのパラメータを NULL に初期化します。この呼び出しが行われるかどうかは、ユーザーの呼び出し方法によって異なります。フィルターが呼び出されたばかりの場合、ユーザーは同じパラメーターを使用してこのメ​​ニューを使用できます (この時点ではダイアログ ボックスは表示されません)。ユーザーが新しいパラメータを設定して要求するまでの時間)、再度呼び出します。この呼び出しは、ユーザーが最後のフィルター コマンドで呼び出した場合には発生しません。 (上の写真に参加)。したがって、パラメータが正しくないとプログラムがクラッシュする危険性がある場合は、毎回パラメータをチェック、検証、および初期化する必要があります。
注意! : 異なるサイズの画像に同じパラメータを使用できるため、パラメータが画像サイズに依存しないようにする必要があります。たとえば、パラメータは画像の幅や高さに依存すべきではなく、通常はパラメータとしてパーセンテージまたはスケール係数を使用する方が適切です。
したがって、パラメーター データ ブロックには次の情報が含まれている必要があります:
1. フィルターがこれがパラメーター データであることをすぐに確認できるようにするための署名。
2. 署名を変更せずにプラグインを自由にアップグレードできるようにするためのバージョン番号。
3. エンディアンネスの識別。 (クロスプラットフォーム目的) 現在使用されているエンディアンを示します。

パラメータブロック (パラメータデータブロック) とスクリプトシステム (スクリプト記述システム)
スクリプトシステムはパラメータをキャッシュし、各呼び出しタイプでプラグインに渡すために使用されるため、これを使用してパラメータを保存できますすべてのパラメータ。 Parameter ブロックが検証されたら、渡されたパラメーターからデータを読み取り、パラメーターを更新する必要があります。例:
1. まず ValidateMyParameters を呼び出して、グローバル パラメーターを確認または初期化します。
2. 次に、ReadScriptingParameters メソッドを呼び出してパラメータを読み取り、グローバル パラメータ データ構造に書き込みます。

(3.2) filterSelectorPrepare 呼び出し:
この呼び出しにより、プラグイン モジュールは ps のメモリ割り当てアルゴリズムを調整できます。この呼び出しから「最後のフィルター」コマンドが開始されます。 PS は、maxSpace (FilterRecord 構造体のメンバー (2 番目のパラメーター) です。これ以降に出現する新しいメンバーについては特に説明しません) をプラグインに割り当てることができる最大バイト数に設定します。
ImageSize、planes、filterRect メンバー:
これらのメンバーは現在定義されており (SDK 6.0 を参照)、メモリ要件の計算に使用できます。 imageSize、画像サイズ。プレーン、チャネル数。
filterRect: 四角形をフィルターします。ここで強調したいのは、PS によって定義された RECT 型である Filterrect (Windows API の RECT 構造に似ています) です。この概念は、「ディスプレイスメント フィルターの原理」に関する私の研究投稿で繰り返し言及され、強調された「選択範囲を囲む長方形」の概念でもあります。当時、私はまだ PS SDK に触れていませんでした。ここで、Photoshop のコードでは filterRect と呼ばれていることがわかります。
バッファスペース:
フィルターで 32K を超えるスペースを割り当てたい場合は、このメンバーを適用したいバイト数に設定する必要があります。 ps は、次の呼び出しが確実に成功するように、次の呼び出し (呼び出しの開始) の前にこのサイズのスペースを解放しようとします。

(3.3)filterSelectorStart 呼び出し:
この呼び出しでは、パラメーター データ ブロックを確認し、ps によって渡されたパラメーターに基づいて独自のパラメーターを更新し、必要に応じて UI を表示する必要があります。次に、データ処理プロセスに進みます。 callバック:(対応するデータを更新するためにPSを要求する)
(*AdvanceStateProc)(*AdvancestateProc)(void);たとえば、新しい処理四角形を設定してからこの関数を呼び出すと、この呼び出し後に必要な新しいデータを取得できます。このコールバックを使用すると、継続呼び出しを使用せずに、コア処理をすべて start 呼び出しで実行できます。処理が完了したら、inRect=outRect=maskRect=NULL を設定できます。このコールバックを使用しない場合は、最初の長方形領域を設定してから、 continue を使用してループ処理を呼び出します。 T たとえば、次のサイクルを使用して、画像処理全体が終了するまで画像を処理できます。





advanceStateコールバックの例

Actipro CodeHighlighter(フリーウェア)によって生成されたコード強調表示
http://www.php.cn/

-->

for()
。 .)sum=0;
//で処理シーケンス 各チャンネル
for(k=0;kg_Planes;k++)
{
//ぼかして!
sum+=bufferPixels[(j-1)*rowBytes+(i -1) *g_Planes+k];
sum
+=bufferPixels[(j-1)*rowBytes + (私)* g_Planes +k]*2;
sum
+=bufferPixels[(j-1) *rowBytes+ (i+1)*g_Planes +k];
sum
+=bufferPixels[j* rowBytes+(i -1)*g_Planes+k]*2;
    sum
+=bufferPixels[j*rowBytes+i*g_Planes +k]* 4;
合計
+= bufferPixels[j*rowBytes+(i+1)*g_Planes +k ]*2;
sum
+=bufferPixels[(j+1)*rowBytes+(i-1) *g_Planes +k];
sum
+=bufferPixels[(j+1)*rowBytes+(i) *g_Planes + k]*2;
sum
+=bufferPixels[(j+1)*rowBytes +(私+ 1)*g_Planes +k];
sum
=sum>>4 ;//即除以16
ピクセル[j*rowBytes+(i)*g_Planes +k]= 合計;
}


(5) 結論:
最後に、フィルターを使用した効果のスクリーンショットを見てみましょう: PS が起動すると、各プラグイン ディレクトリ内のプラグインがスキャンされ、対応するメニューにロードされます。
: 処理結果: Photoshop 用のサードパーティ フィルター プラグインの開発の概要

Photoshop 用のサードパーティ フィルター プラグインの開発の概要 最後は、このフィルターの圧縮パッケージのダウンロードリンクです:
RAINDROPFILTER.RAR
インストール方法は、ファイルを解凍して Photoshop のフィルターインストールディレクトリに置きます。たとえば、Photoshop CS の場合は、フィルターのインストール ディレクトリは次の形式になっている可能性があります:
"C:Program FilesAdobePhotoshop CS Plug-in Filter"
PS SDK については、Adobe 公式から入手できますが、現時点では無料かどうかはわかりません。 。 。 。 。 。

(6) 参考文献:
(1) Photoshop SDK 6.0。
(2)Photoshop SDK CS。
(3) (雨滴フィルター アルゴリズム) フィルター: 雨滴:
http://www.php.cn/

---------------------- ---------- -------------------------------------- ---------- ------
付録: Adob​​e SDK からの声明!
------------------------------------------------- ------------------------

// アドビ システムズ社
// 著作権 1993 - 2002 アドビ システムズ社// 全著作権所有
//
// ADOBE Systems Inc.
// 著作権 1993 - 2002 Adob​​e Inc.
// 全著作権所有。
//
// 注意: Adob​​e は、このファイルをソースから受け取った場合
// に付随する Adob​​e ライセンス契約の条項に従って、このファイルを使用、変更、配布することを許可します
/。 / Adob​​e 以外の場合、使用、変更、または配布には
// 事前に Adob​​e の書面による許可が必要です。
//
// 注: Adob​​e は、対応する Adob​​e 使用許諾契約の条件に従って、使用を許可します。 , この文書を修正して配布します。
// このファイルを Adob​​e 以外の当事者から入手した場合、使用、変更、配布するには、事前に署名した Adob​​e ライセンス契約が必要です。
//----------------------------------------------- --- --------------------------------


サードパーティの開発についてさらに詳しく紹介Photoshop 用フィルター プラグイン 関連記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。