Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo capturar un único fotograma de vista previa de la secuencia de vista previa de la cámara en una aplicación de escritorio winUI 3. Puede usar fotogramas de vista previa para el análisis ligero de imágenes, como el escaneo de códigos de barras o la detección de caras, sin grabar una foto completa.
Prerequisites
En este artículo se supone que ha inicializado una instancia de MediaCapture e iniciado una vista previa de la cámara. Consulta Mostrar la vista previa de la cámara en una aplicación winUI o acceso a la vista previa de la cámara para obtener más información.
Obtener un fotograma de vista previa como SoftwareBitmap
Llame a GetPreviewFrameAsync para obtener un solo fotograma de la secuencia de vista previa. Puedes pasar un VideoFrame vacío para recibir el fotograma en el formato actual de la secuencia de vista previa, o pasar un VideoFrame con un formato de píxeles específico.
using Windows.Media;
using Windows.Media.Capture;
using Windows.Media.MediaProperties;
using Windows.Graphics.Imaging;
private async Task<SoftwareBitmap> GetPreviewFrameAsSoftwareBitmapAsync()
{
// Get the preview stream dimensions using VideoEncodingProperties
var previewProperties =
_mediaCapture.VideoDeviceController
.GetMediaStreamProperties(MediaStreamType.VideoPreview)
as VideoEncodingProperties;
// Create a VideoFrame to receive the preview frame.
// VideoFrame implements IDisposable — use a using statement.
using var previewFrame = new VideoFrame(
BitmapPixelFormat.Bgra8,
(int)previewProperties.Width,
(int)previewProperties.Height);
await _mediaCapture.GetPreviewFrameAsync(previewFrame);
// Return a copy of the SoftwareBitmap because the
// VideoFrame is disposed when this method returns.
return SoftwareBitmap.Copy(previewFrame.SoftwareBitmap);
}
También puede llamar a GetPreviewFrameAsync sin parámetros para obtener un fotograma en el formato nativo:
var previewFrame = await _mediaCapture.GetPreviewFrameAsync();
SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;
Mostrar el marco de vista previa en la interfaz de usuario
Para mostrar el marco capturado en un control Image , conviértelo en softwareBitmapSource:
using Microsoft.UI.Xaml.Media.Imaging;
private async Task DisplayPreviewFrameAsync(
SoftwareBitmap softwareBitmap)
{
// SoftwareBitmapSource requires Bgra8 with premultiplied alpha
if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 ||
softwareBitmap.BitmapAlphaMode != BitmapAlphaMode.Premultiplied)
{
softwareBitmap = SoftwareBitmap.Convert(
softwareBitmap,
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied);
}
var source = new SoftwareBitmapSource();
await source.SetBitmapAsync(softwareBitmap);
// Set the Image control's source on the UI thread
DispatcherQueue.TryEnqueue(() =>
{
PreviewImage.Source = source;
});
}
Importante
En WinUI 3, SoftwareBitmapSource está en el espacio de nombres Microsoft.UI.Xaml.Media.Imaging, no en Windows.UI.Xaml.Media.Imaging. Use DispatcherQueue.TryEnqueue para actualizar la interfaz de usuario, no CoreDispatcher.RunAsync.
Procesar el fotograma de vista previa
Después de obtener un SoftwareBitmap, puede procesarlo con cualquier biblioteca de análisis de imágenes. Por ejemplo, puede usar Windows API integradas para la detección de caras:
using Windows.Media;
private async Task AnalyzePreviewFrameAsync()
{
var previewFrame = await _mediaCapture.GetPreviewFrameAsync();
SoftwareBitmap bitmap = previewFrame.SoftwareBitmap;
if (bitmap != null)
{
// Use the bitmap for image analysis
// For example, pass it to a face detector or
// barcode scanner
bitmap.Dispose();
}
previewFrame.Dispose();
}
Tip
Elimine VideoFrame y SoftwareBitmap después del procesamiento para liberar rápidamente los búferes de memoria subyacentes.