Windows 8 : développer sa première application Modern UI App Windows 8 : enregistrer l'image d'une webcam

Le code commence par faire référence à l'objet système qui gère les captures à partir de la webcam . Les mots clés async et await sont utilisés pour envoyer de façon asynchrone une requête afin que l'utilisateur prenne une photo (nous reviendrons sur la programmation asynchrone au Chapitre 6). Le flux d'exécution revient lorsque l'utilisateur sélectionne une photo ou annule l'opération depuis l'interface utilisateur. S'il choisit une photo, le code procède à la lecture des bits de l'image et les place dans un objet WriteAbleBitmap spécial afin que nous puissions accéder ultérieurement aux pixels (pour les enregistrer sur le disque) alors que l'image reste affichée à l'écran. Le traitement de la bitmap se fait dans sa propre méthode, nommée LoadBitmap, ce qui nous permet de l'utiliser avec diverses sources.

Le code d'enregistrement de l'image est donné au Listing 2.2 ; il remplace l'autre méthode de gestion du click. Vous devez tout d'abord ajouter les instructions using suivantes :

 using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Graphics.Imaging;
using System.Runtime.InteropServices.WindowsRuntime;

Le code est un peu plus complexe, mais il est également plus facile à comprendre que celui auquel vous pourriez être habitué. L'utilisateur est invité à indiquer l'emplacement d'enregistrement du fichier ainsi que son format ; cela passe par le composant Picker de WinRT. Après que ce choix a été effectué, l'image est codée au format PNG (Portable Network Graphics) et enregistrée dans le dossier de destination indiqué. Exécutez l'application, enregistrez l'image et affichez son aperçu en utilisant l'explorateur de fichiers pour vous rendre dans le dossier concerné. Pour de plus amples informations sur les bibliothèques graphiques et de traitement d'image de Windows 8, consultez cette page.

Listing 2.2 : Code d'enregistrement de l'image

public async void SaveButton_Click_1(object sender, RoutedEventArgs e)
{
if (_writeableBitmap != null)
{
var picker = new FileSavePicker();
picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
picker.FileTypeChoices.Add("Image", new List<string>() { ".png" });
picker.DefaultFileExtension = ".png";
picker.SuggestedFileName = "photo";
var savedFile = await picker.PickSaveFileAsync();

try
{
if (savedFile != null)
{
IRandomAccessStream output = await
savedFile.OpenAsync(FileAccessMode.ReadWrite);
BitmapEncoder encoder =
await BitmapEncoder.CreateAsync(
BitmapEncoder.PngEncoderId, output);
encoder.SetPixelData(BitmapPixelFormat.Rgba8,
BitmapAlphaMode.Straight,
(uint)_writeableBitmap.PixelWidth,
(uint)_writeableBitmap.PixelHeight,
96.0, 96.0,
_writeableBitmap.PixelBuffer.ToArray());
await encoder.FlushAsync();
await output.GetOutputStreamAt(0).FlushAsync();
}
}
catch (Exception ex)
{
var s = ex.ToString();
}
}
}

Le traitement des erreurs a été ajouté uniquement pour que nous puissions fixer un point d'arrêt à cet endroit en cas de problème. Nous avons délibérément voulu que cet exemple reste simple afin de rester concentrés sur des fonctionnalités rapides et faciles.