Utiliser la librairie Windows Image Acquisition en VBADate de publication : 30.07.2006 , Date de mise à jour : 18.09.2006
Par
SilkyRoad (silkyroad.developpez.com) Bbil (Bbil.developpez.com)
Ce document présente l'utilisation de la librairie Windows Image Acquisition Automation Library v2.0 ( WIA)
.
Cette librairie permet de manipuler les images.
Les informations et les exemples proposés sont en partie issus des samples VB6 fournis lors du téléchargement de la librairie (wiaaut.dll),
et adaptés pour une utilisation en VBA Excel.
I. Préambule
II. Manipuler les images
II-A. L'utilisation des filtres
II-A-1. Lister tous les filtres disponibles et afficher une description pour chacun d'entre eux
II-A-1-a. RotateFlip / Rotations et Retournements
II-A-1-b. Crop / Couper
II-A-1-c. Scale / Redimensionner
II-A-1-d. Stamp / Fusionner
II-A-1-e. Exif
II-A-1-f. Frame
II-A-1-g. ARGB
II-A-1-h. Convertir
II-A-2. Comment utiliser les filtres
II-A-3. Redimensionner une image
II-A-4. Combiner deux images pour en créer une nouvelle
II-A-5. Fusionner Deux images verticalement
II-A-6. Couper / Rogner une image
II-A-7. Créer une image TIFF type multi-frame (multi-page)
II-B. Les propriétés des images
II-B-1. Lister les propriétés d'une image
II-B-2. Créer un nouveau TAG dans une image
II-B-3. Vérifier si un fichier GIF est de type animé ou standard
III. Gérer les WebCams
III-A. Comment visualiser les images d'une WebCam dans un UserForm
III-B. Capturer une image de la webCam
IV. Le contrôle CommonDialog de WIA
IV-A. Présentation
IV-B. Assistant Impression de photographies
IV-C. Acquisition Image Scanner/WebCam
IV-D. Assistant Scanner appareil photo
V. Téléchargements
VI. Remerciements
I. Préambule
Tout d'abord, voici un résumé des manipulations possibles:
* Accéder aux propriétés d'un fichier image.
* Lire et modifier les fichiers image,ainsi que leurs propriétés.
* Manipuler les images: Rotation, Retournement, Rognage, Fusion, Compression, Conversion, redimensionnement, Décomposition des frames d'une image(par exemple d'un GIF animé)...
* Visualiser et gérer les images des webCams, appareils photos numériques et scanners connectées à votre PC.
La Bibliothèque WIA est principalement conçue pour gérer les formats d'image PNG, BMP, JPG, GIF et TIFF.
Les autres formats sont à tester en fonction de votre système d'exploitation.
Téléchargez la librairie si elle n'est pas installée sur votre poste:
Le lien sur le site Microsoft
Et suivez les conseils d'installation fournis dans le fichier d'aide ReadMe.txt
 |
La configuration minimale nécessaire: Windows XP
|
Les exemples suivants ont été Testés avec WinXP et Excel2002 / Excel2000.
II. Manipuler les images
II-A. L'utilisation des filtres
Ce chapitre décrit les filtres disponibles et présente
quelques exemples d'utilisation.
II-A-1. Lister tous les filtres disponibles et afficher une description pour chacun d'entre eux
| Vb | Sub listerInformationsGeneralesFiltres()
Dim x As Integer
Dim IP As ImageProcess
Set IP = CreateObject("WIA.ImageProcess")
For x = 1 To IP.FilterInfos.Count
Debug.Print "--> " & IP.FilterInfos(x).Name & ":"
Debug.Print IP.FilterInfos(x).Description
Debug.Print vbCrLf & "**************" & vbCrLf & vbCrLf
Next x
End Sub |
Remarque:
Les descriptions sont en anglais.
Les sous chapitres suivants sont la traduction du résultat de la macro "listerInformationsGeneralesFiltres".
N'hésitez pas à m'avertir si j'ai fait des erreurs dans la traduction...;o)
II-A-1-a. RotateFlip / Rotations et Retournements
Permet d'effectuer des rotations (par 90 degrés), ainsi que des retournements horizontaux et verticaux.
RotationAngle -
Propriété pour effectuer une rotation de 90, 180, ou 270 degrés. La valeur par défaut est 0.
FlipHorizontal -
Propriété pour appliquer un retournement horizontal si la valeur True est attribuée. La valeur par défaut est False.
FlipVertical -
Propriété pour appliquer un retournement vertical si la valeur True est attribuée. La valeur par défaut est False.
FrameIndex -
Propriété pour indiquer l'index d'un Frame, dans le cas ou vous souhaiteriez modifier un Frame autre que le Frame actif. La valeur par défaut est 0.
II-A-1-b. Crop / Couper
Couper / Rogner une image en fonction des valeurs indiquées.
Left -
Définit la position à partir du bord gauche de l'image pour la coupe (valeur en pixels). La valeur par défaut est 0.
Top -
Définit la position à partir du bord supérieur de l'image pour la coupe (valeur en pixels). La valeur par défaut est 0.
Right -
Définit la position à partir du bord droit de l'image pour la coupe (valeur en pixels). La valeur par défaut est 0.
Bottom -
Définit la position à partir du bord inférieur de l'image pour la coupe (valeur en pixels). La valeur par défaut est 0.
FrameIndex -
Propriété pour indiquer l'index d'un Frame, dans le cas ou vous souhaiteriez modifier un Frame autre que le Frame actif. La valeur par défaut est 0.
II-A-1-c. Scale / Redimensionner
Redimensionne une image en indiquant les hauteur et largeur maximum, tout en préservant les proportions si nécessaire.
MaximumWidth -
Définit la largeur maxi de l'image (en pixels).
MaximumHeight -
Définit la hauteur maxi de l'image (en pixels).
PreserveAspectRatio -
Appliquez la valeur True (Valeur par défaut) pour conserver les proportions.
Appliquez la valeur False pour que l'image s'étire en fonction des valeurs MaximumWidth et MaximumHeight.
FrameIndex -
Propriété pour indiquer l'index d'un Frame, dans le cas ou vous souhaiteriez modifier un Frame autre que le Frame actif. La valeur par défaut est 0.
II-A-1-d. Stamp / Fusionner
Fusionne 2 images à partir des coordonnées horizontales et verticales spécifiées.
ImageFile -
Définit l'image que vous souhaitez fusionner.
Left -
Définit la position horizontale par rapport au bord gauche de l'image (en pixels). La valeur par défaut est 0.
Top -
Définit la position verticale par rapport au bord supérieur de l'image (en pixels). La valeur par défaut est 0.
FrameIndex -
Propriété pour indiquer l'index d'un Frame, dans le cas ou vous souhaiteriez modifier un Frame autre que le Frame actif. La valeur par défaut est 0.
II-A-1-e. Exif
Ajoute ou supprime la propriété EXIF spécifiée.
Remove -
Indiquez la valeur True si vous souhaitez supprimer la propriété EXIF spécifiée. La valeur par défaut (False) permet d'ajouter la propriété EXIF spécifiée
ID -
Indique l'ID de la propriété que vous souhaitez ajouter ou supprimer.
Type -
Indique le type de valeur pour la propriété Exif que vous souhaitez ajouter (ignoré lors de l'utilisation la propriété Remove)
Value -
Indique la valeur de la donnée EXIF que vous souhaitez ajouter (ignoré lors de l'utilisation la propriété Remove)
FrameIndex -
Propriété pour indiquer l'index d'un Frame, dans le cas ou vous souhaiteriez modifier un Frame autre que le Frame actif. La valeur par défaut est 0.
II-A-1-f. Frame
Ajoute ou supprime le Frame spécifié.
Remove -
Indiquez la valeur True pour supprimer le Frame spécifié(par son index). La valeur par défaut (False) permet d'insérer une image avant le frame spécifié.
ImageFile -
Indique l'objet image du Frame actif que vous souhaitez ajouter. (ignoré lors de l'utilisation la propriété Remove)
FrameIndex -
Pour les suppressions, indiquez l'index du Frame à supprimer. pour les ajouts, le frame sera inséré avant l'index spécifié. La valeur par défaut est 0.
II-A-1-g. ARGB
Modifie les bits d'une image en fonction des données spécifiées.
ARGBData -
La propriété ARGBData Renvoie un vecteur de valeurs Long qui représente
les données ARGB ( canal Alpha &
couleurs RGB) du Frame spécifié.
FrameIndex -
Propriété pour indiquer l'index d'un Frame, dans le cas ou vous souhaiteriez modifier un Frame autre que le Frame actif.
La valeur par défaut est 0.
II-A-1-h. Convertir
Convertit l'image dans un type spécifié.
FormatID -
Indiquez le format souhaité pour la conversion. Les constantes disponibles sont: wiaFormatBMP, wiaFormatPNG, wiaFormatGIF, wiaFormatJPEG, ou wiaFormatTIFF.
Quality -
pour les fichiers JPEG, appliquez une valeur entre 1 to 100 pour spécifier la qualité de compression. La valeur par défaut = 100.
Compression -
Pour un fichier TIFF, indiquez les formats : CCITT3, CCITT4, RLE ou Uncompressed pour spécifier le mode de compression. La valeur par défaut est LZW.
II-A-2. Comment utiliser les filtres
Les exemples suivants sont en partie adaptés de
l'aide MSDN:
II-A-3. Redimensionner une image
| Vb | Sub redimensionnerImage()
Dim Img As WIA.ImageFile, IP As WIA.ImageProcess
Set Img = CreateObject("WIA.ImageFile")
Set IP = CreateObject("WIA.ImageProcess")
Img.LoadFile "C:\fourmiz.JPG"
IP.Filters.Add IP.FilterInfos("Scale").FilterID
IP.Filters(1).Properties("MaximumWidth") = 90
IP.Filters(1).Properties("MaximumHeight") = 90
Set Img = IP.Apply(Img)
Img.SaveFile "C:\fourmizThumbnail.JPG"
End Sub |
II-A-4. Combiner deux images pour en créer une nouvelle
Cette procédure permet de créer une nouvelle image à partir de 2 images existantes.
Remarque:
Dans cet exemple, la 2eme image va s'incruster dans la première à partir de l'angle inférieur droit.
Les dimensions de la 2eme image doivent donc etre plus petites que la premiere afin que celle ci ne soit pas totalement masquée.
| Vb | Sub combinerDeuxImages()
Dim Img1 As WIA.ImageFile, Img2 As WIA.ImageFile, IP As WIA.ImageProcess
Set Img1 = CreateObject("WIA.ImageFile")
Set Img2 = CreateObject("WIA.ImageFile")
Set IP = CreateObject("WIA.ImageProcess")
Img1.LoadFile ("C:\fourmiz.JPG")
Img2.LoadFile ("C:\fourmizThumbnail.JPG")
IP.Filters.Add (IP.FilterInfos("Stamp").FilterID)
IP.Filters(1).Properties("ImageFile") = Img2
IP.Filters(1).Properties("Left") = Img1.Width - Img2.Width
IP.Filters(1).Properties("Top") = Img1.Height - Img2.Height
Set Img1 = IP.Apply(Img1)
Img1.SaveFile ("C:\fourmiz_ImageCombinee.JPG")
End Sub |
II-A-5. Fusionner Deux images verticalement
Cet exemple permet de créer une nouvelle image à partir de 2 images existantes en appliquant une jointure bout à bout verticalement.
| Vb | Sub FusionVerticale_DeuxImages()
Dim Img1 As Object, Img2 As Object
Dim IP As ImageProcess
Dim Largeur As Long, Hauteur As Long
Dim V As Object, Img3 As Object
Dim C As Long
Dim i As Integer
Set Img1 = CreateObject("WIA.ImageFile")
Set Img2 = CreateObject("WIA.ImageFile")
Set IP = CreateObject("WIA.ImageProcess")
Img1.LoadFile ("C:\fourmiz.JPG")
Img2.LoadFile ("C:\fourmizThumbnail.JPG")
If Img1.Width > Img2.Width Then
Largeur = Img1.Width
Else
Largeur = Img2.Width
End If
Hauteur = Img1.Height + Img2.Height
C = &H80000004
Set V = CreateObject("WIA.Vector")
V.Add C
V.Add C
V.Add C
V.Add C
Set Img3 = V.ImageFile(2, 2)
Set IP = CreateObject("WIA.ImageProcess")
IP.Filters.Add IP.FilterInfos("Scale").FilterID
IP.Filters(1).Properties("MaximumWidth") = Largeur
IP.Filters(1).Properties("MaximumHeight") = Hauteur
IP.Filters(1).Properties("PreserveAspectRatio") = False
Set Img3 = IP.Apply(Img3)
For i = 1 To IP.Filters.Count
IP.Filters.Remove i
Next i
IP.Filters.Add (IP.FilterInfos("Stamp").FilterID)
IP.Filters(1).Properties("ImageFile") = Img1
IP.Filters(1).Properties("Left") = 0
IP.Filters(1).Properties("Top") = 0
Set Img3 = IP.Apply(Img3)
IP.Filters(1).Properties("ImageFile") = Img2
IP.Filters(1).Properties("Left") = 0
IP.Filters(1).Properties("Top") = Img1.Height
IP.Filters.Add IP.FilterInfos("Convert").FilterID
IP.Filters(2).Properties("FormatID").Value = wiaFormatJPEG
IP.Filters(2).Properties("Quality").Value = 90
Set Img3 = IP.Apply(Img3)
Img3.SaveFile ("C:\resultat_Fusion_Deux_images.jpg")
End Sub |
II-A-6. Couper / Rogner une image
L'exemple suivant permet de couper une image afin de n'en récupérer que
la partie supérieure gauche (Rapport 2/3).
| Vb | Sub couperImage()
Dim Img1 As Object, IP As Object
Set Img1 = CreateObject("WIA.ImageFile")
Set IP = CreateObject("WIA.ImageProcess")
Img1.LoadFile ("C:\fourmiz.jpg")
IP.Filters.Add (IP.FilterInfos("Crop").FilterID)
IP.Filters(1).Properties("Left") = 0
IP.Filters(1).Properties("Top") = 0
IP.Filters(1).Properties("Right") = Img1.Width / 3
IP.Filters(1).Properties("Bottom") = Img1.Height / 3
Set Img1 = IP.Apply(Img1)
Img1.SaveFile ("C:\sauvegarde_Image_Coupee.jpg")
End Sub |
II-A-7. Créer une image TIFF type multi-frame (multi-page)
Cet exemple Crée une image TIFF type multi-frame, à partir de 3 images existantes
| Vb | Sub creationImage_Multipage()
Dim Img As ImageFile, Page2 As ImageFile, Page3 As ImageFile
Dim IP As ImageProcess
Dim v As Vector
Set Img = CreateObject("WIA.ImageFile")
Set Page2 = CreateObject("WIA.ImageFile")
Set Page3 = CreateObject("WIA.ImageFile")
Set IP = CreateObject("WIA.ImageProcess")
Img.LoadFile "C:\fourmiz.JPG"
Page2.LoadFile "C:\fourmiz_ImageCombinee.JPG"
Page3.LoadFile "C:\fourmizThumbnail.JPG"
IP.Filters.Add IP.FilterInfos("Frame").FilterID
Set IP.Filters(IP.Filters.Count).Properties("ImageFile") = Page2
IP.Filters.Add IP.FilterInfos("Frame").FilterID
Set IP.Filters(IP.Filters.Count).Properties("ImageFile") = Page3
IP.Filters.Add IP.FilterInfos("Convert").FilterID
IP.Filters(IP.Filters.Count).Properties("FormatID") = wiaFormatTIFF
Set Img = IP.Apply(Img)
Img.SaveFile "C:\monImageMultipage.tif"
End Sub |
Remarque :
TIFF est le seul format qui supporte la sauvegarde en multi-frames.
II-B. Les propriétés des images
II-B-1. Lister les propriétés d'une image
La librairie WIA permet d'extraire toutes les propriétés des images:
| Vb | Dim Img As ImageFile
Dim P As Property
Dim S As String
Set Img = CreateObject("WIA.imageFile")
Img.LoadFile ("C:\fourmiz.JPG")
For Each P In Img.Properties
S = P.Name & "(" & P.PropertyID & ") = "
If P.IsVector Then
S = S & " - vector data not emitted - "
ElseIf P.Type = RationalImagePropertyType Then
S = S & P.Value.Numerator & "/" & P.Value.Denominator
ElseIf P.Type = StringImagePropertyType Then
S = S & """" & P.Value & """"
Else
S = S & P.Value
End If
Debug.Print S
Next |
II-B-2. Créer un nouveau TAG dans une image
La macro précédente montre comment lire les propriétés d'une image, mais il est
aussi possible de les modifier.
Voici une procédure pour créer un nouveau TAG "Titre" dans une image.
Cet exemple utilise le filtre Exchangeable Image File (EXIF).
| Vb | Sub creation_TAG_TITRE_copieImage()
Dim Img As ImageFile
Dim IP As ImageProcess
Dim v As Vector
Dim i As Integer
Set Img = CreateObject("WIA.imageFile")
Set IP = CreateObject("WIA.imageProcess")
Set v = CreateObject("WIA.Vector")
Img.LoadFile "C:\fourmiz.JPG"
IP.Filters.Add IP.FilterInfos("Exif").FilterID
IP.Filters(1).Properties("ID") = 40091
IP.Filters(1).Properties("Type") = VectorOfBytesImagePropertyType
v.SetFromString "Test de TAG 'TITRE' : utilisation de WIA v2.0"
IP.Filters(1).Properties("Value") = v
Set Img = IP.Apply(Img)
Img.SaveFile "C:\fourmiz_Test_EXIF.JPG"
End Sub |
Ensuite allez dans l'explorateur Windows pour visualiser le résultat:
Faites un clic droit sur l'image "fourmiz_Test_EXIF.JPG"
Option Propriétés
Onglet Résumé (Description)
II-B-3. Vérifier si un fichier GIF est de type animé ou standard
La propriété IsAnimated permet de vérifier le format des images GIF.
| Vb |
Sub controleFormatImageGIF()
Dim objImage As WIA.ImageFile
Set objImage = CreateObject("WIA.ImageFile")
objImage.LoadFile ("C:\fichierImage.gif")
If objImage.IsAnimated Then
MsgBox "Gif animé"
Else
MsgBox "Gif standard"
End If
End Sub |
III. Gérer les WebCams
III-A. Comment visualiser les images d'une WebCam dans un UserForm
Rien de plus simple:
Quand la librairie wiaaut.dll est installée sur votre poste,
Cherchez les objets DeviceManager Class et VideoPreview Class dans la liste des contrôles supplémentaires.
Insérez les 2 objets dans votre USF.
Et ensuite utilisez cette procédure:
| Vb | Private Sub UserForm_Initialize()
DeviceManager1.RegisterEvent wiaEventDeviceConnected
DeviceManager1.RegisterEvent wiaEventDeviceDisconnected
End Sub |
III-B. Capturer une image de la webCam
Cet exemple nécessite d'ajouter un contrôle Image nommé "Image1" et un bouton
nommé "CommandButton1" dans l'UserForm. Le bouton permet de déclencher la
capture qui va ensuite s'afficher dans le contrôle Image.
| Vb | Option Explicit
Dim Di As DeviceInfo
Dim Dev As Device
Private Sub UserForm_Initialize()
DeviceManager1.RegisterEvent wiaEventDeviceConnected
DeviceManager1.RegisterEvent wiaEventDeviceDisconnected
Set Di = DeviceManager1.DeviceInfos.Item(1)
Set Dev = Di.Connect
If Dev.Type = VideoDeviceType Then
Set VideoPreview1.Device = Dev
End If
End Sub
Private Sub CommandButton1_Click()
Dim Itm As Item
Dim Img As ImageFile
Set Itm = Dev.ExecuteCommand(wiaCommandTakePicture)
If Not Itm Is Nothing Then
Set Img = Itm.Transfer
If Not Img Is Nothing Then
Set Image1.Picture = Img.FileData.Picture
End If
End If
End Sub |
IV. Le contrôle CommonDialog de WIA
IV-A. Présentation
La librairie Windows Image Acquisition possède son propre contrôle CommonDialog.
Celui-ci est accessible en utilisant la fonction CreateObject où en ajoutant le
contrôle "CommonDialog Class", disponible dans la liste des contrôles supplémentaires après
l'installation de WIA.
Pour limiter la confusion avec le contrôle "Microsoft Common Dialog control, Version 6",
le contrôle sera renommé wiaCDiag (plutôt que CommonDialog1, nom par défaut) dans les exemples
suivants.
IV-B. Assistant Impression de photographies
La méthode ShowPhotoPrintingWizard permet le lancement
de l'assistant "Impression de photographies" de windows XP.
Cet exemple est une adaptation de l'aide en ligne WIA (wiaaut.chm).
| ImpressionPhotos | Sub ImpressionPhotos()
Dim v As Vector
Dim WiaDlg As WIA.CommonDialog
Set WiaDlg = CreateObject("WIA.COMMONDIALOG")
Set v = CreateObject("WIA.Vector")
v.Add "C:\WINDOWS\Web\Wallpaper\Dune.jpg"
v.Add "C:\WINDOWS\Web\Wallpaper\Floraison.jpg"
v.Add "C:\WINDOWS\Web\Wallpaper\Radiance.jpg"
WiaDlg.ShowPhotoPrintingWizard v
Set v = Nothing
Set WiaDlg = Nothing
End Sub |
IV-C. Acquisition Image Scanner/WebCam
La méthode ShowAcquireImage permet l'acquisition d'une image en
provenance d'un scanner où
d'une WebCam. On peut l'utiliser en plaçant le contrôle Commondialog WIA sur un UserForm (ou une
Form en VB6).
La propriété Name permet de renommer le contrôle en wiaCDiag (plus explicite que le
CommonDialog1 standard).
PS: Notez le nombre de propriétés réduites au strict minimum, ce qui peut nous permettre
de l'identifier par rapport au nombre de propriétés beaucoup plus important du contrôle "Microsoft Common Dialog"
Placez ensuite des contrôles CommandButton et Image dans l'UserForm.
| Acquisition image | Option Explicit
Private Sub UserForm_Initialize()
Image1.PictureSizeMode = fmPictureSizeModeZoom
End Sub
Private Sub CommandButton1_Click()
Dim Img As ImageFile
Set Img = wiaCDiag.ShowAcquireImage
If Not Img Is Nothing Then
Set Image1.Picture = Img.FileData.Picture
End If
End Sub |
Lors du lancement de la procédure, l'écran de sélection des périphériques
WIA apparaît (si plusieurs périphériques sont disponibles).

La fenêtre suivante dépend du type de périphérique sélectionné.
Le périphérique WebCam

On retrouve la fenêtre standard WIA de capture photos. Le bouton "Obtenir la photo" permet
de retourner dans l'UserForm initial et d'afficher l'image capturée.
Le périphérique Scanner

On retrouve la fenêtre standard WIA de numérisation. Le bouton "Numériser" permet de
retourner dans l'UserForm initial et d'afficher l'image numérisée.
IV-D. Assistant Scanner appareil photo
La méthode ShowAcquisitionWizard permet de lancer l'assistant scanneur-appareil photo.
Celui-ci permet l'acquisition d'images en provenance d'un scanner ou d'une webcam,
puis d'enchaîner par l'enregistrement d'un fichier image. Cette procédure prend comme
paramètre un "Device", Device pouvant être obtenu par la méthode showSelectDevice.
| Vb | Dim MonDevice As Device
Set MonDevice = wiaCDiag.ShowSelectDevice
If Not (MonDevice Is Nothing) Then
wiaCDiag.ShowAcquisitionWizard MonDevice
End If |
Déroulement:
Sélectionnez un périphérique.

Acquisition d'image pour une WebCam:

Acquisition d'image pour un Scanner:

Sauvegarde du fichier
V. Téléchargements
VI. Remerciements
Merci à Bbil et
Khany pour leur relecture et leurs conseils avisés.
 
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|