Compartir a través de


Ejemplo: Filtro de segmentación predeterminado

No es necesario que un controlador tenga su propio filtro de segmentación para aprovechar el filtro de segmentación de Microsoft, siempre y cuando implemente la propiedad WIA_IPS_SEGMENTATION. Otra posibilidad es que un IHV proporcione su propio filtro de segmentación, que durante ciertas circunstancias llama al filtro de segmentación WIA predeterminado de Microsoft. Por ejemplo, un IHV podría querer proporcionar un filtro de segmentación muy específico del dispositivo para la detección de varias regiones durante el examen de película y usar el filtro de segmentación proporcionado por Microsoft durante los exámenes desde el plano. Para ello, un filtro de segmentación WIA de IHV solo necesita crear CLSID_WiaDefaultSegFilter, que implementa IWiaSegmentationFilter; el filtro de segmentación llamaría a DetectRegions. En el ejemplo de código siguiente se muestra cómo se puede hacer esto.

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