Získejte snímek náhledu z kamery

Tento článek ukazuje, jak pořídit jeden snímek z datového proudu náhledu kamery ve desktopové aplikaci WinUI 3. Snímky náhledu můžete použít pro zjednodušenou analýzu obrázků, jako je skenování čárových kódů nebo detekce obličeje, aniž byste museli nahrávat celou fotku.

Předpoklady

Tento článek předpokládá, že jste inicializovali instanci MediaCapture a spustili náhled kamery. Podrobnosti najdete v tématu Zobrazení náhledu fotoaparátu v aplikaci WinUI nebo přístupu k náhledu fotoaparátu .

Získejte náhledový snímek jako SoftwareBitmap

Zavolejte GetPreviewFrameAsync a získejte jeden snímek z datového proudu náhledu. Můžete předat prázdný objekt VideoFrame, abyste obdrželi snímek v aktuálním formátu streamu náhledu, nebo předat objekt VideoFrame se zadaným formátem pixelů.

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

Můžete také volat GetPreviewFrameAsync bez parametrů a získat rámec v nativním formátu:

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

Zobrazení rámečku náhledu v uživatelském rozhraní

Pokud chcete zobrazit zachycený rámec v ovládacím prvku Image , převeďte ho na 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

Ve WinUI 3 se SoftwareBitmapSource nachází v oboru názvů Microsoft.UI.Xaml.Media.Imaging, nikoli Windows.UI.Xaml.Media.Imaging. Slouží DispatcherQueue.TryEnqueue k aktualizaci uživatelského rozhraní, nikoli CoreDispatcher.RunAsync.

Zpracovat snímek náhledu

Jakmile získáte SoftwareBitmap, můžete jej zpracovat pomocí libovolné knihovny pro analýzu obrazu. Můžete například použít Windows integrovaná rozhraní API pro detekci tváří:

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

Po zpracování zlikvidujte VideoFrame a SoftwareBitmap, aby se co nejdříve uvolnily podkladové paměťové buffery.