(57)【特許請求の範囲】
【請求項１】
互いに共通の関数名が付与され複数種の異なる画像処理クラスに固有の引数が指定された関数を用いて各画像処理クラスを実体化した処理モジュールを、呼び出されたときに生成する複数のモジュール生成手段と、
生成されたときに前記モジュール生成手段を呼び出すと共に引数型不定のポインタ形式で指定された引数を前記モジュール生成手段で使用可能な引数型で且つ形式で前記モジュール生成手段に渡すラッパーを、呼び出されたときに生成する複数のラッパー生成手段と、
前記画像処理クラスを実体化した処理モジュールを複数連結させて一連の画像処理を実行させるための画像処理情報から、各処理モジュールに対応する画像処理クラスのクラス名及び前記固有の引数を抽出する抽出手段と、
前記抽出されたクラス名を予め定められた規則によって変換し、該変換された名称が付与された前記ラッパー生成手段を呼び出す呼出手段と、
前記抽出された引数を配列に格納し、前記引数を格納した配列の先頭アドレスを引数型不定のポインタ形式で指定して前記生成されたラッパーに渡す引数処理手段と、
を備えた画像処理装置。
【請求項２】
前記ラッパー生成手段には、対応する前記モジュール生成手段で使用可能な引数の引数型及び形式が予め定義されており、前記ラッパー生成手段は、呼び出されたときに、前記関数名の関数をメソッドに持つテンプレートクラスを前記定義に応じて実体化することにより前記ラッパーを生成する
請求項１に記載の画像処理装置。
【請求項３】
前記ラッパー生成手段は、関数名が共通で引数型及び形式の少なくとも一方が異なる複数の関数が使用可能な関数として規定されているモジュール生成手段に引数を渡すラッパーを生成する場合には、前記テンプレートクラスを前記定義に応じて実体化することにより前記複数の関数の１つに対応するラッパーを生成する
請求項２に記載の画像処理装置。
【請求項４】
前記テンプレートクラスを、前記モジュール生成手段に渡す引数の個数に対応して設けた
請求項２又は請求項３に記載の画像処理装置。
【請求項５】
前記生成された処理モジュールが連結されて構築された画像処理手段により前記一連の画像処理が実行されるように制御する制御手段と、
を更に備えた請求項１〜請求項４のいずれか１項記載の画像処理装置。
【請求項６】
コンピュータを、
互いに共通の関数名が付与され複数種の異なる画像処理クラスに固有の引数が指定された関数を用いて各画像処理クラスを実体化した処理モジュールを、呼び出されたときに生成する複数のモジュール生成手段、
生成されたときに前記モジュール生成手段を呼び出すと共に引数型不定のポインタ形式で指定された引数を前記モジュール生成手段で使用可能な引数型で且つ形式で前記モジュール生成手段に渡すラッパーを、呼び出されたときに生成する複数のラッパー生成手段、
前記画像処理クラスを実体化した処理モジュールを複数連結させて一連の画像処理を実行させるための画像処理情報から、各処理モジュールに対応する画像処理クラスのクラス名及び前記固有の引数を抽出する抽出手段、
前記抽出されたクラス名を予め定められた規則によって変換し、該変換された名称が付与された前記ラッパー生成手段を呼び出す呼出手段、及び
前記抽出された引数を配列に格納し、前記引数を格納した配列の先頭アドレスを引数型不定のポインタ形式で指定して前記生成されたラッパーに渡す引数処理手段、
として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、画像処理装置及びプログラムに関する。
【背景技術】
【０００２】
特許文献１には、コントローラが管理サーバに対し、クライアントモジュールとその連携対象となるサービスモジュールとを仲介するアダプタの生成を要求する際に、クライアントＡＰＩ定義及びこの定義に対応する意味情報として、上記サービスモジュールを特定する機器ＩＤを管理サーバへ送信すると、管理サーバが、コントローラから受信した機器ＩＤに基づいて、サービスモジュールのＡＰＩの仕様を定義するサービスＡＰＩ定義を選択し、選択したサービスＡＰＩ定義と受信したクライアントＡＰＩ定義とに基づいてアダプタを生成し、クライアントへ送信するモジュール間連携支援システムが開示されている。
【０００３】
また特許文献２には、外部ＰＣからの、画像処理に関する処理要求を含むＸＭＬデータを受け付けて、それを制御層のＡＰＩに対応するコマンドに変換して制御層に渡す機能を有する外部ＡＰＩ部を、制御層とアプリケーション層の間の位置に備える技術が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００９−２３８０４０号公報
【特許文献２】特開２００５−０８００１８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明は、ラッパーを使用しない構成に比べて、小規模なシステムで新規機能の追加が可能となり、大規模なシステム変更を行わずにすむ画像処理装置及びプログラムを得ることを目的とする。
【課題を解決するための手段】
【０００６】
請求項１の発明は、互いに共通の関数名が付与され複数種の異なる画像処理クラスに固有の引数が指定された関数を用いて各画像処理クラスを実体化した処理モジュールを、呼び出されたときに生成する複数のモジュール生成手段と、生成されたときに前記モジュール生成手段を呼び出すと共に引数型不定のポインタ形式で指定された引数を前記モジュール生成手段で使用可能な引数型で且つ形式で前記モジュール生成手段に渡すラッパーを、呼び出されたときに生成する複数のラッパー生成手段と、前記画像処理クラスを実体化した処理モジュールを複数連結させて一連の画像処理を実行させるための画像処理情報から、各処理モジュールに対応する画像処理クラスのクラス名及び前記固有の引数を抽出する抽出手段と、前記抽出されたクラス名を予め定められた規則によって変換し、該変換された名称が付与された前記ラッパー生成手段を呼び出す呼出手段と、前記抽出された引数を配列に格納し、前記引数を格納した配列の先頭アドレスを引数型不定のポインタ形式で指定して前記生成されたラッパーに渡す引数処理手段と、を備えた画像処理装置である。
【０００７】
請求項２の発明は、請求項１に記載の画像処理装置において、前記ラッパー生成手段には、対応する前記モジュール生成手段で使用可能な引数の引数型及び形式が予め定義されており、前記ラッパー生成手段は、呼び出されたときに、前記関数名の関数をメソッドに持つテンプレートクラスを前記定義に応じて実体化することにより前記ラッパーを生成するものである。
【０００８】
請求項３の発明は、請求項２に記載の画像処理装置において、前記ラッパー生成手段は、関数名が共通で引数型及び形式の少なくとも一方が異なる複数の関数が使用可能な関数として規定されているモジュール生成手段に引数を渡すラッパーを生成する場合には、前記テンプレートクラスを前記定義に応じて実体化することにより前記複数の関数の１つに対応するラッパーを生成するものである。
【０００９】
請求項４の発明は、請求項２又は請求項３に記載の画像処理装置において、前記テンプレートクラスを、前記モジュール生成手段に渡す引数の個数に対応して設けたものである。
【００１０】
請求項５の発明は、請求項１〜請求項４のいずれか１項記載の画像処理装置に、前記生成された処理モジュールが連結されて構築された画像処理手段により前記一連の画像処理が実行されるように制御する制御手段と、を更に設けたものである。
【００１１】
請求項６の発明は、コンピュータを、互いに共通の関数名が付与され複数種の異なる画像処理クラスに固有の引数が指定された関数を用いて各画像処理クラスを実体化した処理モジュールを、呼び出されたときに生成する複数のモジュール生成手段、生成されたときに前記モジュール生成手段を呼び出すと共に引数型不定のポインタ形式で指定された引数を前記モジュール生成手段で使用可能な引数型で且つ形式で前記モジュール生成手段に渡すラッパーを、呼び出されたときに生成する複数のラッパー生成手段、前記画像処理クラスを実体化した処理モジュールを複数連結させて一連の画像処理を実行させるための画像処理情報から、各処理モジュールに対応する画像処理クラスのクラス名及び前記固有の引数を抽出する抽出手段、前記抽出されたクラス名を予め定められた規則によって変換し、該変換された名称が付与された前記ラッパー生成手段を呼び出す呼出手段、及び前記抽出された引数を配列に格納し、前記引数を格納した配列の先頭アドレスを引数型不定のポインタ形式で指定して前記生成されたラッパーに渡す引数処理手段、として機能させるためのプログラムである。
【発明の効果】
【００１２】
請求項１に係る発明によれば、ラッパーを使用しない構成に比べて、小規模なシステムで新規機能の追加が可能となり、大規模なシステム変更を行わずにすむ。
【００１３】
請求項２に係る発明によれば、様々な引数に対応したラッパーを容易に生成できる。
【００１４】
請求項３に係る発明によれば、処理内容（関数名）は同じだがシステムに応じて引数型や形式が異なる画像処理を行う場合であっても、システムに対応したラッパーを生成できる。
【００１５】
請求項４に係る発明は、テンプレートクラスが引数の個数によらず共通の場合に比べて、ラッパーの生成が容易となる。
【００１６】
請求項５に係る発明は、小規模システムで新規機能を追加して一連の画像処理を実行できる。
【００１７】
請求項６に係る発明は、ラッパーを使用しない構成に比べて、小規模なシステムで新規機能の追加が可能となり、大規模なシステム変更を行わずにすむ。
【図面の簡単な説明】
【００１８】
【図１】本実施形態に係るコンピュータ（画像処理装置）の概略構成を示すブロック図である。
【図２】画像処理部の構成例を示すブロック図である。
【図３】ファクトリに関するオブジェクト指向モデルを示すモデル図である。
【図４】バッファモジュールが前段の画像処理モジュールに画像データを直接要求する態様におけるブロック単位処理の流れを説明する概略図である。
【図５】指示書解釈実行部の機能構成と、画像処理指示書の投入からモジュール生成部が呼び出されるまでの流れを示す模式図である。
【図６】画像処理指示書の具体例を示す図である。
【図７】指示書解釈実行部によって実行される処理の流れを示すフローチャートである。
【図８】関数名及び引数個数は等しいが、引数型が異なる３つの具象関数が定義されたモジュール生成部の各具象関数に対応して生成されるファクトリの各々を例示した図である。
【図９】（Ａ）は、引数個数が１の場合のモデル図であり、（Ｂ）は、引数個数が２の場合のモデル図であり、（Ｃ）は、引数個数が３の場合のモデル図である。
【図１０】ジェネリックファクトリクラスのコーディング例を示す図である。
【図１１】ファクトリ生成関数のコーディング例を示す図である。
【図１２】（Ａ）は、生成する処理モジュールに応じて、各モジュール生成部に応じた引数型及び形式の各々に応じて各引数を定義してハードコーディングする従来のコーディング例を示した図であり、（Ｂ）は、ファクトリを生成してモジュール生成部を呼び出す場合の本実施の形態に係るメインプログラムのコーディング例である。
【発明を実施するための形態】
【００１９】
以下、図面を参照して本実施形態の一例を詳細に説明する。図１には、画像処理装置として機能することが可能なコンピュータ１０が示されている。なお、このコンピュータ１０は、複写機、プリンタ、ファクシミリ装置、これらの機能を兼ね備えた複合機、スキャナ、写真プリンタ等のように内部で画像処理を行う必要のある任意の画像取扱機器に組み込まれていてもよいし、パーソナル・コンピュータ（ＰＣ）等の独立したコンピュータであってもよく、更にＰＤＡ（Personal Digital Assistant）や携帯電話機等の携帯機器に組み込まれたコンピュータであってもよい。
【００２０】
コンピュータ１０はＣＰＵ１２、メモリ１４、表示部１６、操作部１８、記憶手段としての記憶部２０、画像データ供給部２２及び画像出力部２４を備えており、これらはバス２６を介して互いに接続されている。コンピュータ１０が上述した画像取扱機器に組み込まれている場合、表示部１６や操作部１８としては、画像取扱機器に設けられたＬＣＤ等から成る表示パネルやテンキー等を適用することができる。また、コンピュータ１０が独立したコンピュータである場合、表示部１６や操作部１８としては、当該コンピュータに接続されたディスプレイやキーボード、マウス等を適用することができる。また、記憶部２０としてはＨＤＤ(Hard Disk Drive)が好適であるが、これに代えてフラッシュメモリ等の他の不揮発性記憶手段を用いることも可能である。
【００２１】
また、画像データ供給部２２は処理対象の画像データを供給できるものであればよく、例えば紙や写真フィルム等の記録材料に記録されている画像を読み取って画像データを出力する画像読取部、通信回線を介して外部から画像データを受信する受信部、画像データを記憶する画像記憶部（メモリ１４又は記憶部２０）等を適用することができる。また、画像出力部２４は画像処理を経た画像データ又は該画像データが表す画像を出力するものであればよく、例えば画像データが表す画像を紙や感光材料等の記録材料に記録する画像記録部、画像データが表す画像をディスプレイ等に表示する表示部、画像データを記録メディアに書き込む書込装置、画像データを通信回線を介して送信する送信部を適用することができる。また、画像出力部２４は画像処理を経た画像データを単に記憶する画像記憶部（メモリ１４又は記憶部２０）であっても構わない。
【００２２】
図１に示すように、記憶部２０には、ＣＰＵ１２によって実行される各種のプログラムとして、メモリ１４等のリソースの管理やＣＰＵ１２によるプログラムの実行の管理、コンピュータ１０と外部との通信等を司るオペレーティングシステム３０のプログラム、コンピュータ１０を本発明に係る画像処理装置として機能させるための画像処理プログラム群３４、ＣＰＵ１２が上記画像処理プログラム群を実行することで実現される画像処理装置に対して所望の画像処理を行わせる各種のアプリケーション３２のプログラム（図１ではアプリケーションプログラム群３２と表記）が各々記憶されている。
【００２３】
画像処理プログラム群３４は、前述した各種の画像取扱機器や携帯機器を開発する際の開発負荷を軽減したり、ＰＣ等で利用可能な画像処理プログラムを開発する際の開発負荷を軽減することを目的として、各種の画像取扱機器や携帯機器、ＰＣ等の各種機器（プラットフォーム）で共通に使用可能に開発されたプログラムである。画像処理プログラム群３４によって実現される画像処理装置は、アプリケーション３２からの画像処理指示書（実行する画像処理の内容を記述したファイルであって、本発明の画像処理情報に相当する。具体例は後述する）に従って構築指示に従い、画像処理を行う画像処理部を構築し、前記画像処理部によって画像処理を行うが（詳細は後述）、画像処理プログラム群３４は、所望の画像処理を行う画像処理部（所望の構成の画像処理部）の構築を指示したり、構築された画像処理部による画像処理の実行を指示するためのインタフェースをアプリケーション３２に提供している。このため、内部で画像処理を行う必要のある任意の機器を新規開発する等の場合にも、前記画像処理を行うプログラムの開発に関しては、当該機器で必要とされる画像処理を上記のインタフェースを利用して画像処理プログラム群３４に行わせるアプリケーション３２を開発するのみで済み、実際に画像処理を行うプログラムを新たに開発する必要が無くなるので、開発負荷を軽減することができる。
【００２４】
また、画像処理プログラム群３４によって実現される画像処理装置は、前述のように、アプリケーション３２からの画像処理指示書による構築指示に従い、画像処理部を構築し、構築した画像処理部によって画像処理を行うので、例えば画像処理対象の画像データの色空間や１画素当たりのビット数が不定であったり、実行すべき画像処理の内容や手順・パラメータ等が不定である場合にも、アプリケーション３２が画像処理指示書により画像処理部の再構築を指示することで、画像処理装置（画像処理部）によって実行される画像処理を、処理対象の画像データ等に応じて柔軟に変更することができる。
【００２５】
以下、画像処理プログラム群３４について説明する。本実施の形態では、画像処理プログラム群３４は、オブジェクト指向プログラミング言語により実装されている。図１に示すように、画像処理プログラム群３４は画像処理クラスライブラリ３６と、処理構築部４２のプログラムと、処理管理部４６のプログラムと、指示書解釈実行部４８のプログラムと、ジェネリックファクトリクラスライブラリ５０と、形式変換クラスライブラリ５４と、ファクトリ生成関数ライブラリ５８と、に大別される。詳細は後述するが、本実施形態に係る処理構築部４２は、アプリケーションからの指示により、例として図２に示すように、予め定められた画像処理を行う１つ以上の画像処理モジュール３８Ａと、個々の画像処理モジュール３８Ａの前段及び後段の少なくとも一方に配置され画像データを記憶するためのバッファを備えたバッファモジュール４０と、がパイプライン形態又はＤＡＧ(Directed Acyclic Graph：有向非循環グラフ)形態で連結されて成る画像処理部８０を構築する。なお、画像処理モジュール３８Ａには、実際に画像データに対して画像処理を行う画像処理エンジンを有さないモジュールであって、画像処理モジュール３８Ａの画像処理に必要な情報を提供するサポートモジュール３８Ｂが接続される場合もある。本実施の形態では、画像処理モジュール３８Ａ及びサポートモジュール３８Ｂを総称して処理モジュール３８と呼称する。
【００２６】
画像処理部８０を構成する個々の処理モジュール３８の実体はＣＰＵ１２によって実行されＣＰＵ１２で予め定められた画像処理を行わせるためのプログラム、又は、ＣＰＵ１２によって実行されＣＰＵ１２により図１に図示されていない外部の画像処理装置（例えば専用画像処理ボード等）に対する処理の実行を指示するためのプログラムであり、上述した画像処理クラスライブラリ３６には、予め定められた互いに異なる画像処理（例えば入力処理やフィルタ処理、色変換処理、拡大・縮小処理、スキュー角検知処理、画像回転処理、画像合成処理、出力処理等）を行う複数種の画像処理モジュール３８Ａやサポートモジュール３８Ｂが実体化される前の画像処理クラスのコード（プログラム）が各々登録されている。画像処理クラスを実体化したものが処理モジュール３８である。なお、処理モジュール３８をオブジェクトと呼称する場合もある。
【００２７】
個々の画像処理モジュール３８Ａは、図示は省略するが、画像データに対する画像処理を予め定められた単位処理データ量ずつ行う画像処理エンジンと、画像処理モジュール３８Ａの前段及び後段のモジュールとの画像データの入出力及び画像処理エンジンの制御を行う制御部から構成されている。個々の画像処理モジュール３８Ａにおける単位処理データ量は、画像の１ライン分、画像の複数ライン分、画像の１画素分、画像１面分等を含む任意のバイト数の中から、画像処理エンジンが行う画像処理の種類等に応じて予め選択・設定されており、例えば色変換処理やフィルタ処理を行う画像処理モジュール３８Ａでは単位処理データ量が１画素分とされ、拡大・縮小処理を行う画像処理モジュール３８Ａでは単位処理データ量が画像の１ライン分又は画像の複数ライン分とされ、画像回転処理を行う画像処理モジュール３８Ａでは単位処理データ量が画像１面分とされ、画像圧縮伸長処理を行う画像処理モジュール３８Ａでは単位処理データ量が実行環境に依存するＮバイトとされている。
【００２８】
また、画像処理クラスライブラリ３６には、画像処理エンジンが実行する画像処理の種類が同一でかつ実行する画像処理の内容が異なる画像処理モジュール３８Ａの画像処理クラスも登録されている（図１では、この種の画像処理モジュールを「モジュール１」「モジュール２」と表記して示している）。例えば拡大・縮小処理を行う画像処理モジュール３８Ａについては、入力された画像データを１画素おきに間引くことで50％に縮小する縮小処理を行う画像処理モジュール３８Ａ、入力された画像データに対して指定された拡大・縮小率で拡大・縮小処理を行う画像処理モジュール３８Ａ等の複数の画像処理モジュール３８Ａが各々用意されている。また、例えば色変換処理を行う画像処理モジュール３８Ａについては、ＲＧＢ色空間をＣＭＹ色空間へ変換する画像処理モジュール３８Ａやその逆へ変換する画像処理モジュール３８Ａ、Ｌ*ａ*ｂ*色空間等の他の色空間変換を行う画像処理モジュール３８Ａが各々用意されている。
【００２９】
また、画像処理モジュール３８Ａの制御部は、画像処理エンジンが単位処理データ量ずつ処理するために必要な画像データを入力するために、自モジュールの前段のモジュール（例えばバッファモジュール４０）から画像データを単位読出データ量ずつ取得し、画像処理エンジンから出力される画像データを単位書込データずつ後段のモジュール（例えばバッファモジュール４０）へ出力する（画像処理エンジンで圧縮等のデータ量の増減を伴う画像処理が行われなければ単位書込データ量＝単位処理データ量となる）か、画像処理エンジンによる画像処理の結果を自モジュールの外部へ出力する（例えば画像処理エンジンがスキュー角検知処理等の画像解析処理を行う場合、画像データに代えてスキュー角検知結果等の画像解析処理結果が出力されることがある）処理を行うが、画像処理クラスライブラリ３６には、画像処理エンジンが実行する画像処理の種類及び内容が同一で、上記の単位処理データ量や単位読出データ量、単位書込データ量が異なる画像処理モジュール３８Ａのクラスも登録されている。例えば、先程は画像回転処理を行う画像処理モジュール３８Ａにおける単位処理データ量を画像１面分と説明したが、同じ画像回転処理を行う画像処理モジュール３８Ａで単位処理データ量が画像の１ライン分又は画像の複数ライン分であるものが画像処理クラスライブラリ３６に含まれていても良い。
【００３０】
また、前述したように、画像処理モジュール３８Ａの画像処理に必要なサポートモジュール３８Ｂが画像処理モジュール３８Ａに接続される場合もある。例えば、画像処理モジュール３８Ａが画像データを読み出すモジュールであった場合に、どの画像データのファイルを読み出すのかを指定した文字列を提供するサポートモジュール３８Ｂ等が挙げられる。サポートモジュール３８Ｂは、バッファモジュール４０に連結されることはない（図２（Ａ）も参照。）。図１では図示は省略されているが、このサポートモジュール３８Ｂのクラスも画像処理クラスとして画像処理クラスライブラリ３６に登録される。
【００３１】
また、画像処理部８０を構成する個々のバッファモジュール４０は、コンピュータ１０に設けられたメモリ１４からオペレーティングシステム３０を通じて確保されたメモリ領域で構成されるバッファと、バッファモジュール４０の前段及び後段のモジュールとの画像データの入出力及びバッファの管理を行うバッファ制御部から構成されている。個々のバッファモジュール４０のバッファ制御部もその実体はＣＰＵ１２によって実行されるプログラムであり、画像処理クラスライブラリ３６にはバッファ制御部のプログラムも登録されている（図１ではバッファ制御部のプログラムを「バッファモジュール」と表記して示している）。
【００３２】
また、アプリケーション３２からの画像処理指示書による指示に従って画像処理部８０を構築する処理構築部４２は、図１に示すように複数種のモジュール生成部４４（以下、クリエータ４４と呼称する場合もある）から構成されている。複数種のモジュール生成部４４は互いに異なる画像処理に対応しており、アプリケーション３２からの画像処理指示書に応じて起動される（呼び出される）ことで、対応する画像処理を実現するための画像処理モジュール３８Ａ、サポートモジュール３８Ｂ及びバッファモジュール４０から成るモジュール群を生成（クラスを実体化）する処理を行う。なお、図１ではモジュール生成部４４の一例として、画像処理クラスライブラリ３６に登録されている個々の画像処理モジュール３８Ａが実行する画像処理の種類に対応するモジュール生成部４４を示しているが、個々のモジュール生成部４４に対応する画像処理は、複数種の画像処理モジュール３８Ａによって実現される画像処理（例えばスキュー角検知処理と画像回転処理から成るスキュー補正処理）であってもよい。必要とされる画像処理が複数種の画像処理を組み合わせた処理である場合、複数種の画像処理の何れかに対応するモジュール生成部４４が順次起動される。順次起動されたモジュール生成部４４により、必要とされる画像処理を行う画像処理部８０が構築されることになる。本画像処理装置は、アプリケーション３２が直接処理モジュール３８を生成するのではなく、アプリケーション３２の指示により図３のファクトリ７０（本発明のラッパーに相当する）を生成してファクトリ７０からモジュール生成部４４を呼び出して処理モジュール３８を生成する構成となっている。ファクトリ７０は、モジュール生成部４４に対するラッパーとしての機能を有し、モジュール生成部４４で実行される関数（具象関数）の引数の違いがファクトリ７０で吸収されるようにしている。
【００３３】
図３は、ファクトリ７０に関するオブジェクト指向モデルを示すモデル図である。ここでは、オブジェクト指向の表記方法に則って、矩形の上段にクラス名を、下段にはメソッドを記載し、矢印により継承等を示した。また、ここでは、Scaleという拡大縮小処理を行う画像処理モジュール３８Ａを生成するモジュール生成部４４を呼び出すファクトリ７０を図示した。
【００３４】
図３に示すように、モジュール生成部４４は、ファクトリ７０により呼び出される。ファクトリ７０は、ファクトリ生成関数６０により生成される。ファクトリ７０は、抽象ファクトリクラス５１を継承する具象ファクトリクラス（ジェネリックファクトリクラス５２）を実体化したものであり、モジュール生成部４４を呼び出すとともに、該モジュール生成部４４に対して、画像処理指示書で指定された引数（処理モジュール３８が実行する関数で用いる値）を引き渡す機能を有する。ここで、画像処理モジュール３８Ａを生成するモジュール生成部４４の各々が実行する関数名（例えば、Engine()）は各々同じであるが、引数（引数の個数及び引数型の少なくとも一方）が異なっているものもある。また、サポートモジュール３８Ｂを生成するモジュール生成部４４の各々の関数名（例えば、Create()）も互いに同じだが、引数（引数の個数及び引数型の少なくとも一方）が異なっているものもある（図５の各モジュール生成部４４のメソッドも参照。）。従って、本実施の形態では、ファクトリ７０の生成の際に、以下の工夫を施している。
【００３５】
ジェネリックファクトリクラス５２では、引数の種類（以下、「引数型」と呼称する）が抽象化されて（図３に示すように、引数型が不定の「void*(voidポインタ)」としている)定義されている。引数型に応じて引数のサイズが定まるが、このように抽象化された状態では、引数型が不定なため、モジュール生成部４４で解釈可能に具体化（具象化）する必要がある。従って、ジェネリックファクトリクラス５２からファクトリ７０を生成する際に、引数型を具体化して生成する。
【００３６】
また、本実施の形態では、ジェネリックファクトリクラス５２では、使用する引数がどのようなサイズであってもよいように、各引数を、各引数の先頭アドレス値を格納したポインタの配列で取り扱うようにしている。しかしながら、モジュール生成部４４が各引数をポインタ型で渡されたものを使用できるとは限らず、モジュール生成部４４の種類によっては、参照型、或いは値型でないと使用できない場合もある。従って、モジュール生成部４４に対しては、ポインタ渡し、値渡し、参照渡しなど、モジュール生成部４４が取り扱い可能な形式で引数を渡す必要がある。以下、引数を渡すときの型を上記引数型と区別するため「形式」と呼称する。従って、モジュール生成部４４で使用可能な形式でモジュール生成部４４に引数を渡せるようにファクトリ７０を生成する。
【００３７】
まず、引数型については、本実施の形態では、引数の個数分の配列要素（ポインタ）を有する配列構造を定義し、各配列要素に対して各引数の種類（引数型）を指定することにより具象引数型に変換する。図３に示す「EngineFactory4」という名称のファクトリ７０では、Arg0〜Arg３までの４つの配列要素に対して、順にManager、Engine、Float、Floatの４つの引数型が指定されている。例えば、Managerは、処理管理、Engineは画像処理エンジン、Floatは、浮動小数点の変数を示す。
【００３８】
更に、モジュール生成部４４に引数を渡す際には、ポインタで指定された各引数をモジュール生成部４４に渡すときの形式（例えば、値、参照、ポインタ）に変換する必要があるが、この形式の変換には、形式変換クラス５６が使用される。形式変換クラス５６には、例えば、ポインタをポインタに変換する「ToPointer」、ポインタを参照に変換する「ToReference」、ポインタを値に変換する「ToValue」等がある。この形式変換クラス５６が引数の配列要素の各々に対して指定された状態でファクトリ７０が生成される。図３に示す「EngineFactory4」という名称のファクトリ７０では、引数型「Manager」の引数に対して、「ToReference」の形式変換クラス５６が指定され、引数型「Engineポインタ」の引数に対して、「ToValue」の形式変換クラス５６が指定され、引数型「Float」の２つの引数に対して、「ToValue」の形式変換クラス５６が指定されている。
【００３９】
図１０に、ジェネリックファクトリクラス５２のコーディング例を示す。図示したジェネリックファクトリクラス５２は、引数が４個のファクトリ７０のテンプレートとして用いられるものである。
【００４０】
符号１００の部分で、ジェネリックファクトリクラス５２のテンプレート引数が定義されている。具体的には、ジェネリックファクトリクラス５２から呼び出されるモジュール生成部４４をCreatorとし、更にそのモジュール生成部４４の戻り値型をResultとし、４つの引数、及び各引数に対する形式変換クラス５６（Resolver）が定義されている。符号１０２の部分で、このクラスが、EngineFactory4というクラス名のジェネリックファクトリクラス５２であることが宣言される。符号１０４において、４つの具象引数のポインタの構造体が引数の配列として宣言されている。
【００４１】
符号１１０の部分では、仮想関数が宣言されている。符号１１２の部分では、引数の構造体の先頭アドレスに何も入っていなければ、NULLを返す、いわゆるエラー処理が行われる。符号１１４の部分では、符号１０４で宣言された構造体で表された引数の配列要素に引数型を定義して、抽象引数型ポインタのvoid*から、具象引数のポインタの構造体のポインタへ変換する処理が行われる。符号１１６及び符号１１８の部分で、ファクトリ７０が実行する処理（モジュール生成部４４の呼出、形式変換クラス５６による形式変換処理）が宣言されている。
【００４２】
図１１に、ファクトリ生成関数６０のコーディング例を示す。符号２００の部分で、load_ReadPNGFactoryという名称のファクトリ生成関数６０が定義されており、符号２０２で、new演算子により、EngineFactory3というジェネリックファクトリクラス５２をテンプレートクラスとしてオブジェクトが生成されるように記述されている。符号２０４には、３つの引数の引数型と形式とが定義されている。ファクトリ生成関数６０は、ユーザにより作成されて、事前にファクトリ生成関数ライブラリ５８に登録される。
【００４３】
なお、図１に示すように、ジェネリックファクトリクラス５２は、ジェネリックファクトリクラスライブラリ５０に登録されており、形式変換クラス５６は、予め形式変換クラスライブラリ５４に登録されている。また、ファクトリ生成関数６０は、ファクトリ生成関数ライブラリ５８に登録されている。
【００４４】
画像処理装置に新規の機能を追加する場合には、該機能を含む画像処理部７０を構築する前に、事前に、該新規の機能を提供する処理モジュール３８の画像処理クラスを画像処理クラスライブラリ３６に追加登録し、処理構築部４２にモジュール生成部４４を追加登録し、これに対応するファクトリ生成関数６０をファクトリ生成関数ライブラリ５８に追加登録しておく必要がある。
【００４５】
ファクトリ７０がモジュール生成部４４を呼び出す（call）際には、ファクトリ７０からモジュール生成部４４に、引数型及び形式（形式変換クラス５６）の指定により具象化された状態で引数が渡される。これにより、モジュール生成部４４は、対応する画像処理クラスを実体化したオブジェクト（処理モジュール３８）を生成する。
【００４６】
なお、ファクトリ７０では、引数型及び形式を変換するだけであるため、Webサービスを利用することで新規機能追加を行う場合に比べて、（通信が発生しないため）呼出しオーバーヘッドは増加しない。
【００４７】
なお、画像処理モジュール３８Ａを生成するモジュール生成部４４は、必要に応じて当該画像処理モジュール３８Ａの前段及び後段に連結するバッファモジュール４０を生成する。最終的に、ファクトリ７０により呼び出されたモジュール生成部４４により生成された処理モジュール３８及びバッファモジュール４０が連結された画像処理部８０が構築される。
【００４８】
そして、図１に示す処理管理部４６は、上記構築された画像処理部８０における画像処理の実行を制御したり、画像処理部８０の各モジュールによるメモリ１４や各種のファイル等のコンピュータ１０のリソースの使用を管理したり、画像処理部８０で発生したエラーを管理したりする。
【００４９】
本実施の形態では、処理構築部４２によって構築される画像処理部８０は、画像処理部８０を構成する個々の画像処理モジュール３８Ａが、画像１面分よりも小さいデータ量を単位として後段へ画像データを引き渡しながら並列に画像処理を行うように動作する（ブロック単位処理と称する）ことも、前段の画像処理モジュール３８が画像１面分の画像データに対する画像処理を完了した後に、後段の画像処理モジュール３８が画像１面分の画像データに対する画像処理を行うように動作する（面単位処理と称する）ことも可能とされており、処理管理部４６のプログラムとして、画像処理部８０にブロック単位処理を行わせるためのプログラムと、画像処理部８０に面単位処理を行わせるためのプログラムが各々用意されている。
【００５０】
ここで、処理管理部４６の画像処理の実行制御について簡単に説明する。まず、ブロック単位処理を行う場合について説明する。ここでは、サポートモジュール３８Ｂの説明は省略して一連の画像処理の流れに着目して説明する。処理管理部４６は、構築された画像処理部８０のうち最後段の画像処理モジュール３８Ａに処理要求を入力する（図４の(1)も参照）。図４に示す画像処理部８０において、処理管理部４６から最後段の画像処理モジュール３８Ａ4に処理要求が入力されると、画像処理モジュール３８Ａ4の制御部は前段のバッファモジュール４０3に読出要求を入力する（図４の(2)参照）。このとき、バッファモジュール４０3のバッファには画像処理モジュール３８Ａ4が読出可能な有効データ（画像データ）が記憶されていないので、バッファモジュール４０3のバッファ制御部は処理管理部４６にデータ要求を入力する（図４の(3)参照）。
【００５１】
処理管理部４６は、予め定められたテーブルに登録されている情報に基づいて、データ要求入力元のバッファモジュール４０（ここではバッファモジュール４０3）の前段の画像処理モジュール３８Ａ（ここでは画像処理モジュール３８Ａ3）を認識し、認識した前段の画像処理モジュール３８Ａに処理要求を入力する（図４の(4)参照）。
【００５２】
画像処理モジュール３８Ａ3の制御部は、処理要求が入力されると前段のバッファモジュール４０2に読出要求を入力し（図４の(5)参照）、バッファモジュール４０2のバッファにも読出可能な画像データが記憶されていないので、バッファモジュール４０2のバッファ制御部は処理管理部４６にデータ要求を入力する（図４の(6)参照）。処理管理部４６は、バッファモジュール４０2からデータ要求が入力された場合も、その前段の画像処理モジュール３８Ａ2に処理要求を入力し（図４の(7)参照）、画像処理モジュール３８Ａ3の制御部は前段のバッファモジュール４０1に読出要求を入力する（図４の(8)参照）。また、バッファモジュール４０1のバッファにも読出可能な画像データが記憶されていないので、バッファモジュール４０1のバッファ制御部も処理管理部４６にデータ要求を入力する（図４の(9)参照）。処理管理部４６は、バッファモジュール４０1からデータ要求が入力された場合も、その前段の画像処理モジュール３８Ａ1に処理要求を入力する（図４の(10)参照）。
【００５３】
ここで、画像処理モジュール３８Ａ1の前段のモジュールは画像データ供給部２２であるので、画像処理モジュール３８Ａ1の制御部は、画像データ供給部２２にデータ要求を入力することで画像データ供給部２２から単位読出データ量の画像データを取得し（図４の(11)参照）、取得した画像データに対して画像処理エンジンが画像処理を行うことで得られた画像データを、後段のバッファモジュール４０1のバッファに書き込む（図４の(12)参照）。なお、画像処理モジュール３８Ａ1の制御部は後段のバッファモジュール４０1のバッファへの画像データの書き込みを完了すると、処理管理部４６へ処理完了通知を入力する。
【００５４】
処理管理部４６は、処理完了通知元が画像処理部８０の最後段の画像処理モジュール３８Ａか否か判定する。この場合は判定が否定され、何ら処理を行うことなく処理を終了する（画像処理モジュール３８Ａ2，３８Ａ3から処理完了通知が入力された場合についても同様）。
【００５５】
また、バッファモジュール４０1のバッファ制御部は、後段の画像処理モジュール３８Ａ2が読出可能な単位読出データ量以上の有効データが書き込まれると画像処理モジュール３８Ａ2に対して読出を要請し、これに伴い画像処理モジュール３８Ａ2の制御部は、バッファモジュール４０1のバッファから単位読出データ量の画像データを読み出し（図４の(13)参照）、取得した画像データに対して画像処理エンジンが画像処理を行うことで得られた画像データを、後段のバッファモジュール４０2のバッファに書き込む（図４の(14)参照）。バッファモジュール４０2のバッファ制御部は、後段の画像処理モジュール３８Ａ3が読出可能な単位読出データ量以上の有効データが書き込まれると画像処理モジュール３８Ａ3へ読出を要請し、画像処理モジュール３８Ａ3の制御部は、バッファモジュール４０2のバッファから単位読出データ量の画像データを読み出し（図４の(15)参照）、取得した画像データに対して画像処理エンジンが画像処理を行うことで得られた画像データを、後段のバッファモジュール４０3のバッファに書き込む（図４の(16)参照）。
【００５６】
更に、バッファモジュール４０3のバッファ制御部は、後段の画像処理モジュール３８Ａ4が読出可能な単位読出データ量以上の有効データが書き込まれると画像処理モジュール３８Ａ4に対して読出を要請し、これに伴い画像処理モジュール３８Ａ4の制御部は、バッファモジュール４０3のバッファから単位読出データ量の画像データを読み出し（図４の(17)参照）、取得した画像データに対して画像処理エンジンが画像処理を行うことで得られた画像データを、後段のモジュールである画像出力部２４へ出力する（図４の(18)参照）。また、画像処理モジュール３８Ａ4の制御部は後段の画像出力部２４への画像データの書き込みを完了すると、処理管理部４６へ処理完了通知を入力する（図４の(19)参照）。処理管理部４６は、最後段の画像処理モジュール３８Ａである画像処理モジュール３８Ａ4に処理要求を再度入力する。
【００５７】
この最後段の画像処理モジュール３８Ａ4への処理要求の再入力により、上述した処理シーケンスが再度繰り返され、処理対象の画像データに対し、画像処理が順次行われることになる。画像データ供給部２２から供給される画像データが処理対象の画像データの末尾に達すると、個々の画像処理モジュール３８Ａから処理管理部４６への全体処理終了通知の入力が、前段側の画像処理モジュール３８Ａから順次行われる。処理管理部４６は、最後段の画像処理モジュール３８Ａから全体処理終了通知が入力されると、指示書解釈実行部４８に対して画像処理の完了を通知し、画像処理の完了が通知された指示書解釈実行部４８は、アプリケーション３２に対して画像処理の完了を通知する。なお、一連の画像処理が完了すると、画像処理モジュール３８Ａ、サポートモジュール３８Ｂ，及びバッファモジュール４０は自モジュールを消去する消去処理を行う。これにより、使用されていたリソースが解放される。
【００５８】
また、面単位処理の場合には、基本的には、上記ブロック単位処理と同様に、前段のモジュールから後段のモジュールへ画像データが受け渡されて一連の画像処理が行われるが、以下の点が異なる。面単位処理では、最後段の画像処理モジュール３８Ａに入力された処理要求がより前段の画像処理モジュール３８Ａへ遡り、最前段の画像処理モジュール３８Ａに到達した後は、最前段の画像処理モジュール３８Ａに対してのみ処理要求を繰り返し入力し、当該画像処理モジュール３８Ａにおける処理対象の画像データ全体に対する画像処理が完了すると、次の画像処理モジュール３８Ａで処理対象の画像データ全体に対する画像処理を行わせ、この処理を後段の画像処理モジュール３８Ａに対して順に進めていくことで、一連の画像処理が行われる。面単位処理の詳細については説明を省略する。
【００５９】
図１に示す指示書解釈実行部４８は、アプリケーション３２から受け取った画像処理指示書を解釈して、この画像処理指示書の記述に応じた処理モジュール３８が生成されて画像処理部８０が構築され、処理管理部４６により画像処理が実行されるように制御する。ここで、指示書解釈実行部４８で行われる処理の流れについて、特にファクトリ７０を生成する処理に着目して説明する。
【００６０】
図５は、指示書解釈実行部４８の機能構成と、画像処理指示書の投入からモジュール生成部４４が呼び出されるまでの流れを示す模式図である。
【００６１】
指示書解釈実行部４８は、指示書解釈部４８Ａ、ファクトリ生成関数名生成部４８Ｂ、関数呼出部４８Ｃ、引数格納処理部４８Ｄ、及び引数渡部４８Ｅを含んで構成されている。指示書解釈部４８Ａは、アプリケーション３２から受け取った画像処理指示書を解釈し、必要な情報を抽出する。図６に、画像処理指示書の具体例を示す。図示されるように、オブジェクト（処理モジュール３８）の情報が処理の実行順に列挙されている。各処理モジュール３８の情報として、画像処理指示書には、変数名、型名、引数個数、及び引数が対応づけられて記述されている。変数名は、オブジェクトの名称であり、オブジェクト毎に固有の識別情報として付与される。型名は、オブジェクトを生成するモジュール生成部４４のクラス名である。なお、本実施の形態では、モジュール生成部４４とファクトリ７０とが１対１で対応づけられるため、この型名はファクトリ７０の名称の一部としても使用され、またファクトリ生成関数６０の関数名の一部としても使用される。引数個数は、オブジェクトの引数の個数を示す。そして、その引数個数分だけ引数が列挙されている。指示書解釈部４８Ａは、これら変数名、型名、引数個数、引数の各々を、処理モジュール３８に関する情報として抽出する。
【００６２】
ファクトリ生成関数名生成部４８Ｂは、指示書解釈部４８Ａで抽出された情報（本実施の形態では型名）に基づいて、予め定められたファクトリ生成関数名生成規則に従って、ファクトリ生成関数６０の関数名を生成する。ここで生成された関数名が、ファクトリ７０を生成する関数として呼び出すファクトリ生成関数６０の名称となる。関数呼出部４８Ｃは、ファクトリ生成関数名生成部４８Ｂで生成された関数名が付与されたファクトリ生成関数６０を呼び出す。引数格納処理部４８Ｄは、指示書解釈部４８Ａにより抽出された引数個数及び引数に基づいて、引数個数分の配列要素を有する配列に引数を格納する処理を行う。引数渡部４８Ｅは、引数格納処理部４８Ｄで引数が格納された配列の先頭アドレスをファクトリ７０に渡す。
【００６３】
なお、図５では、ファクトリ７０やモジュール生成部４４を、既存の機能と新規追加した機能とで分けて図示したが、いずれの場合も、ファクトリ生成関数６０を呼び出してジェネリックファクトリクラス５２からファクトリ７０を生成し、ファクトリ７０からモジュール生成部４４を呼び出して処理モジュール３８を生成することについては変わりない。
【００６４】
図７は、指示書解釈実行部４８によって実行される処理の流れを示すフローチャートである。
【００６５】
指示書解釈実行部４８は、（電子ファイル形式の）画像処理指示書を読込み、解析して、処理モジュール３８の情報を順次抽出する（読み取る）。具体的には、まずステップＳ０１では、画像処理指示書から全ての情報を読み取ったか、すなわち、画像処理指示書のファイルの終端を示す終端記号（ＥＯＦ）を検出したか否かを判定する。ステップＳ０１で否定判定した場合には、ステップＳ０２に進む。ステップＳ０２では、画像処理指示書から変数名を１つ読み取って、vnにセットする。ステップＳ０３では、画像処理指示書から上記読み取った変数名に対応づけられた型名を読み取って、tnにセットする。
【００６６】
続いて、ステップＳ０４で、予め定められたファクトリ生成関数名生成規則に従って、上記読み取られた型名tnから、ファクトリ生成関数６０の関数名fcfnを生成する。なお、ファクトリ生成関数ライブラリ５８に登録されているファクトリ生成関数６０には、ファクトリ生成関数名生成規則で生成される関数名が予め付与されている。ステップＳ０５では、関数名から該関数名が付与された関数が記憶された記憶領域のアドレスを取得する関数をシステムライブラリから呼び出し、上記生成された関数名fcfnが付与されたファクトリ生成関数６０が格納されている記憶領域のアドレスfcfを取得する。
【００６７】
次に、ステップＳ０６で、上記読み取った変数名に対応づけられた引数個数を画像処理指示書から読み取って、nにセットする。ステップＳ０７で、引数文字列格納用の配列v（以下引数配列vと呼称する）、引数オブジェクト格納用マップ（キーが変数名、各配列要素の値がvoidポインタの連想配列）mapのデータをクリアし、ループカウンタiを０にする。ここで、引数配列vは、変数名vnに対応づけられて画像処理指示書に記述された引数を格納するための配列である。ただし、引数がオブジェクト（処理モジュール３８）の変数名を示していた場合には、当該変数名を有するオブジェクトのアドレスが格納される。なお、連想配列mapは、モジュール生成部４４により生成されたオブジェクト（処理モジュール３８）のアドレスを格納するための配列である。
【００６８】
ステップＳ０８では、「ループカウンタi<引数個数n」であるか否かを判定する。ここで、肯定判定した場合には、ステップＳ０９に進む。ステップＳ０９では、上記読み取った変数名に対応づけられた引数を１つ読み取って、anにセットする。
【００６９】
ステップＳ１０では、引数anがmap配列のキーとして存在するか否かを判定する。ステップＳ１０で肯定判定した場合には、引数anが、すでに生成されたオブジェクト（処理モジュール３８）の名称であるため、ステップＳ１１で、引数配列v[i]に、map中のanをキーとした値map[an]を格納する。一方、ステップＳ１０で否定判定した場合には、引数anが、すでに生成されたオブジェクト（処理モジュール３８）の名称ではないため、ステップＳ１２で、新たに生成するオブジェクトの引数を表現している文字列anとして、引数配列v[i]に格納する。すなわち、ここでは、引数anが値である場合には、当該引数anを引数配列vに格納し、引数anが値ではなくオブジェクト（処理モジュール３８）の変数名である場合には、引数配列vには、該オブジェクトのアドレスを格納するようにしている。ステップＳ１３では、ループカウンタiに１を加算して、ステップＳ０８に戻る。ステップＳ０８〜ステップ１３の処理は、上記変数名vnに対応づけられた全ての引数を読み取って、引数配列v[i]に格納し、ステップＳ０８で否定判定されるまで繰り返される。
【００７０】
ステップＳ０８で否定判定した場合には、ステップＳ１４に進む。ステップＳ１４では、ステップＳ０５で取得したアドレスfcfに格納されているファクトリ生成関数６０（ファクトリ生成関数fcfn）を呼び出し、ファクトリ７０（ファクトリf）を生成させる。
【００７１】
ステップＳ１５では、生成されたファクトリfに引数型不定のポインタ形式で引数を渡し（ここでは、引数配列vの先頭アドレスを渡す）、オブジェクト（処理モジュール３８）objを生成させる。より具体的には、ファクトリfは、自身に対応するモジュール生成部４４を呼び出し、引数配列vから引数型に応じて各引数を読み出し、指定された形式変換クラス５６により形式変換を行ってモジュール生成部４４に渡す。これにより、モジュール生成部４４は、当該引数を使用するオブジェクト（処理モジュール３８）を生成する。
【００７２】
ステップＳ１６では、ファクトリfを削除する。
【００７３】
ステップＳ１７では、変数名vnをキーとし、生成されたオブジェクトのアドレスを値とする配列要素を連想配列mapに登録する。すなわち、map[vn]にオブジェクトobjのアドレスを格納する。ステップＳ１７の後は、ステップＳ０１に戻る。
【００７４】
ステップＳ０１で肯定判定した場合には、ステップＳ１８に進む。ステップＳ１８では、生成されたオブジェクトが連結されて構築された画像処理部８０により画像処理が実行されるよう処理管理部４６を起動する。これにより、画像処理が実行される。
【００７５】
ステップＳ１９では、連想配列mapをクリアする。
【００７６】
ここで、ステップＳ０１〜Ｓ０３、Ｓ０６、Ｓ０９の処理が、指示書解釈部４８Ａの処理に相当し、ステップＳ０４の処理が、ファクトリ生成関数名生成部４８Ｂの処理に相当し、ステップＳ０５、Ｓ１４の処理が、関数呼出部４８Ｃの処理に相当し、ステップＳ０７〜Ｓ１３、Ｓ１７、及びＳ１９の処理が、引数格納処理部４８Ｄの処理に相当し、ステップＳ１５における引数を渡す処理が引数渡部４８Ｅの処理に相当する。なお、図５において、ステップＳ１６、Ｓ１８に相当する機能ブロックの図示は省略した。
【００７７】
ここで、図６に示した画像処理指示書を例に挙げて、上記フローチャートにおける処理を具体的に説明する。まず、図６に示される変数名で識別される各オブジェクトについて説明する。
【００７８】
inFileオブジェクト・・・Stringが型名として指定され、"/foo/bar/in.png"が引数として指定されており、変数名readの画像処理モジュール３８Ａ（readオブジェクト）のサポートモジュール３８Ｂとして動作する。inFileオブジェクトは、readオブジェクトが読み込む画像データのファイルを指定する文字列（/foo/bar/in.png）を提供するオブジェクトである。
【００７９】
inStrmオブジェクト・・・FileInputStreamが型名として指定され、"inFile"が引数として指定されており、変数名readの画像処理モジュール３８Ａ（readオブジェクト）のサポートモジュール３８Ｂとして動作する。引数"inFile"はinFileオブジェクトを指している。inStrmオブジェクトは、inFileオブジェクトにより提供された文字列で指定された読み出し元ファイルからデータを読み出す処理を行うオブジェクトである。
【００８０】
readオブジェクト・・・ReadPNGが型名として指定され、"inStrm"が引数として指定されており、画像データを読み込む画像処理モジュール３８Ａとして動作する。readオブジェクトは、inStrmオブジェクトを呼出し、該inStrmオブジェクトによって読み出されたデータを、PNGフォーマットの画像データとして読み込むオブジェクトである。
【００８１】
ratioオブジェクト・・・Floatが型名として指定され、"1.5"が引数として指定されており、変数名scaleの画像処理モジュール３８Ａ（scaleオブジェクト）のサポートモジュール３８Ｂとして動作する。ratioオブジェクトは、scaleオブジェクトが拡大縮小処理を行う際の倍率を浮動小数点型の文字列で提供するオブジェクトである。
【００８２】
scaleオブジェクト・・・Scaleが型名として指定され、引数"read"と"ratio"が指定されており、画像データの拡大縮小を行う画像処理モジュール３８Ａとして動作する。scaleオブジェクトは、ratioオブジェクトによって提供された倍率（ここでは1.5）でreadオブジェクトによって読み込まれた画像データを拡大縮小（ここでは拡大）するオブジェクトである。
【００８３】
outFileオブジェクト・・・Stringが型名として指定され、"/tmp/out.jpg"が引数として指定されており、変数名writeの画像処理モジュール３８Ａ（writeオブジェクト）のサポートモジュール３８Ｂとして動作する。outFileオブジェクトは、writeオブジェクトが画像データを書き込む際の書き込み先を指定する文字列（/tmp/out.jpg）を提供するオブジェクトである。
【００８４】
outStrmオブジェクト・・・FileOutputStreamが型名として指定され、"outFile"が引数として指定されており、変数名writeの画像処理モジュール３８Ａ（writeオブジェクト）のサポートモジュール３８Ｂとして動作する。引数"outFile"はoutFileオブジェクトを指している。outStrmオブジェクトは、outFileオブジェクトにより提供された文字列で指定された書き込み先ファイルにデータを書き込む処理を行うオブジェクトである。
【００８５】
writeオブジェクト・・・WriteJPEGが型名として指定され、"scale"及び"outStrm"が引数として指定されており、画像データを書き込む画像処理モジュール３８Ａとして動作する。writeオブジェクトは、outStrmオブジェクトを呼出し、scaleオブジェクトによって拡大縮小処理された画像データを、JPEGフォーマットの画像データとしてoutFileオブジェクトによって指定された書き込み先ファイルに書き込むオブジェクトである。
【００８６】
このように画像処理の内容が記述された画像処理指示書が読み込まれた場合には、以下のように処理される。まず、ステップＳ０２で、文字列”inFile”を画像処理指示書に記述された先頭のオブジェクトの変数名として読み取り、変数名vnにセットする。
【００８７】
ステップＳ０３では、変数名inFileに対応づけられている文字列”String”を型名として読み取り、型名tnにセットする。
【００８８】
ステップＳ０４では、型名tnに接頭文字列”load_”、接尾文字列”Factory”を付加した文字列”load_StringFactory”を、ファクトリ生成関数名fcfnにセットする。ここで、ファクトリ生成関数名生成規則は、「型名tnの接頭文字列”load_”、接尾文字列”Factory”を付加する」というものである。
【００８９】
ステップＳ０５では、上記生成しファクトリ生成関数名（load_StringFactory）から当該関数名が付与されている関数のアドレスを取得する。
【００９０】
ステップＳ０６では、変数名inFileに対応づけられている引数個数「１」を読み込み、引数個数nにセットする。
【００９１】
ステップＳ０７で、引数配列v及び連想配列mapをクリアしてループカウンタiを０にセットした後、ステップＳ０９では、文字列”/foo/bar/in.png”を読み取り、引数anにセットする。ステップＳ１０において、引数anをキーとする配列要素が連想配列mapに存在していないため否定判定し、ステップＳ１２で、引数anを引数配列v[0]にセットする。ステップＳ１３では、iをインクリメントする。
【００９２】
オブジェクトinFileでは、引数は１つであるため、次のステップＳ０８では否定判定され、ステップＳ１４でファクトリｆが生成されて、ステップＳ１５でオブジェクトinFileが生成される。このオブジェクトのアドレスは、ステップＳ１７で、map配列の変数名inFileをキーとする配列要素に格納される。
【００９３】
続いて、次のオブジェクトについて上記と同様に処理が繰り返される。すなわち、ステップＳ０２で、文字列”inStrm”を読み取り、変数名vnにセットする。
【００９４】
ステップＳ０３では、変数名inStrmに対応づけられている文字列”FileInputStream”を型名として読み取り、型名tnにセットする。
【００９５】
ステップＳ０４では、型名tnに接頭文字列”load_”、接尾文字列”Factory”を付加した文字列”load_FileInputStreamFactory”を、ファクトリ生成関数名fcfnにセットする。
【００９６】
ステップＳ０５では、上記生成しファクトリ生成関数名（load_FileInputStreamFactory）から当該関数名が付与されている関数のアドレスを取得する。
【００９７】
ステップＳ０６では、変数名inStrmに対応づけられている引数個数「１」を読み込み、引数個数nにセットする。
【００９８】
ステップＳ０７で、引数配列v及び連想配列mapをクリアしてループカウンタiを０にセットした後、ステップＳ０９では、文字列”inFile”を読み取り、引数anにセットする。ステップＳ１０において、引数an（ここではinFile）をキーとする配列要素が連想配列mapに存在しているため（上記ステップＳ１７参照）肯定判定し、ステップＳ１１で、map[inFile]の値（inFileオブジェクトのアドレス）を引数配列v[0]にセットする。ステップＳ１３では、iをインクリメントする。
【００９９】
オブジェクトinStrmでは、引数は１つであるため、次のステップＳ０８では否定判定され、ステップＳ１４でファクトリｆが生成されて、ステップＳ１５でオブジェクトinStrmが生成される。このオブジェクトのアドレスは、ステップＳ１７で、map配列の変数名inStrmをキーとする配列要素に格納される。
【０１００】
以降のオブジェクトについての処理も、上記と同様であるため、ここではこれ以上の説明を省略する。このように画像処理指示書の記述に従って、逐次オブジェクトが生成されていく。
【０１０１】
図１２（Ｂ）は、指示書解釈実行部４８で実行される処理の流れを簡略化して記述したプログラム（メインプログラム）のコーディング例である。
【０１０２】
図示されるように、符号４００の部分で、ファクトリ生成関数６０が実装されているライブラリ（ファクトリ生成関数ライブラリ５８）を指定し、符号４０２の部分で、ファクトリ生成関数６０の関数名を、ファクトリ生成関数名生成規則に従って生成する。
【０１０３】
続いて、符号４０４で、ファクトリ生成関数ライブラリ５８をオープンして、符号４０６の部分で、ファクトリ生成関数６０のアドレスを取得し、符号４０８の部分で、該取得したアドレスを用いてファクトリ生成関数６０を呼出してファクトリ７０を生成する。
【０１０４】
更に、符号４１０の部分で、引数の個数分だけ引数を読み取って配列に格納し、符号４１２の部分でオブジェクト（処理モジュール３８）が生成されるように、ファクトリ７０からモジュール生成部４４を呼び出す。このとき、引数（args）がモジュール生成部４４に渡されている。
【０１０５】
すなわち、どのような機能を実行する場合でも、このメインプログラムを実行することで、処理モジュール３８が生成されて画像処理部８０が構築される。生成するモジュール生成部４４毎に引数の引数型や形式が違っていても、テンプレートとして使用されるジェネリックファクトリクラス５２には、この違いを吸収するよう抽象化された引数が定義されており、抽象化された引数がファクトリ７０で具象化されるため、問題なくモジュール生成部４４が呼び出される。また、ファクトリ７０を生成するファクトリ生成関数６０の関数名も、画像処理指示書から抽出した変数名から予め定められた規則に従って生成し、ファクトリ生成関数ライブラリ５８には、当該関数名が付与されたファクトリ生成関数６０を登録しておくことで、問題なくファクトリ生成関数６０を呼び出すことができ、ファクトリ生成関数６０の関数名もメインプログラムにおいて意識（記述）する必要がなくなる。
【０１０６】
更に、新規に機能を追加する場合であっても、メインプログラムを修正する必要はない。事前に、新たに追加する処理モジュール３８の画像処理クラスを画像処理クラスライブラリ３６に登録しておき、該処理モジュール３８を生成するためのモジュール生成部４４を登録しておき、このモジュール生成部４４を呼び出すファクトリ７０を生成するためのファクトリ生成関数６０を登録しておくことによって、同様に処理モジュール３８が生成されて画像処理部８０が構築される。従って、メインプログラムを修正する必要はなく、またメインプログラム側で各処理モジュール３８に応じた引数を定義する必要もない。
【０１０７】
ところが、ファクトリ７０を介してモジュール生成部４４を呼び出す構成とせずに、直接モジュール生成部４４を呼び出す従来の構成とすると、メインプログラムにおいて、図１２（Ａ）に示すように、生成する処理モジュール３８毎に、各モジュール生成部４４に応じた引数型及び形式の各々に応じて各引数を定義してハードコーディングする必要があり、登録される処理モジュール３８の数が多いほど、メインプログラムのハードコーディング量も多くなる。また機能追加する場合には、追加の度にプログラムを逐一修正する必要が生じる。具体的には、図１２（Ａ）の符号３００で示した拡大縮小の画像処理モジュール３８Ａ（Scaleオブジェクト）についての記述を例に挙げて説明すると、引数である倍率の読み出し（符号３０１）、浮動小数点の引数型にするための変換（符号３０２）、３つの引数eng,m,m(ここで、engは画像処理エンジンを示す引数、２つのmは、浮動小数点で表した横の倍率と縦の倍率である）の指定（符号３０３）のそれぞれを記述する必要がある。このように、メインプログラムを、登録される画像処理クラス毎に各引数を具体化して記述しなくてはならなくなる。
【０１０８】
なお、上記実施の形態では、関数名毎に異なるジェネリックファクトリクラス５２を設ける例について説明した（例えば、メソッドとして定義される関数名（例えば、engine(),create()等）が異なる場合には、異なるジェネリックファクトリクラス５２として定義した）が、例えば、関数名及び引数個数は同じであるが、引数型が互いに異なる複数の具象関数が規定されたモジュール生成部４４について、当該複数の具象関数の１つが実行されるようにモジュール生成部４４を呼び出すファクトリ７０を生成することもできる。すなわち、ファクトリ７０と具象関数とが１対１の関係となるようファクトリ７０を生成する。
【０１０９】
図８に示すように、処理Ｃで規定されるモジュール生成部４４には関数名及び引数個数は等しいが、引数型及び形式が異なる３つの具象関数が定義されており、それぞれの具象関数に応じたファクトリ７０が共通のジェネリックファクトリクラス５２をテンプレートとして生成される。ファクトリＣ１は、抽象化された引数を、引数型がint、形式が値となるよう変換するファクトリ７０であり、ファクトリＣ２は、引数型がint、形式がポインタとなるよう変換するファクトリ７０であり、ファクトリＣ３は、引数型がdouble、形式が値となるよう変換するファクトリ７０である。
【０１１０】
また、ジェネリックファクトリクラス５２は、引数の個数によらず１つのジェネリックファクトリクラス５２を登録しておいてもよいが、引数の個数毎にジェネリックファクトリクラス５２を用意して登録しておくようにしてもよい。上記実施の形態では、ジェネリックファクトリクラス５２を引数の個数に応じて設けた場合を例に挙げたが、更にここで、図９を用いて、詳細に説明する。
【０１１１】
図９（Ａ）は、引数個数が１の場合のモデル図であり、図９（Ｂ）は、引数個数が２の場合のモデル図であり、図９（Ｃ）は、引数個数が３の場合のモデル図である。前述した図１０において、引数４個のジェネリックファクトリクラス５２の具体例（実装例）を示したが、引数の個数に応じたジェネリックファクトリクラス５２を作成する場合には、ここで、符号１００の部分のテンプレートクラスの宣言において、引数の個数に応じた定義を行い、符号１０２で引数の個数に応じた名称でジェネリックファクトリクラス５２の宣言をしておき、符号１０６の部分においては、構造体を引数の個数に応じた配列個数にして定義し、符号１１８の部分において、引数の各々に対応させて形式変換クラス５６を記述しておく。
【０１１２】
ユーザは、呼び出すモジュール生成部４４の引数の個数に応じたジェネリックファクトリクラス５２を実体化してファクトリ７０を生成するように、ファクトリ生成関数６０を作成して事前に登録する。
【０１１３】
なお、上記実施の形態では、各処理モジュール３８に１つ以上の引数が指定される例について説明したが、これに限定されない。引数が指定されない処理モジュール３８が存在していてもよい。引数が指定されない処理モジュール３８としては、例えば、乱数でデータを生成する処理を行ったり、常に決められた定数を返す処理を行ったりするオブジェクトなどが考えられる。このように引数が指定されない処理モジュール３８を生成するモジュール生成部４４に対しては、引数を渡す必要がないため、引数個数が０のジェネリックファクトリクラス５２（すなわち、引数を配列構造にして引数型を具象化したり、各引数に対して形式変換クラス５６を指定する等の操作を含まないジェネリックファクトリクラス５２）を用意して、ファクトリ７０を生成するようにしてもよい。
【符号の説明】
【０１１４】
１０  コンピュータ
１４  メモリ
２０  記憶部
２２  画像データ供給部
２４  画像出力部
３８  処理モジュール
４０  バッファモジュール
４２  処理構築部
４４  モジュール生成部
４６  処理管理部
４８  指示書解釈実行部
５２  ジェネリックファクトリクラス
５４  形式変換クラス
６０  ファクトリ生成関数
７０  ファクトリ
【図１】
0005605228.tif 000002
【図２】
0005605228.tif 000003
【図３】
0005605228.tif 000004
【図４】
0005605228.tif 000005
【図５】
0005605228.tif 000006
【図６】
0005605228.tif 000007
【図７】
0005605228.tif 000008
【図８】
0005605228.tif 000009
【図９】
0005605228.tif 000010
【図１０】
0005605228.tif 000011
【図１１】
0005605228.tif 000012
【図１２】
0005605228.tif 000013