次の方法で共有


例: 既定のセグメンテーション フィルター

ドライバーには、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.
        //
        ...
    }
    ...
}