例: 既定のセグメンテーション フィルター
ドライバーには、WIA_IPS_GMENTATION プロパティを実装している限り、Microsoft のセグメンテーション フィルターを利用するに当たり独自のセグメンテーション フィルターは必要ありません。 他にあり得る場合として、IHV が独自のセグメンテーション フィルターを提供する場合が挙げられます。このフィルターは、特定の状況で Microsoft の既定の WIA セグメンテーション フィルターを呼び出します。 たとえば、IHV では、フィルム スキャン中にマルチリージョン検出用でデバイスに特に固有となるセグメンテーション フィルターを用い、フラットベッドからのスキャン時には Microsoft によって提供されるセグメンテーション フィルターを使用します。 この場合、IHV WIA セグメンテーション フィルターは IWiaSegmentationFilter を実装する CLSID_WiaDefaultSegFilter を作成するだけで済むため、セグメンテーション フィルターは DetectRegions を呼び出します。 次のコード例は、その方法を示したものです。
STDMETHODIMP
SegFilter::DetectRegions(
IN LONG lFlags,
IN IStream *pInputStream,
IN IWiaItem2 *pWiaItem2)
{
HRESULT hr = S_OK;
GUID categoryGUID = {0};
BOOL bUseDefaultFilter = FALSE;
...
if (SUCCEEDED(hr))
{
ReadPropertyLong(pWiaItem2,
WIA_IPA_ITEM_CATEGORY,
&categoryGUID);
if (categoryGUID == WIA_CATEGORY_FILM)
{
bUseDefaultFilter = FALSE;
}
else if (categoryGUID == WIA_CATEGORY_FLATBED)
{
bUseDefaultFilter = TRUE;
}
else
{
//
// This scanner only comes with flatbed and film items.
//
hr = E_INVALIDARG;
}
}
...
if (SUCCEEDED(hr) && bUseDefaultFilter)
{
//
// This must be on the flatbed item - use the Microsoft Default WIA Segmentation Filter.
//
IWiaSegmentationFilter *pDefaultSegFilter = NULL;
hr = CoCreateInstance(CLSID_WiaDefaultSegFilter,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWiaSegmentationFilter,
reinterpret_cast<void **>(&pDefaultSegFilter));
if (SUCCEEDED(hr))
{
hr = pDefaultSegFilter->DetectRegions(lFlags, pInputStream, pWiaItem2);
}
if (pDefaultSegFilter)
{
pDefaultSegFilter->Release();
pDefaultSegFilter = NULL;
}
}
else if (SUCCEEDED(hr))
{
//
// This is on the film item - use the default WIA segmentation algorithm.
//
...
}
...
}