このドキュメントは、Image Mixerで使用する画像プロセッサパッケージを開発するプログラマの皆様に、Image
Mixerプロセッサの仕様情報と開発手順を提供するものです。不明な点がございましたら、Eizawaまでメールでご連絡ください。ドキュメントの製作にはNetscape
Composer 4.7を使用しました。なお、開発に際して発生したいかなる損害にも、Eizawaはその責を負いません。
−written by Eizawa. last update 2/xx/2001
目次
1.開発環境
1.1 開発に必要な環境
1.2 PDKファイルのインストール
2.開発手順1−テストベンチを用いた作業
2.1 プロセッサの仕様(概略)を確認
2.2 テストベンチにプロセッサを追加
2.3 クラス名を変更する
2.4 パラメータを実装する
2.5 プレビュー許可を変更する場合
2.6 ユーザーインターフェイス処理で入力画像を使用する場合
2.7 サイズを変更するフィルタの場合
2.8 プロセッサ処理を記述する
2.9 テストベンチを実行し、デバッグする
3.開発手順2−Image Mixerを用いた作業
3.1 パッケージを作成、または既存のパッケージのプロセッサを追加する
3.2 パッケージをビルドする
3.3 Image Mixerを実行し、動作を確認する
4.クラス等の仕様
5.Tips
6.配布について
7.変更履歴
まず、Image Mixerプロセッサの開発を行うために用意する必要のある環境について説明します。次に、このPDKに含まれるソースコード等のうち、開発環境での設定が必要なものについて説明します。2.開発手順1−テストベンチを用いた作業
開発にはBorlandのDelphi4が必要です。プロセッサパッケージをDelphi/C++Builderのパッケージライブラリ(*.bpl)としたためにこのような制限があります。私はDelphi5を持っていないため試していませんが、Delphi5を使用した場合は、異なるバージョンのVCLパッケージを同一プロセスでロードすることになり、干渉して動かないものと思われます。また、C++Builder4も使用可能と思いますが、IMProc.pasをC++で書き直す必要があります。で、してません(笑)。誰か書いて…
参考までに、作者Eizawaの環境を記しておきます(2001年2月現在)。
・Delphi4J+UpdatePack3
・Windows2000+SP1
・自作K6-3機メモリ256MB
・1280*1024*32bitこのPDKを(ディレクトリ付きで)展開すると、srcディレクトリに開発に必要なソースコード等があります。これらのファイルは、開発するプロセッサのDelphiプロジェクトファイルと同じディレクトリにコピーしてください。
ソースファイルのうち、IMFltFrm.pas、IMMxrFrm.pas、IMGnrFrm.pasはプロセッサのテンプレートです。これら3つのファイル(に対応するフォーム)をDelphiのリポジトリに登録してください。プロセッサを製作するとき、これらのテンプレートのコピーを基に作業をすることになります。また、設計時パッケージIMPrcDef.dcpをインストールしてください。プロセッサの基本クラスの定義(IMProc.pas)が入っています。
開発は2つのステージに分かれます。まず、1つめのステージで中核の処理部分とユーザーインターフェイス部分を完成させ、2つめのステージでスクリプトやプレビューなどのデバッグを行います。開発時のホストアプリケーションは、1つめのステージでは専用のテストベンチ(PDKに収録)、2つめのステージではIM.exeを使用します。IM.exe使用時は(たぶん)統合デバッガが使えず、開発が困難になるために2段階の開発形態になっています。3.開発手順2−Image Mixerを用いた作業
#ちなみに、私もこの形態です。IM.exeが統合環境から実行できないので(IM用カスタムコンポーネントのパッケージが干渉か?)。
注:メソッドをオーバーライドする際は、特に指定がない限り元のメソッドを呼び出す必要はありません。以下、1つめのステージ−テストベンチ上での作業手順−を説明します。IMBench.dprがテストベンチのプロジェクトファイルです。
最初に、これから作るプロセッサについて、以下の点を確認します。これらによって、今後の作業内容が変化します。
- 処理を実行するときに入力画像がいくつ必要か? 入力画像の数でプロセッサのジャンルが決まり、0:ジェネレータ、1:フィルタ、2:ミキサー、3以上:実装不可(笑)、となります。それぞれ、使用するテンプレートが異なります。
- パラメータは必要か? 画像以外の入力が必要な場合は、ユーザからの入力を受けるインターフェイスが必要です。また、スクリプト関係の実装が少々面倒になります。
- プレビューは可能か? プレビュー時は、実際の画像とは異なる大きさの画像が処理対象になります。よって、画像サイズに依存する処理の場合はプレビューできません。パラメータの値に依存する場合もあります。デフォルトでは常にプレビュー可能になります。変更する場合は関数をオーバーライドします。
- UIの処理に画像が必要か? 画像またはそこから得られる情報をユーザに提供したい場合があります。この場合は別の画像が選択された場合のイベントハンドラを実装する必要があります。また、現在の画像を所得するメソッドも用意してあります。
- サイズを変更するフィルタか? フィルタ処理で元画像と異なるサイズの画像を出力する場合は、メソッドをオーバーライドして出力したいサイズを指定する必要があります。
IMBenchプロジェクトを開き、プロセッサを追加します。新しいプロセッサのジャンル(ジェネレータ・フィルタ・ミキサーのいずれか)を確認し、「ファイル」−「新規作成」で対応するテンプレートを指定すると新しいフォームが作成されます。このとき、「コピー」を指定します。テストベンチは同じジャンルのプロセッサを1つずつしか扱えないので、既存の同ジャンルのユニットはプロジェクトから削除しておきます。
次に、テストベンチで使用する入力画像を読み込んでおきます。ジェネレータの場合は当然必要ありませんが、フィルタは入力画像1、ミキサーは入力画像1と2の両方のTImageにビットマップを読み込んでおきます。フォームとプロセッサのクラス名を変更します。最初にオブジェクトインスペクタでフォームの名前を変更し、残りは、参照している個所が多いので置換機能を使いましょう。フォーム名を置換するときは、インスタンス名(Tが付かないほう)をキーに指定します。プロセッサ名はクラス名(T付き)で置換すればOKです。次に、メニュー用のアクションの名前を変更します。また、フォームのFormCreateハンドラにスクリプトで使用するプロセッサ名と処理後にタイトルバーに表示する内容を指定します。
パラメータが必要な場合は、パラメータクラスのコメントアウトを解除し、クラス名を置換します。また、CreateParamPackメソッドの変数型とインスタンスの型を修正します。ここでの作業は、パラメータが必要な場合のみ行うものです。
最初に、どんなパラメータが必要か確認し、パラメータクラスにデータフィールド(変数)を宣言します。ただし、このときに使用できる型は、Integer、Boolean、Single、Double、Stringのみです。これは、スクリプトで扱える型が上記のもののみであるためです。配列や構造体も使えません。
次に、グローバル変数のCurPackの宣言およびinitialization部とfinalization部の生成・開放処理のコメントアウトを解除します。
次に、パラメータを操作するメソッドを定義します。フィルタクラスのコメントアウトされたメソッドのうち、MakeList、GetParams、UpdateParam、ApplyParamを宣言します。MakeListとGetParamsの定義はコメントアウトされているので、解除して実装します。UpdateParamとApplyParamの定義は新しく作成します。また、CreateParamPackにもコードを記述する必要があります。以下にそれぞれのメソッドで実装すべき処理を説明します。
CreateParamPack:最初に、変数Packの型が先ほどのパラメータクラスになっているか確認し、なっていなければ修正します。追加すべき処理は、グローバルオブジェクトCurPackから新しく作ったPackへデータをコピーすることです。
GetPartams:CreateParamPackとは逆の処理になります。つまり、引数のPackからCurPackへデータをコピーします。
MakeList:スクリプト実行時にパラメータにアクセスするための、名前とポインタを対応付けるリストを生成します。
UpdateParam:フォーム上のコンポーネントからCurPackへ値を読み込みます。
ApplyParam:UpdateParamの逆、CurPackからフォームへ値を設定します。
最後に、パラメータの保存・復帰処理を記述します。initialization部とfinalization部にINIファイルの読み込み・書き込み処理を記述します。INIファイル名とセクション名の書き換えを忘れずに。
パラメータが変更されてプレビュー画像を更新したい場合は、UpdatePrevImgメソッドを呼びます。ただし、この機能はテストベンチでは動作しません。(プレビュー機能自体がないので)デフォルトでは常にプレビューが可能ですが、画像サイズに依存する処理の場合は正しいプレビューが得られないため、この作業を行う必要があります。
まず、プロセッサ宣言のCanPreview関数のコメントアウトを解除します。
CanPreviewの定義は、常にプレビュー不可の場合は
Result := False;
だけでOKです。プレビューの可否に条件がある場合は、その条件を判定します。
2.6 ユーザーインターフェイス処理で入力画像を使用する場合ユーザーがパラメータを入力する際に画像を表示する必要がある場合、この作業を行います。Image Mixer標準のプロセッサでは、アフィン変換やヒストグラム平坦化などがこの機能を使用しています。
まず、新しい画像が選択された場合の処理を記述します。OnImageChangeメソッドをオーバーライドし、必要な処理を記述します。
フォーム上のコンポーネントのイベントハンドラなどで画像を使用したい場合は、
フィルタ:GetCurrentImage
ミキサー:GetFGImage、GetBGImage
を使用してください。これらの関数はnilを返す場合があるので注意します。ミキサーのOnImageChangeもnilパラメータで呼び出される場合があります。
この機能はテストベンチでは利用できないため、デバッグはIM.exeを使用します。フィルタに限り、出力画像のサイズを自由に変更することができます。変更する場合は、InitSizeをオーバーライドします。参照引数Sizeには入力画像のサイズが入っているので、出力画像のサイズを計算して書き換えます。
なお、サイズを変更する場合は必ずプレビュー不可にしてください。最後に、プロセッサ本来の画像処理を記述します。画像は全て32bit/pixelです。ピクセルの上位8bitはImage Mixer本体がアルファチャンネルに使用します。処理中に画像サイズを変更しないでください。
フィルタの場合:Filterメソッドの中に処理を記述します。引数はSrcが入力画像、Destが出力画像です。出力画像のサイズは設定済みです。
ミキサーの場合:Mixerメソッドに処理を記述します。引数はSrc1が背景画像、Src2が前景画像、Destが出力画像、Orgが合成範囲の左上座標です。画像の大きさは、2つの入力画像は合成範囲と同じ大きさで、出力画像は「重ならない部分を捨てる」のチェックの有無により異なり、
チェック有り:出力画像は合成範囲と同じ大きさで、Orgは常に(0,0)
チェック無し:出力画像は背景画像と同じ大きさ(合成範囲より大きい)で、Orgに合成範囲の位置(左上隅の出力画像上の座標)が入る
となります。Orgによる座標値の修正についてはミキサーサンプルのコードを参照してください。
ジェネレータの場合:Generatorメソッドに処理を記述します。引数Destは出力画像で、すでにサイズが設定されています。
処理中にはプログレスイベントを発生させるようにしてください。Progressメソッドに現在の進行状況を0〜1の小数値で渡します。ここまでの作業でコーディングは終了です。お疲れ様でした。
テストベンチをビルド・実行し、製作したプロセッサの動作を確認します。このとき、テンプレートはProcLibフォルダにINIファイルを置くようになっているので、変更しない限り、フォルダを作らないとエラーが発生します。
処理を実行し、意図したとおりの結果が得られるようになったらテストベンチでの作業は終了です。
第2ステージは、パッケージを作成してIM.exe上で実行し、テストベンチにはないスクリプトやプレビューなどの機能を中心に、最終的なデバッグを行います。4.クラス等の仕様3.1 パッケージを作成、または既存のパッケージのプロセッサを追加する
パッケージファイルのテンプレート(MyPrcPak.dpk)がこのPDKに同梱されていますので、リネームしてプロセッサのユニットを追加します。すでにパッケージを作ってある場合は、そこに追加します。出力ディレクトリをImage MixerのProcLibフォルダに設定するとデバッグ時にコピーの手間が省けます。パッケージをコンパイルし(インストールではありません)、出力された.pblファイルをImage MixerのProcLibフォルダにコピーします。デフォルトの設定では、.bplファイルはDelphiのLibフォルダに出力されます。IM.exeを実行し、プロセッサの動作を確認します。プロセッサがロードされている(はず)ので、実行して動作を確認します。また、スクリプトからも正常に実行できることを確認します。
正常動作するようになったら完成です。
(未製作)5.Tips
(未製作)6.配布について
プロセッサパッケージの配布はご自由にされて結構です。通常は製作した.bplファイルのみを配布すればOKですが、VCL40とIMPrcDef以外のパッケージが必要な場合(パッケージのRequiresに上記2つ以外のパッケージがある場合)は、そのパッケージも配布してください。7.変更履歴
また、ユーザがスクリプトでプロセッサを使用するために必要な、プロセッサ名とパラメータ名を公開してください。
現在(2001年2月)、Image Mixerがβ版のため再配布禁止としております。よって、Image Mixer本体を同梱しての配布はご遠慮ください。