Condividi tramite


Metodo IWiaSegmentationFilter::D etectRegions

Determina le sotto-aree di un'immagine disposte sul piatto piatto in modo che ogni area secondaria possa essere acquisita in un elemento immagine separato.

Sintassi

HRESULT DetectRegions(
  [in] LONG      lFlags,
  [in] IStream   *pInputStream,
  [in] IWiaItem2 *pWiaItem2
);

Parametri

lFlags [in]

Tipo: LONG

Attualmente inutilizzato. Deve essere impostato su zero.

pInputStream [in]

Tipo: IStream*

Specifica un puntatore all'immagine di anteprima IStream .

pWiaItem2 [in]

Tipo: IWiaItem2*

Specifica un puntatore all'elemento IWiaItem2 per il quale è stato acquisito pInputStream . Il filtro di segmentazione crea elementi figlio per questo elemento.

Valore restituito

Tipo: HRESULT

Se questo metodo ha esito positivo, restituisce S_OK. In caso contrario, restituisce un codice di errore HRESULT .

Commenti

Questo metodo determina le aree secondarie dell'immagine rappresentata da pInputStream. Per ogni area secondaria rilevata, crea un elemento figlio per l'elemento IWiaItem2 specificato nel parametro pWiaItem2 . Per ogni elemento figlio, il filtro di segmentazione deve impostare i valori per il rettangolo di delimitazione dell'area da analizzare, utilizzando le costanti della proprietà Dell'elemento WIA scanner seguenti.

Un filtro più avanzato può richiedere anche altre costanti delle proprietà dell'elemento WIA scanner , ad esempio WIA_IPS_DESKEW_X e WIA_IPS_DESKEW_Y, se il driver supporta la desimmetria.

Se l'applicazione chiama IWiaSegmentationFilter::D etectRegions più volte, l'applicazione deve prima eliminare gli elementi figlio creati dall'ultima chiamata a IWiaSegmentationFilter::D etectRegions.

Se un'applicazione modifica le proprietà in pWiaItem2, tra l'acquisizione dell'immagine in pInputStream e la relativa chiamata a IWiaSegmentationFilter::D etectRegions, devono essere ripristinate le proprietà originali, ovvero le proprietà che l'elemento aveva quando è stato acquisito il flusso. Questa operazione può essere eseguita da GetPropertyStream e SetPropertyStream.

L'applicazione deve reimpostare IStream se la chiamata passa lo stesso flusso al filtro di segmentazione più volte. L'applicazione deve anche reimpostare il flusso dopo il download iniziale e prima di chiamare IWiaSegmentationFilter::D etectRegions.

Esempio

La segmentazione esegue il rilevamento dell'area nel flusso (pImageStream) passato in DetectSubregions. Vedere il metodo GetExtension per CreateSegmentationFilter usato in questo esempio.

HRESULT
DetectSubregions(
   IN IStream   *pImageStream,
   IN IWiaItem2 *pWiaItem2)
{
   HRESULT                 hr                  = S_OK;
   IWiaSegmentationFilter* pSegmentationFilter = NULL;

   if (!pWiaItem2 || !pImageStream)
   {
      hr = E_INVALIDARG;
   }

   if (SUCCEEDED(hr))
   {
      hr = CreateSegmentationFilter(pWiaItem2, &pSegmentationFilter);
   }

   if (SUCCEEDED(hr))
   {
      hr = pSegmentationFilter->DetectRegions(0,pImageStream, pWiaItem2); 
   }

   if (pSegmentationFilter)
   {
      pSegmentationFilter->Release();
      pSegmentationFilter = NULL;
   }

   return hr;
}

DownloadPreviewImage scarica i dati dell'immagine dallo scanner chiamando il metodo GetNewPreview del componente di anteprima. Chiama quindi DetectSubregions se l'utente dell'applicazione vuole richiamare il filtro di segmentazione, che crea un elemento figlio in pWiaItem2 per ogni area rilevata. Vedere IWiaSegmentationFilter::D etectRegions per il metodo DetectSubregions usato in questo esempio.

In questo esempio l'utente dell'applicazione imposta m_bUseSegmentationFilter facendo clic su una casella di controllo. Se l'applicazione supporta questa operazione, verificare prima di tutto che il driver disponga di un filtro di segmentazione chiamando CheckExtension. Vedere GetNewPreview per l'esempio di metodo CheckImgFilter che mostra come eseguire questa operazione.

HRESULT
DownloadPreviewImage(
   IN IWiaItem2 *pWiaFlatbedItem2)
{
   HRESULT hr              = S_OK;
   BOOL    bHasImgFilter   = FALSE;

   IWiaTransferCallback *pAppWiaTransferCallback = NULL;

   hr = CheckImgFilter(pWiaFlatbedItem2, &bHasImgFilter)

   if (SUCCEEDED(hr))
   {
      if (bHasImgFilter)
      {
         IWiaPreview *pWiaPreview = NULL;

         // In this example, the AppWiaTransferCallback class implements 
         // the IWiaTransferCallback interface.  
         // The constructor of AppWiaTransferCallback sets the reference count 
         // to 1.
         pAppWiaTransferCallback = new AppWiaTransferCallback();

         hr = pAppWiaTransferCallback ? S_OK : E_OUTOFMEMORY;

         if (SUCCEEDED(hr))
         {
            // Acquire image from scanner
            hr = m_pWiaPreview->GetNewPreview(pWiaFlatbedItem2,
                                              0,
                                              pAppWiaTransferCallback);    
         }

         //
         // Check the application UI for whether the user wants
         // to use the segmentation filter indicated by the value 
         // of m_bUseSegmentationFilter.
         //
         // m_FlatbedPreviewStream is the stream that
         // AppWiaTransferCallback::GetNextStream returned for the
         // flatbed item.
         // This stream is where the image data is stored after
         // the successful return of GetNewPreview.
         // The stream is passed into the segmentation filter
         // for region detection.
         if (SUCCEEDED(hr) && m_bUseSegmentationFilter)
         {
            DetectSubregions(m_FlatbedPreviewStream, pWiaFlatbedItem2);
         }

         if (pAppWiaTransferCallback)
         {
            // If the call to GetNewPreview was successful, the
            // preview component calls AddRef on the callback so
            // this call doesn't delete the object.

            pAppWiaTransferCallback->Release();
         }

      }
      else
      {
         // Do not create an instance of preview component if the driver 
         // does not come with an image-processing filter.
         // You can use a segmentation filter, however, if the driver
         // comes with one (omitted here).
      }
   }

   return hr;
}

Requisiti

Requisito Valore
Client minimo supportato
Windows Vista [solo app desktop]
Server minimo supportato
Windows Server 2008 [solo app desktop]
Intestazione
Wia.h
IDL
Wia.idl