Interfaces pour les filtres de segmentation
À compter de Windows Vista, WIA prend en charge les filtres de segmentation. Un filtre de segmentation doit implémenter l’interface IWiaSegmentationFilter.
L’interface IWiaSegmentationFilter dépend de la nouvelle interface (pour Windows Vista) IWiaItem2, qui est utilisée tout au long de cette section, est un sur-ensemble d’IWiaItem. En plus des méthodes IWiaItem , l’interface IWiaItem2 inclut la méthode IWiaItem2::GetExtension, qui est utilisée par une application pour créer des extensions WIA, y compris le filtre de segmentation. Les interfaces IWiaItem et IWiaItem2 sont décrites dans la documentation Microsoft Windows SDK.
L’interface IWiaSegmentationFilter implémente une méthode unique, DetectRegions. Cette méthode a trois paramètres : lFlags, pInputStream et pWiaItem2.
Le paramètre lFlags n’est actuellement pas utilisé.
Le paramètre pInputStream est un pointeur vers l’image sur laquelle la segmentation doit être effectuée. En règle générale, il s’agit d’une image d’aperçu représentant l’ensemble de la surface de numérisation du lit plat. Le flux est créé par l’application dans sa méthode IWiaTransferCallback::GetNextStream ; cette méthode est appelée lors de l’acquisition d’images. Le pilote écrit les données d’image acquises dans le flux que la méthode IWiaTransferCallback::GetNextStream retourne. Il s’agit également du flux qui doit être passé dans le filtre de segmentation par l’application. L’interface IWiaTransferCallback est décrite dans la documentation du Kit de développement logiciel (SDK) Windows.
Le paramètre pWiaItem2 est un pointeur vers l’élément WIA pour lequel pInputStream a été acquis. Il est également appelé élément parent. Par exemple, l’élément vers lequel pWiaItem2 pointe peut être l’élément à plat.
La méthode IWiaSegmentationFilter::D etectRegions est utilisée pour déterminer les sous-régions de l’image représentée par pInputStream. Pour chaque sous-région détectée, IWiaSegmentationFilter::D etectRegions crée un élément WIA enfant sous l’élément pointé par pWiaItem2. Pour chaque élément enfant, le filtre de segmentation doit définir les valeurs des propriétés WIA suivantes : WIA_IPS_XPOS, WIA_IPS_YPOS, WIA_IPS_XEXTENT et WIA_IPS_YEXTENT. Ces propriétés représentent le rectangle englobant de la zone à analyser. Un filtre de segmentation plus avancé peut également vouloir définir d’autres propriétés WIA, telles que propriétés WIA pour les filtres de segmentation si le pilote prend en charge la dékewing.
Le diagramme suivant montre comment le filtre de segmentation modifie l’arborescence des éléments d’application. Dans ce diagramme, le filtre de segmentation a détecté trois images sur le lit plat et, pour chaque image, il a créé un nouvel élément enfant sous l’élément à plat.
Un filtre de segmentation doit prendre en charge tous les formats d’image pris en charge par le pilote qu’il étend. Le filtre de segmentation fourni par Microsoft prend en charge les formats BMP, GIF, JPEG, PNG et TIFF. Ainsi, tout pilote qui utilise ce filtre est limité à ces formats.
Pour créer les éléments enfants, le filtre de segmentation appelle la méthode IWiaItem2::CreateChildItem . Voici un exemple d’appel de ce type :
lItemFlags = WiaItemTypeGenerated | WiaItemTypeTransfer | WiaItemTypeImage | WiaItemTypeFile |
WiaItemTypeProgrammableDataSource;
lCreationFlags = COPY_PARENT_PROPERTY_VALUES;
pWiaItem2->CreateChildItem(lItemFlags,
lCreationFlags,
bstrItemName,
&pChildItem);
IWiaItem2::CreateChildItem diffère légèrement de IWiaItem::CreateChildItem. La méthode IWiaItem2::CreateChildItem a un nouveau paramètre, lCreationFlags ; Le paramètre lItemFlags de la méthode IWiaItem2::CreateChildItem correspond au paramètre lFlags de IWiaItem::CreateChildItem. Le passage de COPY_PARENT_PROPERTY_VALUES avec le paramètre lCreationFlags au service WIA, comme indiqué dans l’extrait de code précédent, indique au service WIA de définir toutes les propriétés WIA lisibles/en écriture de l’élément enfant sur les mêmes valeurs que celles de son parent. La raison pour laquelle un filtre de segmentation doit passer cet indicateur est de s’assurer que les propriétés, telles que le format d’image et la résolution dans l’élément enfant nouvellement créé, sont l’élément parent. Il est important que la résolution soit la même, car les propriétés d’étendue que le filtre de segmentation définira dans l’élément enfant dépendent de la résolution de l’image. Il est également important que le format et la résolution de l’image soient identiques dans l’élément enfant si une application souhaite utiliser le composant d’aperçu (décrit dans la documentation Microsoft Windows SDK). Avant d’acquérir l’image finale, une application peut modifier la résolution pour obtenir une image de qualité supérieure à partir du scanneur.
Il est important de noter que le filtre de segmentation est lié par les mêmes restrictions qu’une application dans ce qu’elle peut et ne peut pas faire. Cela signifie qu’une application peut modifier les éléments enfants créés par le filtre de segmentation. Par exemple, un utilisateur peut ne pas être satisfait de la région détectée par le filtre de segmentation et peut indiquer à l’application de modifier cette région en faisant glisser ses coins. L’application peut également supprimer des éléments enfants créés par le filtre de segmentation et en ajouter de nouveaux.
Notez que le filtre de segmentation n’est pas responsable du « nettoyage » des éléments enfants qu’il a créés. Par conséquent, si l’application appelle IWiaSegmentationFilter::D etectRegions plusieurs fois, l’application doit d’abord supprimer les éléments enfants créés lors du premier appel à la méthode IWiaSegmentationFilter::D etectRegions . Le filtre de segmentation n’est pas non plus responsable de la réinitialisation du paramètre pInputStream . L’application doit s’assurer qu’elle a défini le pointeur de recherche sur le début du flux avant d’appeler le filtre de segmentation.
Le filtre de segmentation doit être utilisé uniquement sur l’élément de film et sur l’élément à plat. Pour la numérisation de film, un scanneur est souvent fourni avec des images fixes, auquel cas le pilote crée les éléments enfants (pour plus d’informations, reportez-vous à LA disposition de l’arborescence de l’élément du scanneur WIA ). Dans ce cas, une application ne doit pas appeler le filtre de segmentation pour la détection de région et la création d’éléments enfants.
Si un pilote est fourni avec un filtre de segmentation, il doit implémenter la propriété WIA_IPS_SEGMENTATION pour ses éléments WIA à plat et film. Cette propriété en lecture seule a deux valeurs valides : WIA_USE_SEGMENTATION_FILTER et WIA_DONT_USE_SEGMENTATION_FILTER, que le pilote définit. Cette propriété permet à une application de savoir si elle doit utiliser le filtre de segmentation du pilote pour la détection de région sur un élément donné.
Si un scanneur utilise des images fixes pour la numérisation de film, il définit cette propriété sur WIA_DONT_USE_SEGMENTATION_FILTER dans l’élément de film. Dans ce cas, l’application ne doit pas essayer de charger le filtre de segmentation après l’acquisition de l’aperçu du film ; au lieu de cela, il doit énumérer les éléments enfants créés par le pilote. Ces éléments enfants représentent les images fixes.
Étant donné qu’un élément WIA est passé dans IWiaSegmentationFilter::D etectRegions, il est possible pour le filtre de segmentation d’utiliser différents algorithmes en fonction de la catégorie de l’élément, c’est-à-dire à plat ou film. La catégorie d’un élément est stockée dans la propriété WIA_IPA_ITEM_CATEGORY .
Si une application modifie des propriétés dans pWiaItem2 entre l’acquisition de l’image dans pInputStream et l’appel de l’application à IWiaSegmentationFilter::D etectRegions, les paramètres de propriété d’origine (c’est-à-dire les paramètres de propriété que l’élément avait lors de l’acquisition du flux) doivent être restaurés. Pour ce faire, utilisez les méthodes IWiaPropertyStorage::GetPropertyStream et IWiaPropertyStorage::SetPropertyStream . La raison pour laquelle ces modifications doivent être restaurées est qu’il peut y avoir dans l’élément WIA des informations nécessaires pour le filtre de segmentation, mais qui ne sont pas stockées dans l’en-tête d’image. Les données stockées dans les propriétés WIA_IPS_XPOS, WIA_IPS_YPOS et WIA_IPS_ROTATION sont des exemples de telles informations. L’interface IWiaPropertyStorage et ses méthodes sont décrites dans la documentation du Kit de développement logiciel (SDK) Windows.
Une application obtient une instance du filtre de segmentation en appelant IWiaItem2::GetExtension (décrit dans la documentation du Kit de développement logiciel (SDK) Windows. Une application appelle généralement cette méthode avant d’afficher sa fenêtre d’aperçu. Cela est dû au fait qu’un pilote peut ne pas être accompagné d’un filtre de segmentation, auquel cas l’interface utilisateur doit savoir de ne pas afficher un bouton non pris en charge, tel que Effectuer une segmentation.