Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Související obsah
Windows developer