Mendapatkan bingkai pratinjau dari kamera

Artikel ini menunjukkan cara mengambil bingkai pratinjau tunggal dari aliran pratinjau kamera di aplikasi desktop WinUI 3. Anda dapat menggunakan bingkai pratinjau untuk analisis gambar ringan, seperti pemindaian kode batang atau deteksi wajah, tanpa merekam foto lengkap.

Prasyarat

Artikel ini mengasumsikan Anda telah menginisialisasi instans MediaCapture dan memulai pratinjau kamera. Lihat Menampilkan pratinjau kamera di aplikasi WinUI atau Akses pratinjau kamera untuk detailnya.

Dapatkan bingkai pratinjau sebagai SoftwareBitmap

Panggil GetPreviewFrameAsync untuk mendapatkan satu bingkai dari stream pratinjau. Anda dapat meneruskan VideoFrame kosong untuk menerima bingkai dalam format streaming pratinjau saat ini, atau meneruskan VideoFrame dengan format piksel tertentu.

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);
}

Anda juga dapat memanggil GetPreviewFrameAsync tanpa parameter untuk mendapatkan bingkai dalam format asli:

var previewFrame = await _mediaCapture.GetPreviewFrameAsync();
SoftwareBitmap previewBitmap = previewFrame.SoftwareBitmap;

Menampilkan bingkai pratinjau di UI Anda

Untuk menampilkan bingkai yang diambil dalam kontrol Gambar , konversikan ke 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;
    });
}

Important

Di WinUI 3, SoftwareBitmapSource berada di Microsoft.UI.Xaml.Media.Imaging namespace, bukan Windows.UI.Xaml.Media.Imaging. Gunakan DispatcherQueue.TryEnqueue untuk memperbarui UI, bukan CoreDispatcher.RunAsync.

Memproses bingkai pratinjau

Setelah mendapatkan SoftwareBitmap, Anda dapat memprosesnya dengan pustaka analisis gambar apa pun. Misalnya, Anda dapat menggunakan API bawaan Windows untuk deteksi wajah:

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

Lepaskan VideoFrame dan SoftwareBitmap setelah pemrosesan selesai agar buffer memori yang mendasarinya segera dilepaskan.