ホームページ  >  記事  >  ウェブフロントエンド  >  Photoshop フィルター開発入門 -- Photoshop コールバック関数

Photoshop フィルター開発入門 -- Photoshop コールバック関数

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

前回の記事では、Photoshop フィルター プラグインを開発するための最も基本的な概念と基礎をいくつか紹介しました。 Ps プラグインのアプリケーションのニーズを満たすために、プラグイン用の多数のコールバック関数 (またはサービス) も提供されます。たとえば、フィルターは、通話後に最新のユーザーが設定したパラメーターを保存し、次の通話または UI の表示に適用できます。これは、Ps のコールバック関数を通じて行われます。この記事では、最も重要な PS コールバック関数のいくつかについて説明します。この記事を理解すると、コールバック関数を使用して、フィルター パラメーターの保存などの必要な作業を完了できるようになります。この記事は最初の記事よりもはるかに複雑で詳細なものになりますが、同時に、この記事からは、慎重なシステム設計、完璧なインターフェイス、複雑な動作メカニズムなど、PS の内部秘密を垣間見ることもできます。

(1) コールバック関数の分類:
Ps のコールバック関数は、取得場所により 2 種類に分けられます:
(1) Direct Callback: (直接呼び出せるコールバック関数)
これらのコールバック関数は FilterRecord Direct メンバーであり、FilterRecord パラメーターから直接取得できます。たとえば、AdvanceStateProc (データの更新)、TestAbortProc (テスト ユーザーのキャンセル) などがこのカテゴリに分類されます。
(2)コールバックスイート:(コールバック関数セット)
- ボディ(struct)、filterRecordから特定のコールバック関数セットを取得し、その中の関数を呼び出すことができます。 MP OutCemp OutMP Out Out Out oftototototototototomp Outforce Outforce Part Universityアカウント大学クエスト
UI Hook Suite: UI 操作に関する機能群。
チャネル ポート スイート: チャネル ポートの読み取りと書き込み。PS 内の実際の選択データの読み取りと書き込みに使用されます。コピーコピーの代わりに。
記述子スイート: スクリプト記録システムに使用される記述子操作セット。これ自体に「読み取り」と「書き込み」の 2 つのサブスイート (サブ機能セット) が含まれています。

Color Space Suite: カラースペースサービス (カラー変換など)。
ハンドル スイート: ハンドル管理 (PS カプセル化されたハンドルとメモリ管理、バッファ スイートと同様)。 エラー スイート: エラー メッセージを受信して​​ユーザーに表示します (さまざまな種類のエラー メッセージ文字列を受信します)。 GetFileList スイート: ファイル リストを取得します (ファイルを取得する、ブラウザーを呼び出して Web を閲覧するなど)。
GetPath Suite: パスを取得します。
ZString Suite: 文字列処理をカプセル化します。 O たとえば、UI HOOK Suite は、UI に関連する一連のコールバック関数を提供します。最初のバージョンは次のように定義されました:

UI Hooks Suite Version1
#define kPSUIHooksSuiteVersion1 1 // スイートバージョン eTypeDef Struct
{ processeventProc processevent; ProgressProc プログレスバー MAINAPPWINDOWIWPROC MAINAPPWINDOW; HosttickCountProc TickCo; unt;
PluginnamePluginname;




いくつかのコールバックに注意してください。関数は直接コールバックであり、testAbout や displayPixels などのスイートに保存されます。初期の頃は、これらの関数ポインターが FilterRecord に追加されていたと推測しますが、アップグレードとともにコールバック関数がどんどん追加され、FilterRecord が継続的にアップグレードしてメンバーを追加することになり、メンテナンスが困難になるため、Adobe はコールバック関数を追加し始めました。分類はいくつかのスイートに分割され、そのスイートのみが FilterRecord に配置されます。このように、関数を追加するときは、それを対応するスイートに追加し、FilterRecord に影響を与えることなくスイートをアップグレードするだけで済みます。このように、一部の初期コールバック関数は、FilterRecord とそれらが属するスイートの 2 つの場所に同時に配置され、直接呼び出すことも、対応するスイートを通じて呼び出すこともできます。


(2) Suite PEA (プラグイン関数セット管理モジュール(レイヤー)、私の翻訳名、検討中)
Suite PEA は、一部の Adob​​e シリーズのソフトウェアで使用されるプラグイン システムです。ホスト プログラムの管理 コア層は、プラグインの標準インターフェイスを提供します。有 直接呼び出しは少し異なります。使用前に関数セットを使用してリクエストを取得し、使用後にスイートを解放する必要があります。したがって、次の形式でコールバック関数セット内の関数を呼び出します:

スイートの取得とリリース
ADMBasicSuite *sADMBasic;

/ /ADMBasic Suite を取得:
filterParamBlock->sSPBasic->AcquireSuite( ,
kA DMBasicSuiteVersion、
//
電話

sADMBasic
- >beep();


(3)より重要なコールバック関数のいくつかの紹介これらのコールバック関数の場所と使用法を簡単に紹介します。

3.1
DisplayPixelsProc( ) 機能: 指定されたDC上の指定された位置のピクセルデータを出力(絵を描く)します。 (もちろん、この関数は実際に自分で完成させることもできます。) 場所: ダイレクト コールバック、UI フック スイート; 定義:

OSERr (*DisplayPixelsProc) (const PSPixelMap *source,
const VRect *srcRect、int32 dstRow、int32 dstCol、 ️次のように定義されるポインター:
PSPixelMap Struct Define



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

-->typedef
struct //記述子パラメータ構造を取得します:
PIDescriptorParameters* descParams =gFilterRecord - >descriptorパラメータ;
if (descParams == NULL) return err;

// "read" サブ関数セットを取得します:
Read DescriptorProcs * readProcs =gFilterRecord->descriptorParameters->readDescriptorProcs;
if(readProcs == NULL) return err;

/ /「書き込み」サブ関数セットを取得します:
WriteDescriptorProcs* writeProcs = gFilterRecord-> descriptorParameters -> writeDescriptorProcs;
if (writeProcs == NULL) return err;


2 つのサブ関数セットを取得した後、対応するサブ関数セットの下の関数を呼び出して、パラメーターを「読み取り」および「書き込み」することができます。 2 つのサブ関数セットの使用は、レジストリ操作に似ています。読み取りと書き込みを行う前に、まず対応する記述子を開く必要があります。したがって、最初に開始記述子操作と終了記述子操作を導入します。
PIDescriptorHandle を持つ: 記述子ハンドル、レジストリのキーと同様に、後続の操作でデータの読み取りと書き込みで使用します。 DescriptorKeyIDArray: uint32 配列。クエリが必要なキー セットを格納します。関連する定義は次のとおりです:



typedef unsigned long DescriptorKeyID


配列内の要素は、クエリするパラメータ名です。つまり、どのキーをクエリするかです。 ?なお、int32型のため、各キーには4文字で表されるASCIIコードが入りますが、4バイト未満の場合はスペースで埋めても構いません。たとえば、このパラメータ割り当てを設定すると、{'Pam1','Pam2',NULL} を設定できます。これは、2 つのパラメータ 'Pam1' と 'Pam2' をクエリする必要があることを意味します。たとえば、スクリプト システムでは、ガウスぼかし (
GaussianBlur) フィルターのキーは 'GsnB' です。 各キーの値は GetKeyProc() を呼び出して取得され、値が返されるたびに、この文字列配列内の対応するキーが空に設定されます ('この関数は書き込み記述子を閉じ、新しい記述子ハンドルを作成します。新しい記述子をホスト プログラムに返すには、新しい記述子を PIDescriptorParameteres に設定する必要があります。ここでの関数の動作は、GDI 操作の SelectObject に似ています。 GDI 操作では、デバイス コンテキストに新しいプロパティを設定すると、既存のプロパティが返され、バックアップの作成が求められます。関数 子 2 つのサブ関数は、データのデータの読み取りと書き込みを行います。

ここでは多くの関数があるため、1 つずつ説明しません。これは、近似形式の紹介にすぎず、説明します。必要な場合は別途。 ️ほとんどの関数は比較的標準化された特性を持っています (いくつかの関数には例外形式があり、これについては後で別途紹介します)。つまり、読み取りは Get で始まり、書き込みは Put で始まり、最初のパラメーターは対応する記述子で、2 番目のパラメーターはクエリ結果の対応するタイプのデータ ポインタを受信するために使用されます (または書き込まれたデータを保存するために使用されます)。クエリする必要があるデータ型が TypeName であると仮定すると、次のようになります:
(* Pput
Typename


Proc) (PiwritedDescriptor Descriptor,
DescriptorKeyid, Typename *Dest); // 書き込み: 以下にすべてのサブ関数セットの関数をリストし、サブ関数セットを書き込みます (Piator.h で定義されています): 記述子サブスイートの読み取り
Actipro CodeHighlighter によって生成されたコードの強調表示 (フリーウェア)http://www.php.cn/-->//Read サブ関数セット メンバー

typedef

structReadDescriptorProcs
{//Write サブ関数セット メンバー, 形式は前の関数と似ていますが、どちらも追加のキーが必要です
typedef struct WriteDescriptorProcs
{
int16 writeDescriptorProcsVersion;
int16 numWriteDescriptorProcs;
OpenWriteDescriptorProc openWriteDescriptorProc;
CloseWriteDescriptorProc closeWriteDescriptorProc;
PutIntegerProc putIntegerProc;
PutFloatProc putFloatProc;
PutUnitFloatProc putUnitFloatProc;
PutBooleanProc putBooleanProc;
PutTextProc putTextProc;
PutAliasProc putAliasProc;
PutEnumeratedProc putEnumeratedProc;
Put ClassProc putClassProc;
PutSimpleReferenceProc putSimpleReferenceProc ;
PutObjectProc putObjectProc;
PutCountProc putCountProc;

/* Scoped クラスは Photoshop 4.0 のプラグインでは使用できません */ PutScopedClassProc putScopedClassProc;
PutScopedObjectProc putScopedObjectProc
} WriteDescriptorProcs;
️パラメータのデモ コードを読む


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

= NULL; 読み取り演算子
OSERr err = noErr;
PIWriteDescriptor トークン
= NULL;
PIDescriptorHandle h;
const
double param1 = 1.05;

PIDescriptorParameters
* descParams = gFilterRecord->descriptorParameters;
if (descParams == NULL) return えー;

WriteDescriptorProcs
* writeProcs = gFilterRecord->descriptorParameters->writeDescriptorProcs NULL)
return err;トークン= writeProcs->
openWriteDescriptorProc() ;
if (トークン != NULL)
writeProcs->putFloatProc( トークン, 'PAM1', &
Param1);
// 記述子を解放します
gfilterRold- & gt; handleProcs- & gt;
disposeproc (descparams
- & gt;
記述子); descParams-> ;記述子= h ;
}

3.3 DescriptorRegistry suite: (ディスクリプタ登録関数セット)
ディスクリプタ登録関数セットは、主にディスクリプタの登録と取得に使用されます。これにより、フィルターが複数回呼び出される間、パラメーターを保存するために ps を委託することができます。これには、登録、削除、およびキーの取得のためのいくつかの主要な機能が含まれています。
登録()登録()
。 ️ / PIActionDescriptor 記述子、//記述子ハンドル
/* IN * / Boolean isPersistent // 保存と復元ができるように PS メンテナンスを委託するかどうか
(
) /* IN */ const char* key // 一意の文字列 またはID );

Get()

説明: キーを返します。返された記述子はコピーであるため、使用後に積極的に解放する必要があります。
/* OUT */ PIActionDescriptor* descriptor // 使用後に解放する
);


3.4 ActionDescriptor suite: (アクション記述子関数セット)



アクション記述子関数セット、 キー (またはオブジェクトの保存に使用) ) を記述子に取り込み、記述子からそれらを読み取り、他の記述子が管理します。この関数セットには読み取り関数と書き込み関数の両方が含まれており、使用方法は前のセクションの記述子と同様です。次のように定義されています。ActiproCodeHighlighter(フリーウェア)によって生成された


psactionDescriptOrProcsstruct




codeハイライト
http://www.php.cn/--> orProcs
{ //
ALLOCATES: descriptor

SPAPI OSERr (*
Make)(PIActionDescriptor
/ /
パラメーターとregister
SPERr WriteRegistryParameters(
void){ SPErr err

=
noErr;
//
に使用される SPBasicSuite を取得します他のスイートベーシックを入手
SPBasicSuite
*basicSuite= gFilterRecord->sSPBasic;
/ /
ディスクリプタ登録関数セット
PSDescriptorRegistryProcs
* registryProcs = NULL;
//
記述子関数セット ポインター
PSActionDescriptorProcs
* de scriptorProcs = NULL;
/ /
記述子 ハンドル
PIActionDescriptor 記述子
= NULL;
//
パラメータ
dou ble param1=0.1;

/ /
ディスクリプタ登録関数の取得set
エラー
= Basicsuite- & gt; acquiresuite (KPSDescriptorRegistrySuite、 KPSDescriptorRegistrySuVersion、

Void)
* *)&registryProcs); kPSActionDescriptorSuiteVersion、**)&
descriptorProcs); ->Make(&descriptor);
//パラメータを書き込みます
err = descriptorProcs->PutFloat(descriptor, 'Pam1'
,param1);
//指定されたID エラー = registryProcs ->Register (plugInUniqueID, descriptor, true); descriptorProcs-> ;Free(descriptor); //
関数セットを解放
if ( registryprocs!=null)basicsuite->パラメーターの読み取りの例:

登録されたパラメーターを読み取る
// 登録されたパラメーターを読み取る
SPERr ReadRegistryParameters(void)
{
SPER err
= noErr;
// 基本関数セットを取得、SPBasicSuite、関数セット
SPBasicSuite* BasicSuite = gFilterRecord->sSPBasic;
PSDescriptorRegistryPro cs
* cs = NULL;
PSActionDescriptorProcs
* descriptorProcs = NULL;
PIActionDescriptor 記述子
= NULL;
double param1;

//記述子登録関数セットを取得
エラー= basicSuite ->AcquireSuite(kPSDescriptorRegistrySuite,

const
v oid**)&レジストリProcs);

//
アクションを取得記述子関数セット
エラー
=basicSuite->AcquireSuite(kPSActionDescriptorSuite, kPSActionDescriptorSuiteVersion,

)
&descriptorProcs);
// 指定された ID の記述子を取得します
err = registryProcs->Get(plugInUniqueID, & 記述子);
//読み取り登録されたパラメーター
エラー
= descriptorProcs->GetFloat(descriptor, 'Pam1',& param1);
// リリース記述子
if (記述子 != NULL)
descriptorProcs
->Free(記述子);
リリース記述子登録関数セットIfre(registryProcs) ! = null) Basicsuite
- & GT; ReleaseSuite (KPSDescriptorRegistrysuite, KPSDescriptorRegistRYEVEREVERION); // リリースアクション記述子関数セット
if
(descriptorProcs !=

null)
basicsuite->releasesuite(kpsactiondesc riptorsuite、sclowプラグインパラメーター構造では、直接コールバック関数と呼ばれます。他のタイプは、コールバック関数と呼ばれますコールバック関数セット。 直接コールバック関数の場合、テキストでは、DisplayPixelsProc を使用してデバイス DC に画像をマッピングできることのみが説明されています。最初の記事で説明した AdvanceStateProc、TestAbortProc、UpdateProgressProc を含め、これらはすべてダイレクト コールバックであり、一部のダイレクト コールバック関数は特定のスイートに属しています。
コールバック関数セット (コールバック スイート) については、コールバック関数セットの記述子スイートでの読み取り、書き込み、登録、およびその他の操作に焦点を当てました。この関数セットにより、PS はフィルター パラメーターをアクション シーケンスに記録できるようになります。また、フィルター パラメーターを登録して、複数の呼び出しにわたって保存および読み取りを行うこともできます。メモリ管理、色空間サービス、その他の関数セットなどの他のコールバック関数セットについては、スペースの制限のためまだ説明していません。 (--byhoodlum1980)
Photoshop フィルター開発の入門 -- Photoshop コールバック関数関連の記事については、PHP 中国語 Web サイトに注目してください。

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