IWiaSegmentationFilter ::D méthode etectRegions
Détermine les sous-régions d’une image disposées sur le plateau à plat afin que chacune des sous-régions puisse être acquise dans un élément d’image séparé.
Syntaxe
HRESULT DetectRegions(
[in] LONG lFlags,
[in] IStream *pInputStream,
[in] IWiaItem2 *pWiaItem2
);
Paramètres
-
lFlags [ dans]
-
Type : long
Actuellement inutilisé. Doit être défini sur zéro (0).
-
pInputStream [ dans]
-
Type : IStream*
Spécifie un pointeur vers l’image IStream preview.
-
pWiaItem2 [ dans]
-
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 est réussie, elle retourne la valeur _ OK. Sinon, elle retourne un code d’erreur HRESULT .
Remarques
Cette méthode détermine les sous-régions de l’image représentée par pInputStream. Pour chaque sous-région qu’il détecte, 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 scanneursuivantes.
Un filtre plus avancé peut également nécessiter d’autres constantes de propriété d’élément de scanneur WIA , telles que la suppression d’une déformation des adresses IP WIA _ _ _ X et les adresses IP WIA avec la _ _ réalignement _ Y, si le pilote prend en charge l’annulation de l’inclinaison.
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 (autrement dit, les propriétés de l’élément lors de l’acquisition du flux) doivent être restaurées. Cela peut être effectué 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 la 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 de l’image à partir du scanneur en appelant la méthode GetNewPreview du composant de prévisualisation. 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 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 case à cocher. Si l’application prend en charge cette option, elle doit d’abord vérifier que le pilote possède 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;
}
Configuration requise
| Condition requise | Valeur |
|---|---|
| Client minimal pris en charge |
Windows [Applications de bureau Vista uniquement] |
| Serveur minimal pris en charge |
Windows Serveur 2008 [ applications de bureau uniquement] |
| En-tête |
|
| MIDL |
|