Partager via


Exemple : Filtre de segmentation par défaut

Un pilote n’est pas obligé 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 vouloir fournir un filtre de segmentation très spécifique à l’appareil pour la détection multirégion pendant l’analyse de film et utiliser le filtre de segmentation fourni par Microsoft lors des analyses à partir du lit plat. Pour ce faire, un filtre de segmentation WIA IHV doit uniquement créer CLSID_WiaDefaultSegFilter, qui implémente IWiaSegmentationFilter ; le filtre de segmentation appelle alors 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.
        //
        ...
    }
    ...
}