Compartilhar via


Método IWiaSegmentationFilter::D etectRegions

Determina as sub-regiões de uma imagem disposta no flatbed platen para que cada uma das sub-regiões possa ser adquirida em um item de imagem separado.

Sintaxe

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

Parâmetros

lFlags [in]

Tipo: LONG

Atualmente não utilizado. Deve ser definido como zero.

pInputStream [in]

Tipo: IStream*

Especifica um ponteiro para a imagem de visualização do IStream .

pWiaItem2 [in]

Tipo: IWiaItem2*

Especifica um ponteiro para o item IWiaItem2 para o qual pInputStream foi adquirido. O filtro de segmentação cria itens filho para este item.

Valor retornado

Tipo: HRESULT

Se esse método for bem-sucedido, ele retornará S_OK. Caso contrário, ele retornará um código de erro HRESULT .

Comentários

Esse método determina as sub-regiões da imagem representada por pInputStream. Para cada sub-região detectada, ele cria um item filho para o item IWiaItem2 especificado no parâmetro pWiaItem2 . Para cada item filho, o filtro de segmentação deve definir valores para o retângulo delimitador da área a ser verificado, usando as seguintes Constantes de Propriedade de Item wia do scanner.

Um filtro mais avançado também pode exigir outras constantes de propriedade de item wia do scanner , como WIA_IPS_DESKEW_X e WIA_IPS_DESKEW_Y, se o driver der suporte à desanexação.

Se o aplicativo chamar IWiaSegmentationFilter::D etectRegions mais de uma vez, o aplicativo deverá primeiro excluir os itens filho criados pela última chamada para IWiaSegmentationFilter::D etectRegions.

Se um aplicativo alterar as propriedades em pWiaItem2, entre adquirir a imagem em pInputStream e sua chamada para IWiaSegmentationFilter::D etectRegions, as propriedades originais (ou seja, as propriedades que o item tinha quando o fluxo foi adquirido) deverão ser restauradas. Isso pode ser feito por GetPropertyStream e SetPropertyStream.

O aplicativo deve redefinir o IStream se sua chamada passar o mesmo fluxo para o filtro de segmentação mais de uma vez. O aplicativo também deve redefinir o fluxo após o download inicial e antes de chamar IWiaSegmentationFilter::D etectRegions.

Exemplos

A segmentação executa a detecção de região no fluxo (pImageStream) passado para DetectSubregions. Consulte o método GetExtension for CreateSegmentationFilter usado neste exemplo.

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 baixa dados de imagem do verificador chamando o método GetNewPreview do componente de visualização. Em seguida, ele chama DetectSubregions se o usuário do aplicativo quiser invocar o filtro de segmentação, que cria um item filho em pWiaItem2 para cada região detectada. Consulte IWiaSegmentationFilter::D etectRegions para o método DetectSubregions usado neste exemplo.

Neste exemplo, o usuário do aplicativo define m_bUseSegmentationFilter clicando em uma caixa marcar. Se o aplicativo der suporte a isso, ele deverá primeiro marcar que o driver tenha um filtro de segmentação chamando CheckExtension. Consulte GetNewPreview para obter o exemplo de método CheckImgFilter que mostra como isso pode ser feito.

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;
}

Requisitos

Requisito Valor
Cliente mínimo com suporte
Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte
Windows Server 2008 [somente aplicativos da área de trabalho]
Cabeçalho
Wia.h
IDL
Wia.idl