セグメント化フィルターのインターフェイス

Windows Vista 以降、WIA ではセグメント化フィルターがサポートされます。 セグメント化フィルターは 、IWiaSegmentationFilter インターフェイスを実装する必要があります。

IWiaSegmentationFilter インターフェイスは、このセクション全体で使用される新しい (Windows Vista 用) インターフェイス IWiaItem2 に依存しています。これは IWiaItem のスーパーセットです。 IWiaItem メソッドに加えて、IWiaItem2 インターフェイスには IWiaItem2::GetExtension メソッドが含まれています。このメソッドは、セグメント化フィルターを含む WIA 拡張機能を作成するためにアプリケーションによって使用されます。 IWiaItem インターフェイスと IWiaItem2 インターフェイスについては、Microsoft Windows SDK のドキュメントで説明されています。

IWiaSegmentationFilter インターフェイスは、1 つのメソッド DetectRegions を実装します。 このメソッドには、 lFlagspInputStreamおよび pWiaItem2 という 3 つのパラメーターがあります。

現在、lFlags パラメーターは使用されていません。

pInputStream パラメーターは、セグメント化を実行するイメージへのポインターです。 通常、これはフラットベッドのスキャン面全体を表すプレビュー画像です。 ストリームは、アプリケーションによって IWiaTransferCallback::GetNextStream メソッドで作成されます。このメソッドは、イメージの取得中に呼び出されます。 ドライバーは、取得したイメージ データを IWiaTransferCallback::GetNextStream メソッドが返すストリームに書き込みます。 これは、アプリケーションによってセグメント化フィルターに渡されるストリームでもあります。 IWiaTransferCallback インターフェイスについては、Windows SDK のドキュメントで説明されています。

pWiaItem2 パラメーターは、pInputStream が取得された WIA 項目へのポインターです。 親項目とも呼ばれます。 たとえば、 pWiaItem2 が指す項目は、フラットベッド項目である可能性があります。

IWiaSegmentationFilter::D etectRegions メソッドは、pInputStream で表されるイメージのサブ領域を決定するために使用されます。 検出されたサブリージョンごとに、 IWiaSegmentationFilter::D etectRegions によって 、pWiaItem2 が指す項目の下に新しい子 WIA 項目が作成されます。 子項目ごとに、セグメント化フィルターは、WIA_IPS_XPOS、WIA_IPS_YPOSWIA_IPS_XEXTENT、およびWIA_IPS_YEXTENTの WIA プロパティの値を設定する必要があります。 これらのプロパティは、スキャンする領域の外接する四角形を表します。 ドライバーがデスキューイングをサポートしている場合には、セグメント化フィルターをより高度にするために、セグメント化フィルターのWIAプロパティなど、他のWIAプロパティを設定することも考慮する必要があります。

次の図は、セグメント化フィルターによってアプリケーション項目ツリーがどのように変更されるかを示しています。 この図では、セグメント化フィルターによってフラットベッド上の 3 つの画像が検出され、各画像に対して、フラットベッド項目の下に新しい子項目が作成されています。

セグメント化フィルターによってアプリケーション項目ツリーがどのように変更されるかを示す図。

セグメント化フィルターは、拡張するドライバーでサポートされているすべてのイメージ形式をサポートする必要があります。 Microsoft が提供するセグメント化フィルターでは、BMP、GIF、JPEG、PNG、TIFF の形式がサポートされます。 したがって、このフィルターを使用するすべてのドライバーは、これらの形式に制限されます。

子項目を作成するために、セグメント化フィルターは IWiaItem2::CreateChildItem メソッドを 呼び出します。 このような呼び出しの例を次に示します。

lItemFlags = WiaItemTypeGenerated | WiaItemTypeTransfer | WiaItemTypeImage | WiaItemTypeFile |
 WiaItemTypeProgrammableDataSource;

lCreationFlags = COPY_PARENT_PROPERTY_VALUES;

pWiaItem2->CreateChildItem(lItemFlags,
                           lCreationFlags,
                           bstrItemName,
                           &pChildItem);

IWiaItem2::CreateChildItem はIWiaItem::CreateChildItem と若干異なります。 IWiaItem2::CreateChildItem メソッドには、新しいパラメーター lCreationFlags があります。IWiaItem2::CreateChildItem メソッドの lItemFlags パラメーターは、IWiaItem::CreateChildItemlFlags パラメーターに対応します。 前のコード スニペットに示すように、 lCreationFlags パラメーターを持つCOPY_PARENT_PROPERTY_VALUESを WIA サービスに渡すと、子項目のすべての読み取り/書き込み可能 WIA プロパティを親と同じ値に設定するように WIA サービスに指示します。 セグメント化フィルターでこのフラグを渡す必要がある理由は、新しく作成された子項目のイメージ形式や解像度などのプロパティが親アイテムであることを確認するためです。 セグメント化フィルターが子項目に設定するエクステント プロパティはイメージの解像度に依存するため、解像度が同じであることが重要です。 また、アプリケーションでプレビュー コンポーネントを使用する場合は、子項目でイメージの形式と解像度が同じであることが重要です (Microsoft Windows SDK のドキュメントで説明)。 最終的なイメージを取得する前に、アプリケーションは解像度を変更して、スキャナーから高品質の画像を取得できます。

セグメント化フィルターは、アプリケーションと同じ制限によって制限され、実行できることとできないことに注意することが重要です。 つまり、アプリケーションは、セグメント化フィルターによって作成される子項目を変更できます。 たとえば、セグメント化フィルターが検出された領域にユーザーが満足せず、角をドラッグしてこの領域を変更するようにアプリケーションに指示する場合があります。 アプリケーションでは、セグメント化フィルターによって作成された子項目を削除したり、新しい項目を追加したりすることもできます。

セグメント化フィルターは、作成した子項目の "クリーンアップ" を担当しないことに注意してください。 そのため、アプリケーションが IWiaSegmentationFilter::D etectRegions を複数回呼び出す場合、アプリケーションは最初に IWiaSegmentationFilter::D etectRegions メソッドの最初の呼び出しで作成された子項目を削除する必要があります。 セグメント化フィルターは、 pInputStream パラメーターをリセットする責任も負いません。 アプリケーションは、セグメント化フィルターを呼び出す前に、シーク ポインターがストリームの先頭に設定されていることを確認する必要があります。

セグメント化フィルターは、フィルムアイテムとフラットベッドアイテムでのみ使用する必要があります。 フィルム スキャンの場合、スキャナーには固定フレームが付属することがよくあります。その場合、ドライバーは子項目を作成します (詳細については 、WIA スキャナー項目ツリー レイアウト を参照してください)。 この場合、アプリケーションは、リージョンの検出と子項目の作成のためにセグメント化フィルターを呼び出すべきではありません。

ドライバーにセグメント化フィルターが付属している場合、フラットベッドおよびフィルムのWIA項目に対してWIA_IPS_SEGMENTATIONプロパティを実装する必要があります。 この読み取り専用プロパティには、ドライバーが設定する WIA_USE_SEGMENTATION_FILTER と WIA_DONT_USE_SEGMENTATION_FILTER の 2 つの有効な値があります。 このプロパティを使用すると、特定の項目の領域検出にドライバーのセグメント化フィルターを使用する必要があるかどうかをアプリケーションに知らせます。

スキャナーがフィルム スキャンに固定フレームを使用する場合は、このプロパティをフィルムアイテムのWIA_DONT_USE_SEGMENTATION_FILTERに設定します。 この場合、アプリケーションは、フィルムプレビューが取得された後にセグメント化フィルタを読み込もうとしないでください。代わりに、ドライバーによって作成された子項目を列挙する必要があります。 これらの子項目は、固定フレームを表します。

WIA 項目は IWiaSegmentationFilter::D etectRegions に渡されるため、セグメント化フィルターでは、項目のカテゴリ (フラットベッドやフィルム) に応じて異なるアルゴリズムを使用できます。 アイテムのカテゴリは 、WIA_IPA_ITEM_CATEGORY プロパティに格納されます。

アプリケーションが pInputStream でイメージを取得してから IWiaSegmentationFilter::D etectRegions を呼び出す間に pWiaItem2 のプロパティを変更する場合は、元のプロパティ設定 (つまり、ストリームの取得時にアイテムが持っていたプロパティ設定) を復元する必要があります。 これは、 IWiaPropertyStorage::GetPropertyStream メソッドと IWiaPropertyStorage::SetPropertyStream メソッドを使用して行うことができます。 これらの変更を復元する必要がある理由は、セグメント化フィルターに必要な情報が WIA 項目に存在する可能性がありますが、イメージ ヘッダーには格納されないためです。 このような情報の例としては、WIA_IPS_XPOS、WIA_IPS_YPOSおよびWIA_IPS_ROTATIONプロパティに格納されているデータがあります。 IWiaPropertyStorage インターフェイスとそのメソッドについては、Windows SDK のドキュメントで説明されています。

アプリケーションは、 IWiaItem2::GetExtension を呼び出してセグメント化フィルターのインスタンスを取得します (Windows SDK のドキュメントで説明)。 通常、アプリケーションはプレビュー ウィンドウを表示する前にこのメソッドを呼び出します。 これは、ドライバーにセグメント化フィルターが付属していない可能性があるためです。その場合、UI では、[ セグメント化の実行] などのサポートされていないボタンが表示されないことを認識する必要があります。