Obtenir une image d’aperçu

Cette rubrique vous montre comment obtenir une image d’aperçu à partir du flux d’aperçu de capture multimédia.

Notes

Cet article repose sur les concepts et le code décrits dans Capture photo, vidéo et audio de base à l’aide de MediaCapture, qui décrit comment implémenter la capture photo et vidéo de base. Nous vous recommandons de vous familiariser avec le modèle de capture simple de contenu multimédia de cet article avant d’adopter des scénarios de capture plus avancés. Le code de cet article part du principe que votre application possède déjà une instance de MediaCapture correctement lancée et que vous disposez d’un CaptureElement avec un flux d’aperçu vidéo actif.

Outre les espaces de noms nécessaires pour la capture multimédia de base, la capture d’une image d’aperçu nécessite les espaces de noms suivants.

using Windows.Media;

Lorsque vous demandez une image d’aperçu, vous pouvez spécifier le format dans lequel vous souhaitez recevoir la trame en créant un objet VideoFrame avec le format de votre choix. Cet exemple crée une image vidéo avec la même résolution que celle du flux d’aperçu en appelant VideoDeviceController.GetMediaStreamProperties et en spécifiantMediaStreamType.VideoPreview pour demander les propriétés du flux d’aperçu. La largeur et la hauteur du flux d’aperçu sont utilisées pour créer l’image vidéo.

// Get information about the preview
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;

// Create a video frame in the desired format for the preview frame
VideoFrame videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);

Si votre objet MediaCapture est initialisé et que vous avez un flux d’aperçu actif, appelez GetPreviewFrameAsync pour obtenir un flux d’aperçu. Passez l’image vidéo créée à la dernière étape pour spécifier le format de l’image renvoyée.

VideoFrame previewFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);

Obtenez une représentation SoftwareBitmap de l’image d’aperçu en accédant à la propriété SoftwareBitmap de l’objet VideoFrame. Pour plus d’informations sur l’enregistrement, le chargement et la modification des images bitmap logicielles, voir Acquisition d’images.

SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Vous pouvez également obtenir une représentation IDirect3DSurface du cadre d’aperçu si vous souhaitez utiliser l’image avec des API Direct3D.

var previewSurface = previewFrame.Direct3DSurface;

Important

La propriété SoftwareBitmap ou la propriété Direct3DSurface de l’objet VideoFrame renvoyé peut être null selon la manière dont vous appelez GetPreviewFrameAsync et en fonction de l’appareil sur lequel votre application est exécutée.

  • Si vous appelez la surcharge de GetPreviewFrameAsync qui accepte un argument VideoFrame, l’objet VideoFrame renvoyé a une valeur SoftwareBitmap non null et la propriété Direct3DSurface est null.
  • Si vous appelez la surcharge de GetPreviewFrameAsync qui n’a aucun argument sur un appareil utilisant une surface Direct3D pour représenter l’image en interne, la propriété Direct3DSurface est non null et la propriété SoftwareBitmap est null.
  • Si vous appelez la surcharge de GetPreviewFrameAsync qui n’a aucun argument sur un appareil n’utilisant pas une surface Direct3D pour représenter l’image en interne, la propriété SoftwareBitmap sera non null et la propriété Direct3DSurface sera null.

Votre application doit toujours rechercher une valeur null avant d’essayer d’agir sur des objets renvoyés par les propriétés SoftwareBitmap ou Direct3DSurface.

Lorsque vous avez fini d’utiliser l’image d’aperçu, veillez à appeler sa méthode Close (projetée vers Dispose en C#) pour libérer les ressources utilisées par l’image. Vous pouvez aussi utiliser le modèle using qui supprime automatiquement l’objet.

previewFrame.Dispose();
previewFrame = null;