Previous Contents Next

3.4   Application Windows complexe

Cette application est toujours à écrire avec Visual Studio C#. Le but est d'obtenir un chat vidéo rudimentaire. Pour tout ce qui concerne l'acquisition vidéo nous allons utiliser la bibliothèque avicap32.ddl de Windows. Cette particularité va rendre le programme non portable.

La première étape consiste à créer une classe de bibliothèque WebCamLib avec les deux fichiers C# fournis : http://www.plil.net/~rex/Enseignement/Systeme/TP.Programmation.TC/DeviceManager.cs et http://www.plil.net/~rex/Enseignement/Systeme/TP.Programmation.TC/Device.cs. Pour tester cette classe, ajoutez deux contrôles à votre interface; une liste déroulante pour les périphériques disponibles et une zone de dessin pour afficher l'image de la caméra. Au chargement de l'interface, récupérez les périphériques disponibles grâce à la classe DeviceManager et chargez les dans la liste déroulante. Quand un périphérique est selectionné dans la liste, créez l'objet Device correspondant, initialisez le et envoyez l'image de la caméra sur la zone de dessin.

Pour envoyer les images, il va falloir utiliser quelques fonctions réseau. Pour vous familiariser avec ces fonctions, créez deux applications console : Inspirez vous des deux extraits de code suivants : L'autre difficulté de l'échange d'images est qu'il faut envoyer des images de la webcam locale tout en recevant des images de la webcam distante. Pour cela votre application va devoir faire tourner plusieurs flux d'exécution. Comme les flux classiques (threads) ne fonctionnent pas correctement avec les interfaces GUI de Windows vous utiliserez une forme de flux propre à Windows : des tâches de fond (BackgroundWorker). Utilisez le concepteur de vue pour créer deux tâches de fond. Une tâche de fond va s'occuper d'envoyer les images de la camera locale sur une machine distante. L'autre tâche de fond va s'occuper de recevoir les images d'une machine distante pour l'afficher sur votre fenêtre. Là forcément il va falloir un peu de code à la main pour envoyer et recevoir les images dans les fonctions des tâches de fond.

La méthode principale DoWork de la tâche de fond d'envoi des images se connecte sur le serveur spécifié et boucle pour envoyer des images de la webcam locale toutes les fractions de seconde. A chaque itération la tâche utilise un ReportProgress pour que sa méthode de gestion de progression ProgressChanged soit appelée. C'est cette méthode qui va prendre un cliché de la webcam et la stocker dans une variable pour la rendre disponible pour la méthode DoWork. En réalité le cliché va être stocké dans le presse-papier de Windows, il faudra le récupérer en utilisant le code suivant :
 
IDataObject data = Clipboard.GetDataObject();
if (data != null && data.GetDataPresent(typeof(System.Drawing.Bitmap)))
  result = (Image)data.GetData(typeof(System.Drawing.Bitmap));
La méthode principale DoWork de la tâche de fond de réception des images se comporte comme un serveur qui attend une connexion de client puis reçoit de ce client les images à afficher en local. A chaque image reçue un ReportProgress est lancé pour que la méthode de gestion de progression ProgressChanged puisse afficher l'image dans la seconde zone de dessin (pour des raisons techniques la méthode principale DoWork ne peut pas directement accéder à la zone de dessin). Si vous devez retailler l'image utilisez la méthode GetThumbnailImage de la classe Image.

D'un point de vue interface utilisateur, il est suggéré de prévoir deux zones de dessin, une pour les images de la webcam locale et une pour les images de la webcam distante. Les deux tâches de fond ne doivent pas être lancées tout de suite, prévoyez deux boutons pour lancer ces tâches. Il faut bien entendu des champs de saisie pour indiquer le nom de la machine où envoyer les images ainsi que pour spécifier les ports d'écoute et d'envoi.

Enfin ajoutez des contrôles à chaque zone de dessin pour sauver un cliché des webcams locale et distante sur le disque.


Previous Contents Next