Share via


Mengambil foto dan video dengan UI kamera bawaan Windows

Artikel ini menjelaskan cara menggunakan kelas CameraCaptureUI untuk mengambil foto atau video dengan menggunakan UI kamera yang terpasang di Windows. Fitur ini mudah digunakan. Ini memungkinkan aplikasi Anda untuk mendapatkan foto atau video yang diambil pengguna hanya dengan beberapa baris kode.

Jika Anda ingin menyediakan UI kamera Anda sendiri, atau jika skenario Anda memerlukan kontrol operasi penangkapan yang lebih kuat dan tingkat rendah, maka Anda harus menggunakan kelas MediaCapture , dan menerapkan pengalaman pengambilan Anda sendiri. Untuk informasi selengkapnya, lihat Pengambilan foto, video, dan audio dasar dengan MediaCapture.

Catatan

Anda tidak boleh menentukan kemampuan webcam atau mikrofon dalam file manifes aplikasi jika aplikasi Anda hanya menggunakan CameraCaptureUI. Jika Anda melakukannya, aplikasi Anda akan ditampilkan di pengaturan privasi kamera perangkat, tetapi bahkan jika pengguna menolak akses kamera ke aplikasi Anda, ini tidak akan mencegah CameraCaptureUI menangkap media.

Ini karena aplikasi kamera bawaan Windows adalah aplikasi pihak pertama tepercaya yang mengharuskan pengguna untuk memulai pengambilan foto, audio, dan video dengan menekan tombol. Aplikasi Anda mungkin gagal sertifikasi Windows Application Certification Kit saat dikirimkan ke Microsoft Store jika Anda menentukan kemampuan webcam atau mikrofon saat menggunakan CameraCaptureUI sebagai satu-satunya mekanisme pengambilan foto Anda.

Anda harus menentukan kemampuan webcam atau mikrofon dalam file manifes aplikasi jika Anda menggunakan MediaCapture untuk mengambil audio, foto, atau video secara terprogram.

Mengambil foto dengan CameraCaptureUI

Untuk menggunakan UI pengambilan kamera, sertakan namespace Windows.Media.Capture dalam proyek Anda. Untuk melakukan operasi file dengan file gambar yang dikembalikan, sertakan Windows.Storage.

using Windows.Media.Capture;
using Windows.Storage;
#include <winrt/Windows.Media.Capture.h>
#include <winrt/Windows.Media.Playback.h>
#include <winrt/Windows.Storage.h>
using namespace winrt;
using namespace Windows::Media::Capture;
using namespace Windows::Storage;

Untuk mengambil foto, buat objek CameraCaptureUI baru. Dengan menggunakan properti PhotoSettings objek, Anda dapat menentukan properti untuk foto yang dikembalikan, seperti format gambar foto. Secara default, UI pengambilan kamera mendukung pemotongan foto sebelum dikembalikan. Ini dapat dinonaktifkan dengan properti AllowCropping . Contoh ini mengatur CroppedSizeInPixels untuk meminta agar gambar yang dikembalikan menjadi 200 x 200 dalam piksel.

Catatan

Pemotongan gambar di CameraCaptureUI tidak didukung untuk perangkat dalam keluarga perangkat Seluler. Nilai properti AllowCropping diabaikan saat aplikasi Anda berjalan di perangkat ini.

Panggil CaptureFileAsync dan tentukan CameraCaptureUIMode.Photo untuk menentukan bahwa foto harus diambil. Metode mengembalikan instans StorageFile yang berisi gambar jika pengambilan berhasil. Jika pengguna membatalkan pengambilan, objek yang dikembalikan adalah null.

CameraCaptureUI captureUI = new CameraCaptureUI();
captureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg;
captureUI.PhotoSettings.CroppedSizeInPixels = new Size(200, 200); 

StorageFile photo = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Photo);

if (photo == null)
{
    // User cancelled photo capture
    return;
}
CameraCaptureUI captureUI;
captureUI.PhotoSettings().Format(CameraCaptureUIPhotoFormat::Jpeg);
captureUI.PhotoSettings().CroppedSizeInPixels({ 200, 200 });

StorageFile photo = co_await captureUI.CaptureFileAsync(CameraCaptureUIMode::Photo);

if (!photo)
{
    // User cancelled photo capture
    co_return;
}

StorageFile yang berisi foto yang diambil diberi nama yang dihasilkan secara dinamis dan disimpan di folder lokal aplikasi Anda. Untuk mengatur foto yang diambil dengan lebih baik, Anda dapat memindahkan file ke folder lain.

StorageFolder destinationFolder = 
    await ApplicationData.Current.LocalFolder.CreateFolderAsync("ProfilePhotoFolder", 
        CreationCollisionOption.OpenIfExists);

await photo.CopyAsync(destinationFolder, "ProfilePhoto.jpg", NameCollisionOption.ReplaceExisting);
await photo.DeleteAsync();
StorageFolder destinationFolder =
    co_await ApplicationData::Current().LocalFolder().CreateFolderAsync(L"ProfilePhotoFolder",
        CreationCollisionOption::OpenIfExists);

co_await photo.CopyAsync(destinationFolder, L"ProfilePhoto.jpg", NameCollisionOption::ReplaceExisting);
co_await photo.DeleteAsync();

Untuk menggunakan foto di aplikasi, Anda mungkin ingin membuat objek SoftwareBitmap yang dapat digunakan dengan beberapa fitur aplikasi Universal Windows yang berbeda.

Pertama, sertakan namespace Windows.Graphics.Imaging dalam proyek Anda.

using Windows.Storage.Streams;
using Windows.Graphics.Imaging;
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Storage.Streams.h>
using namespace Windows::Graphics::Imaging;
using namespace Windows::Storage::Streams;

Panggil OpenAsync untuk mendapatkan aliran dari file gambar. Panggil BitmapDecoder.CreateAsync untuk mendapatkan dekoder bitmap untuk aliran. Kemudian, panggil GetSoftwareBitmap untuk mendapatkan representasi SoftwareBitmap dari gambar.

IRandomAccessStream stream = await photo.OpenAsync(FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync();
IRandomAccessStream stream = co_await photo.OpenAsync(FileAccessMode::Read);
BitmapDecoder decoder = co_await BitmapDecoder::CreateAsync(stream);
SoftwareBitmap softwareBitmap = co_await decoder.GetSoftwareBitmapAsync();

Untuk menampilkan gambar di UI Anda, deklarasikan kontrol Gambar di halaman XAML Anda.

<Image x:Name="imageControl" Width="200" Height="200"/>
<Image x:Name="imageControl" Width="200" Height="200"/>

Untuk menggunakan bitmap perangkat lunak di halaman XAML Anda, sertakan ruang nama Windows.UI.Xaml.Media.Imaging di proyek Anda.

using Windows.UI.Xaml.Media.Imaging;
#include <winrt/Windows.UI.Xaml.Media.Imaging.h>
using namespace Windows::UI::Xaml::Media::Imaging;

Kontrol Gambar mengharuskan sumber gambar dalam format BGRA8 dengan alfa yang telah dikutip sebelumnya atau tanpa alfa. Panggil metode statis SoftwareBitmap.Convert untuk membuat bitmap perangkat lunak baru dengan format yang diinginkan. Selanjutnya, buat objek SoftwareBitmapSource baru dan sebut saja SetBitmapAsync untuk menetapkan bitmap perangkat lunak ke sumbernya. Terakhir, atur properti Sumber kontrol Gambar untuk menampilkan foto yang diambil di UI.

SoftwareBitmap softwareBitmapBGR8 = SoftwareBitmap.Convert(softwareBitmap,
        BitmapPixelFormat.Bgra8, 
        BitmapAlphaMode.Premultiplied);

SoftwareBitmapSource bitmapSource = new SoftwareBitmapSource();
await bitmapSource.SetBitmapAsync(softwareBitmapBGR8);

imageControl.Source = bitmapSource;
SoftwareBitmap softwareBitmapBGR8 = SoftwareBitmap::Convert(softwareBitmap,
    BitmapPixelFormat::Bgra8,
    BitmapAlphaMode::Premultiplied);

SoftwareBitmapSource bitmapSource;
co_await bitmapSource.SetBitmapAsync(softwareBitmapBGR8);

imageControl().Source(bitmapSource);

Mengambil video dengan CameraCaptureUI

Untuk mengambil video, buat objek CameraCaptureUI baru. Dengan menggunakan properti VideoSettings objek, Anda dapat menentukan properti untuk video yang dikembalikan, seperti format video.

Panggil CaptureFileAsync dan tentukan Video untuk mengambil video. Metode mengembalikan instans StorageFile yang berisi video jika pengambilan berhasil. Jika Anda membatalkan pengambilan, objek yang dikembalikan adalah null.

CameraCaptureUI captureUI = new CameraCaptureUI();
captureUI.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4;

StorageFile videoFile = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Video);

if (videoFile == null)
{
    // User cancelled photo capture
    return;
}
CameraCaptureUI captureUI;
captureUI.VideoSettings().Format(CameraCaptureUIVideoFormat::Mp4);

StorageFile videoFile = co_await captureUI.CaptureFileAsync(CameraCaptureUIMode::Video);

if (!videoFile)
{
    // User cancelled photo capture
    co_return;
}

Apa yang Anda lakukan dengan file video yang diambil tergantung pada skenario untuk aplikasi Anda. Sisa artikel ini menunjukkan kepada Anda cara membuat komposisi media dengan cepat dari satu atau beberapa video yang diambil dan menampilkannya di antarmuka pengguna Anda.

Pertama, tambahkan kontrol MediaPlayerElement tempat komposisi video akan ditampilkan di halaman XAML Anda.

<MediaPlayerElement x:Name="mediaPlayerElement" Width="320" Height="240" AreTransportControlsEnabled="True"/>

Saat file video kembali dari UI pengambilan kamera, buat MediaSource baru dengan memanggil CreateFromStorageFile. Panggil metode PutarmediaPlayer default yang terkait dengan MediaPlayerElement untuk memutar video.

mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(videoFile);
mediaPlayerElement.MediaPlayer.Play();
mediaPlayerElement().Source(MediaSource::CreateFromStorageFile(videoFile));
mediaPlayerElement().MediaPlayer().Play();