Freigeben über


Beispiel: Standardsegmentierungsfilter

Ein Treiber muss nicht über einen eigenen Segmentierungsfilter verfügen, um den Microsoft-Segmentierungsfilter zu nutzen, solange er die WIA_IPS_SEGMENTATION-Eigenschaft implementiert. Eine andere Möglichkeit besteht darin, dass ein IHV einen eigenen Segmentierungsfilter bereitstellt, der unter bestimmten Umständen den Microsoft-Standard-WIA-Segmentierungsfilter aufruft. Beispielsweise kann ein IHV einen sehr gerätespezifischen Segmentierungsfilter für die Erkennung mehrerer Regionen während der Filmscans bereitstellen und den segmentierungsfilter verwenden, der von Microsoft bei Scans vom Flachbett bereitgestellt wird. Dazu muss ein IHV-WIA-Segmentierungsfilter nur CLSID_WiaDefaultSegFilter erstellen, wodurch IWiaSegmentationFilter implementiert wird. Der Segmentierungsfilter würde dann DetectRegions aufrufen. Das folgende Codebeispiel zeigt, wie dies geschehen kann.

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.
        //
        ...
    }
    ...
}