Partager via


Méthode IWiaSegmentationFilter::D etectRegions

Détermine les sous-régions d’une image disposées sur la plaque à plat afin que chacune des sous-régions puisse être acquise dans un élément d’image distinct.

Syntaxe

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

Paramètres

lFlags [in]

Type : LONG

Actuellement inutilisé. Doit être défini sur zéro (0).

pInputStream [in]

Type : IStream*

Spécifie un pointeur vers l’image d’aperçu IStream .

pWiaItem2 [in]

Type : IWiaItem2*

Spécifie un pointeur vers l’élément IWiaItem2 pour lequel pInputStream a été acquis. Le filtre de segmentation crée des éléments enfants pour cet élément.

Valeur retournée

Type : HRESULT

Si cette méthode réussit, elle retourne S_OK. Sinon, il retourne un code d’erreur HRESULT .

Notes

Cette méthode détermine les sous-régions de l’image représentée par pInputStream. Pour chaque sous-région détectée, il crée un élément enfant pour l’élément IWiaItem2 spécifié dans le paramètre pWiaItem2 . Pour chaque élément enfant, le filtre de segmentation doit définir des valeurs pour le rectangle englobant de la zone à analyser, à l’aide des constantes de propriété d’élément WIA du scanneur suivantes.

Un filtre plus avancé peut également nécessiter d’autres constantes de propriété d’élément WIA du scanneur , telles que WIA_IPS_DESKEW_X et WIA_IPS_DESKEW_Y, si le pilote prend en charge la déséquimodement.

Si l’application appelle IWiaSegmentationFilter::D etectRegions plusieurs fois, l’application doit d’abord supprimer les éléments enfants créés par le dernier appel à IWiaSegmentationFilter::D etectRegions.

Si une application modifie des propriétés en pWiaItem2, entre l’acquisition de l’image dans pInputStream et son appel à IWiaSegmentationFilter::D etectRegions, les propriétés d’origine (c’est-à-dire les propriétés que l’élément avait lors de l’acquisition du flux) doivent être restaurées. Vous pouvez effectuer cette opération par GetPropertyStream et SetPropertyStream.

L’application doit réinitialiser l’IStream si son appel passe le même flux dans le filtre de segmentation plusieurs fois. L’application doit également réinitialiser le flux après le téléchargement initial et avant d’appeler IWiaSegmentationFilter::D etectRegions.

Exemples

La segmentation effectue la détection de région sur le flux (pImageStream) passé dans DetectSubregions. Consultez la méthode GetExtension pour CreateSegmentationFilter utilisée dans cet exemple.

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 télécharge les données d’image à partir du scanneur en appelant la méthode GetNewPreview du composant d’aperçu. Il appelle ensuite DetectSubregions si l’utilisateur de l’application souhaite appeler le filtre de segmentation, ce qui crée un élément enfant sous pWiaItem2 pour chaque région qu’il détecte. Consultez IWiaSegmentationFilter::D etectRegions pour connaître la méthode DetectSubregions utilisée dans cet exemple.

Dans cet exemple, l’utilisateur de l’application définit m_bUseSegmentationFilter en cliquant sur une zone de case activée. Si l’application prend en charge cela, elle doit d’abord case activée que le pilote dispose d’un filtre de segmentation en appelant CheckExtension. Consultez GetNewPreview pour obtenir l’exemple de méthode CheckImgFilter qui montre comment procéder.

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

Spécifications

Condition requise Valeur
Client minimal pris en charge
Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge
Windows Server 2008 [applications de bureau uniquement]
En-tête
Wia.h
IDL
Wia.idl