セグメンテーション フィルターのインターフェイス
Windows Vista 以降、WIA はセグメント化フィルターに対応しています。 セグメント化フィルターは、IWiaSegmentationFilter インターフェイスを実装する必要があります。
IWiaSegmentationFilter インターフェイスは、このセクション全体で使用される新しい (Windows Vista 用) インターフェイスである IWiaItem2 に依存しています。これは IWiaItem のスーパーセットです。 IWiaItem メソッドに加え、IWiaItem2 インターフェイスにはセグメント化フィルターを含む WIA 拡張機能を作成するためにアプリケーションによって使用される IWiaItem2::GetExtension メソッドが含まれています。 IWiaItem インターフェイスと IWiaItem2 インターフェイスについては、Microsoft Windows SDK のドキュメントで説明しています。
IWiaSegmentationFilter インターフェイスは、単一ののメソッドとして DetectRegions を実装します。 このメソッドには、lFlags、pInputStream、および 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_YPOS、WIA_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::CreateChildItem の lFlags パラメーターに対応します。 前のコード スニペットに示すように、lCreationFlags パラメーターを持つCOPY_PARENT_PROPERTY_VALUESを WIA サービスに渡すと、子項目のすべての読み取り/書き込み可能 WIA プロパティを親と同じ値に設定するように WIA サービスに指示します。 新しく作成された子項目のイメージ形式や解像度などのプロパティが親アイテムであることを確認するため、セグメント化フィルターでこのフラグを渡す必要があります。 セグメント化フィルターが子項目に設定するエクステント プロパティはイメージの解像度に依存するため、解像度が同じであることが重要です。 また、アプリケーションでプレビュー コンポーネントを使用する場合は、子項目でイメージの形式と解像度が同じであることが重要です (Microsoft Windows SDK のドキュメントで説明)。 最終的なイメージを取得する前に、アプリケーションは解像度を変更して、スキャナーからより高品質の画像を取得できます。
セグメント化フィルターは、実行できることとできないことについてアプリケーションと同じ制限が発生します。 つまり、アプリケーションはセグメント化フィルターによって作成される子項目を変更できることを意味します。 たとえば、セグメント化フィルターが検出された領域にユーザーが満足せず、角をドラッグしてこの領域を変更するようにアプリケーションに指示する場合が該当します。 アプリケーションでは、セグメント化フィルターによって作成された子項目を削除したり、新しい項目を追加したりすることもできます。
セグメント化フィルターは、作成した子項目の "クリーンアップ" は担いません。 そのため、アプリケーションが IWiaSegmentationFilter::DetectRegions を複数回呼び出す場合、アプリケーションは最初に IWiaSegmentationFilter::DetectRegions メソッドの最初の呼び出しで作成された子項目を削除する必要があります。 セグメント化フィルターは、pInputStream パラメーターをリセットすることもありません。 アプリケーションは、セグメント化フィルターを呼び出す前に、シーク ポインターがストリームの先頭に設定されていることを確認する必要があります。
セグメント化フィルターは、フィルムアイテムとフラットベッドアイテムでのみ使用する必要があります。 フィルム スキャンの場合、スキャナーには固定フレームが付属することがよくあります。その場合、ドライバーは子項目を作成します (詳細については、WIA スキャナー項目ツリー レイアウトを参照してください)。 この場合、アプリケーションは、リージョンの検出と子項目の作成のためにセグメント化フィルターを呼び出しません。
ドライバーには、セグメント化フィルターが付属している場合は、フラット ベッドとフィルム WIA 項目の WIA_IPS_SEGMENTATION プロパティを実装する必要があります。 この読み取り専用プロパティには、ドライバーが設定する WIA_USE_SEGMENTATION_FILTER と WIA_DONT_USE_SEGMENTATION_FILTER の 2 つの有効な値があります。 このプロパティを使用すると、特定の項目の領域検出にドライバーのセグメント化フィルターを使用する必要があるかどうかをアプリケーションに知らせます。
スキャナーがフィルム スキャンに固定フレームを使用する場合は、このプロパティをフィルムアイテムのWIA_DONT_USE_SEGMENTATION_FILTERに設定します。 この場合、アプリケーションは、フィルムプレビューが取得された後にセグメント化フィルタを読み込もうとしないでください。代わりに、ドライバーによって作成された子項目を列挙する必要があります。 これらの子項目は、固定フレームを表します。
WIA 項目は IWiaSegmentationFilter::DetectRegions に渡されるため、セグメント化フィルターでは、項目のカテゴリ (フラットベッドやフィルム) に応じて異なるアルゴリズムを使用できます。 アイテムのカテゴリは、WIA_IPA_ITEM_CATEGORY プロパティに格納されます。
アプリケーションが pInputStream でイメージを取得してから IWiaSegmentationFilter::DetectRegions を呼び出す間に pWiaItem2 のプロパティを変更する場合、元のプロパティ設定 (つまり、ストリームの取得時にアイテムが持っていたプロパティ設定) を復元する必要があります。 これは、IWiaPropertyStorage::GetPropertyStream メソッドと IWiaPropertyStorage::SetPropertyStream メソッドを使用して行うことができます。 セグメント化フィルターに必要な情報が WIA 項目に存在する可能性があるものの、イメージ ヘッダーには格納されないことがこれらの変更を復元する必要がある理由です。 このような情報の例としては、WIA_IPS_XPOS、WIA_IPS_YPOS、およびWIA_IPS_ROTATIONプロパティに格納されているデータがあります。 IWiaPropertyStorage インターフェイスとそのメソッドについては、Microsoft Windows SDK のドキュメントで説明されています。
アプリケーションは、IWiaItem2::GetExtension を呼び出してセグメント化フィルターのインスタンスを取得します (Windows SDK のドキュメントで説明)。 通常、アプリケーションはプレビュー ウィンドウを表示する前にこのメソッドを呼び出します。 これは、ドライバーにセグメント化フィルターが付属していない可能性があるためです。その場合、UI では、[セグメント化の実行] などのサポートされていないボタンが表示されないことを認識する必要があります。