Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.
Konten terkait
Windows developer