0% ont trouvé ce document utile (0 vote)
23 vues6 pages

Article

Transféré par

Bruno Voltz
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
23 vues6 pages

Article

Transféré par

Bruno Voltz
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Coder pour le fun : Regarde-moi ! Acquisition d'image Windows https://msdn.microsoft.com/fr-fr/library/bb469890.

aspx

Coder pour le fun : Regarde-moi ! Acquisition


d'image Windows
Consultez l'article en anglais

J'adore Goodwill. Si vous ne connaissez pas Goodwill, sachez qu'il s'agit d'une chaîne de magasins à but non lucratif, qui
collecte des dons et revend des articles au public. Lors de ma récente visite chez Goodwill (nous y allons au moins une fois par
semaine), j'ai remarqué cette petite webcam Logitech, au prix de 3,99 dollars. Très honnêtement, j'ai trouvé l'article un peu
trop cher, mais j'étais prêt à l'acheter de toute façon...

L'un des avantages de ces anciennes webcams Logitech est le suivant : pas de pilote à télécharger et prise en charge directe
des fonctions Windows Image Acquisition (WIA). WIA est une API intégrée à Windows, destinée à unifier l'acquisition d'images
provenant de toutes sortes de périphériques, y compris les scanneurs et les appareils photo. Cette API, plutôt élémentaire, est
un peu laborieuse. Cependant, après Windows XP SP1, la WIA Automation Layer est fournie avec une API COM plus simple,
conçue pour les développeurs VB6 et ASP. Vous pouvez télécharger cette couche à partir de MSDN et d'autres sites, car elle
diffusée gratuitement. La partie centrale de la couche est constituée du fichier wiaaut.dll , qui doit être copié dans le répertoire
system32 et enregistré à l'aide de la commande regsvr32 wiaaut.dll.

Sur cette page


Téléchargement de WIA à partir du site .NET
Prendre une photo
Téléchargement de l'image vers mon journal Web
Conclusion

Téléchargement de WIA à partir du site .NET


La bibliothèque d'automatisation wiaaut.dll COM peut être ajoutée au moyen de la commande Ajouter une référence à partir
de Visual Studio.NET 2005. Un wrapper .NET sera généré automatiquement. Seuls les périphériques dont les pilotes prennent
en charge WIA seront mis à disposition par le biais de cette interface. La plupart des appareils photo de marque connue
opèreront sans difficulté, mais d'autres modèles, moins courants, ne seront pas mentionnés. Si votre périphérique n'est pas
proposé dans l'interface Scanneurs et appareils photo du Panneau de configuration, voici une solution et un programme pour
l'y faire apparaître. Mon appareil photo est représenté dans l'illustration ci-après.

1 sur 6 24/02/2017 07:37


Coder pour le fun : Regarde-moi ! Acquisition d'image Windows https://msdn.microsoft.com/fr-fr/library/bb469890.aspx

Dans notre code, nous pouvons ajouter une instruction qui qualifie l'espace de noms, par exemple using WIA en C# ou
imports WIA en VB.NET pour avoir une dénomination plus explicite, qui facilite l'accès à ces classes et interfaces nouvellement
importées. Pour commencer, nous avons besoin d'obtenir un identificateur de périphérique. WIA distingue périphériques,
commandes et formats. Les périphériques sont de type appareil photo, scanneur ou vidéo. Les commandes sont des chaînes
comme « Prendre une photo » et les formats sont JPEG, BMP, etc.

Nous allons créer une instance de CommandDialogClass (à partir de l'espace de noms WIA qui vient d'être importé), puis nous
allons lui donner l'instruction de nous présenter une boîte de dialogue de sélection, où nous pourrons sélectionner un type
quelconque de périphérique. Vous pouvez limiter la liste aux périphériques vidéo ou scanneurs en modifiant l'énumération
WiaDeviceType transmise. La boîte de dialogue ne doit apparaître que lorsque l'utilisateur clique sur Configurer dans notre
application ou lorsque l'application a été démarrée avec des données de configuration non valides.

CommonDialogClass class1 = new CommonDialogClass();


Device d = class1.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true,false);
if (d != null)
{
settings.DeviceID = d.DeviceID;
settings.Save();
}
Dim class1 As CommonDialogClass = New CommonDialogClass
Dim d As Device = class1.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false)
If (Not (d) Is Nothing) Then
settings.DeviceID = d.DeviceID
settings.Save
End If

2 sur 6 24/02/2017 07:37


Coder pour le fun : Regarde-moi ! Acquisition d'image Windows https://msdn.microsoft.com/fr-fr/library/bb469890.aspx

Cette boîte de dialogue de sélection est intégralement fournie (fort heureusement !) par Windows et renvoie un périphérique.
Chaque périphérique possède un identificateur, que nous allons enregistrer dans notre classe de paramètres spécifiques de
l'utilisateur. Cette classe a été générée automatiquement par de nouvelles fonctionnalités de Visual Studio .NET 2005 qui
facilitent considérablement la gestion des paramètres. Dans l'Explorateur de solutions de Visual Studio, j'ai cliqué avec le
bouton droit sur le projet, puis j'ai sélectionné Paramètres. Une fois que j'ai indiqué les noms et les types de données des
paramètres que je devais enregistrer, Visual Studio 2005 a généré une classe présentant des propriétés fortement typées
comme DeviceID. L'enregistrement des paramètres est aussi plus aisé dans .NET 2.0. L'identificateur de périphérique de ma
webcam, {6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0003, est stocké dans mon répertoire utilisateur Documents And
Settings\Local Settings\Application Data\BlogWebcam.

Haut de page
Prendre une photo
Maintenant que nous avons enregistré un identificateur de périphérique dans le fichier de configuration, il nous faut établir la
connexion avec le périphérique et prendre une photo. Nous devons identifier le périphérique par le biais de son identificateur
sans ouvrir la boîte de dialogue, établir la connexion et maintenir l'instance du périphérique.

DeviceManager manager = new DeviceManagerClass();


Device d = null;
foreach (DeviceInfo info in manager.DeviceInfos)
{
if (info.DeviceID == settings.DeviceID)
{
d = info.Connect();
break;
}
}
Dim manager As DeviceManager = New DeviceManagerClass
Dim d As Device = Nothing
For Each info As DeviceInfo In manager.DeviceInfos
If (info.DeviceID = settings.DeviceID) Then
d = info.Connect
Exit For
End If
Next

3 sur 6 24/02/2017 07:37


Coder pour le fun : Regarde-moi ! Acquisition d'image Windows https://msdn.microsoft.com/fr-fr/library/bb469890.aspx

Nous voici revenus à notre point de départ, mais avec une instance de périphérique dans la variable d. La connexion sera
établie avec ce périphérique à chaque démarrage de la minuterie. Chaque périphérique dispose d'un ensemble de
commandes. Ces commandes sont bien connues et identifiées par des GUID dans le registre et dans l'aide de MSDN. Nous
nous intéressons à la commande Prendre une photo, qui a la valeur de chaîne GUID « AF933CAC-ACAD-11D2-
A093-00C04F72DC3C », mais l'interface COM présente également cette valeur dans la constante
CommandID.wiaCommandTakePicture. Une fois le périphérique bloqué pour notre usage, nous pouvons parcourir les
commandes associées pour la trouver afin de déterminer si elle est prise en charge par le périphérique ; nous pouvons aussi
l'appeler directement par le biais de Device.ExecuteCommand.

Item item = device.ExecuteCommand(CommandID.wiaCommandTakePicture);


Dim item As Item = device.ExecuteCommand(CommandID.wiaCommandTakePicture)

Une fois que nous avons appelé ExecuteCommand sur notre périphérique, un « élément» est renvoyé. Il ne s'agit pas d'un
élément ordinaire, mais d'un élément WIA. Chaque WIA peut inclure un nombre quelconque de formats d'image. Ces formats
sont également bien connus et apparaissent dans le registre. Plutôt que de procéder par pré-programmation, je préfère les
rechercher dans le démarrage de l'application.

Nous parcourons la liste des formats disponibles à la recherche de JPEG. J'aurais pu pré-programmer le GUID JPEG et ainsi
m'éviter cette recherche, mais cette petite manipulation me permet aussi de vous montrer comment vous repérer dans le
modèle objet WIA. Une fois JPEG identifié, nous appelons item.Transfer. Cette commande renvoie un fichier image, que nous
pouvons enregistrer sur le disque.

Item item = device.ExecuteCommand(CommandID.wiaCommandTakePicture);


foreach (string format in item.Formats)
{
if (format == jpegGuid)
{
WIA.ImageFile imagefile = item.Transfer(format) as WIA.ImageFile;
filename = GetFreeFileName();
if (string.IsNullOrEmpty(filename) == false)
{
imagefile.SaveFile(filename);
}
this.picLastImage.Load(filename);
return filename;
}
}
Dim item As Item = device.ExecuteCommand(CommandID.wiaCommandTakePicture)
For Each format As String In item.Formats
If (format = jpegGuid) Then
Dim imagefile As WIA.ImageFile = CType(item.Transfer(format),WIA.ImageFile)
filename = GetFreeFileName
If (String.IsNullOrEmpty(filename) = false) Then
imagefile.SaveFile(filename)
End If
Me.picLastImage.Load(filename)
Return filename
End If
Next

Accessoirement, j'ai également chargé l'image enregistrée dans un PictureBox sur mon WinForm et l'ai retournée à partir de la

4 sur 6 24/02/2017 07:37


Coder pour le fun : Regarde-moi ! Acquisition d'image Windows https://msdn.microsoft.com/fr-fr/library/bb469890.aspx

méthode TakePicture().

Haut de page
Téléchargement de l'image vers mon journal Web
Une fois la photo prise, que puis-je en faire ? Pourquoi ne pas la télécharger sous un nom de fichier déterminé vers mon blog
afin que le monde entier puisse la voir avec mon espace de travail ? Par le passé, la gestion d'un fichier sous FTP nécessitait la
mise en place d'une bibliothèque tierce. Aujourd'hui, cela n'est plus nécessaire car .NET 2.0 a étendu la classe
System.Net.WebRequest avec la prise en charge de FTP.

Nous allons créer une commande FtpWebRequest en transmettant une URL ftp:// à la méthode WebRequest.Create. Pour des
raisons pratiques, nous allons inclure le nom d'utilisateur et le mot de passe dans l'URL de la manière suivante :
ftp://nomutilisateur:[email protected]/blog/webcam.jpg. Notez que l'URL inclut le nom d'utilisateur, le mot de
passe, le nom du domaine et le nom du fichier de destination dans une seule et même chaîne. Nous allons charger le fichier
local dans un tableau d'octets et l'écrire (le charger) dans le flux sous-jacent de FtpWebRequest en l'extrayant à l'aide de
GetRequestStream(), puis de Write().

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(settings.FTPServerURL);


request.Method = WebRequestMethods.Ftp.UploadFile;
request.UseBinary = true;

FileInfo fileInfo = new FileInfo(filename);


byte[] fileContents = new byte[fileInfo.Length];

using (FileStream fr = fileInfo.OpenRead())


{
fr.Read(fileContents, 0, Convert.ToInt32(fileInfo.Length));
}

using (Stream writer = request.GetRequestStream())


{
writer.Write(fileContents, 0, fileContents.Length);
}

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())


{

}
Dim request As FtpWebRequest = Nothing
request = CType(WebRequest.Create(settings.FTPServerURL),FtpWebRequest)
request.Method = WebRequestMethods.Ftp.UploadFile
request.UseBinary = true
Dim fileInfo As FileInfo = New FileInfo(filename)
Dim fileContents() As Byte = New Byte((fileInfo.Length) - 1) {}
Using fr As FileStream = fileInfo.OpenRead
fr.Read(fileContents, 0, Convert.ToInt32(fileInfo.Length))
End Using
Using writer As Stream = request.GetRequestStream
writer.Write(fileContents, 0, fileContents.Length)
End Using
Dim response As FtpWebResponse = CType(request.GetResponse,FtpWebResponse)

Remarquez l'utilisation des instructions « using » dans l'extrait de code ci-dessus. L'utilisation de « using » avec des classes qui

5 sur 6 24/02/2017 07:37


Coder pour le fun : Regarde-moi ! Acquisition d'image Windows https://msdn.microsoft.com/fr-fr/library/bb469890.aspx

implémentent IDisposable déclenche automatiquement l'appel de Dispose() à la sortie du bloc « using ». Certaines personnes
n'aiment pas cette syntaxe, alors que d'autres affirment qu'y recourir, même si la commande Dispose() sous-jacente n'a aucun
effet, présente un avantage. Personnellement, j'apprécie plutôt cette syntaxe. Dans notre exemple, l'instruction using ferme le
FileStream, le flux Request et le FtpWebResponse.

Haut de page
Conclusion
Il est possible d'étendre, d'ajouter ou d'améliorer certains éléments avec ce projet. Voici quelques idées pour bien commencer.

Créez une interface avec X10 ou la sonnette de votre porte d'entrée pour prendre une photo et affichez-la sur votre
ordinateur Media Center.

Reliez entre elles des centaines de photos (pourquoi pas celles de votre nouveau-né !) dans des vidéos en accéléré.

Créez un système de sécurité qui détecte les mouvements en comparant les photos et vous avertit par courrier
électronique avec une alarme et la photo jointe.

Téléchargez les photos vers Flickr ou Smugmug avec leurs API.

Amusez-vous et surtout restez serein face à la consigne : Requiert un peu d'assembly.

Haut de page

Scott Hanselman est architecte en chef chez Corillian Corporation, entreprise spécialisée dans les systèmes de finance
électronique. Il a douze ans d'expérience dans le développement de logiciels en C, C++, VB, COM, et plus récemment en
VB.NET et C#. Scott est fier de sa double compétence : R&D Microsoft et Architecture MVP. Il a co-écrit avec Bill Evjen un
nouvel ouvrage sur ASP.NET 2.0, qui doit accompagner .NET RTM, plus tard durant l'année 2005. Ses réflexions sur le zen et
.NET, la programmation et les services Web sont publiées dans son blog à l'adresse http://www.computerzen.com/.

Haut de page

© 2017 Microsoft

6 sur 6 24/02/2017 07:37

Vous aimerez peut-être aussi