Condividi tramite


Esempio: Filtro di segmentazione predefinito

Non è necessario che un driver disponga di un proprio filtro di segmentazione per sfruttare il filtro di segmentazione Microsoft, purché implementi la proprietà WIA_IPS_SEGMENTATION. Un'altra possibilità è che un IHV fornisca un proprio filtro di segmentazione, che durante determinate circostanze chiama nel filtro di segmentazione WIA predefinito Microsoft. Ad esempio, un IHV potrebbe voler fornire un filtro di segmentazione molto specifico del dispositivo per il rilevamento in più aree durante l'analisi del film e usare il filtro di segmentazione fornito da Microsoft durante le analisi dal letto piatto. A tale scopo, un filtro di segmentazione WIA IHV deve creare solo CLSID_WiaDefaultSegFilter, che implementa IWiaSegmentationFilter. Il filtro di segmentazione chiamerà quindi DetectRegions. Nell'esempio di codice seguente viene illustrato come eseguire questa operazione.

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