Partager via


Exemple : filtre de segmentation par défaut

Un pilote n’est pas tenu d’avoir son propre filtre de segmentation pour tirer parti du filtre de segmentation Microsoft, tant qu’il implémente la propriété WIA_IPS_SEGMENTATION. Une autre possibilité est qu’un IHV fournisse son propre filtre de segmentation, qui, dans certaines circonstances, appelle le filtre de segmentation WIA par défaut de Microsoft. Par exemple, un IHV peut souhaiter fournir un filtre de segmentation très spécifique à l'appareil pour la détection multirégion pendant la numérisation du film et utiliser le filtre de segmentation fourni par Microsoft lors des numérisations à partir du plateau. Pour ce faire, un filtre de segmentation WIA IHV doit uniquement créer CLSID_WiaDefaultSegFilter, qui implémente IWiaSegmentationFilter ; le filtre de segmentation appelle ensuite DetectRegions. L’exemple de code suivant montre comment procéder.

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