Freigeben über


Aufnehmen von Fotos und Videos in einer UWP-App mit der integrierten Windows-Kamera-UI

In diesem Artikel wird beschrieben, wie Sie die CameraCaptureUI Klasse verwenden, um Fotos oder Videos mithilfe der in Windows integrierten Kamera-UI aufzunehmen. Dieses Feature ist einfach zu verwenden. Sie ermöglicht Es Ihrer App, ein vom Benutzer aufgenommenes Foto oder Video mit nur wenigen Codezeilen abzurufen.

Hinweis

Die CameraCaptureUI-Klasse im Windows.Media.Capture-Namespace wird nur für UWP-Apps unterstützt. Verwenden Sie für Desktop-Apps mit WinUI 3 die neue Version dieses Features im Microsoft.Windows.Media.Capture-Namespace . Weitere Informationen finden Sie unter Aufnehmen von Fotos und Videos in einer Desktop-App mit der integrierten Windows-Kamera-UI.

Wenn Sie Eine eigene Kamera-UI bereitstellen möchten oder wenn Ihr Szenario eine robustere Steuerung des Aufnahmevorgangs auf niedriger Ebene erfordert, sollten Sie die MediaCapture Klasse verwenden und ihre eigene Aufnahmeerfahrung implementieren. Weitere Informationen finden Sie unter Grundlegende Foto-, Video- und Audioaufnahme mit MediaCapture.

Hinweis

Sie sollten weder die Funktionen Webcam noch Mikrofon in Ihrer App-Manifestdatei angeben, wenn Ihre App nur CameraCaptureUI-verwendet. Wenn Sie dies tun, wird Ihre App in den Datenschutzeinstellungen des Geräts angezeigt, aber selbst wenn der Benutzer den Kamerazugriff auf Ihre App verweigert, verhindert dies nicht, dass die CameraCaptureUI- Medien aufnehmen kann.

Dies liegt daran, dass es sich bei der integrierten Windows-Kamera-App um eine vertrauenswürdige Erstanbieter-App handelt, die erfordert, dass der Benutzer Foto-, Audio- und Videoaufnahmen mit einem Tastendruck initiieren muss. Ihre App besteht bei der Einreichung beim Microsoft Store möglicherweise die Zertifizierung für das Windows Application Certification Kit nicht, wenn Sie die Webcam- oder Mikrofonfunktionen angeben und dabei CameraCaptureUI als einzigen Mechanismus zur Fotoaufnahme verwenden.

Sie müssen die Webcam-- oder Mikrofon--Fähigkeiten in der App-Manifestdatei angeben, wenn Sie MediaCapture verwenden, um Audio, Fotos oder Videos programmgesteuert aufzunehmen.

Aufnehmen eines Fotos mit CameraCaptureUI

Um die Kameraaufnahme-Benutzeroberfläche zu verwenden, schließen Sie den Windows.Media.Capture-Namespace in Ihr Projekt ein. Um Dateivorgänge mit der zurückgegebenen Bilddatei auszuführen, schließen Sie Windows.Storageein.

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;

Um ein Foto aufzunehmen, erstellen Sie ein neues CameraCaptureUI-Objekt. Mithilfe der PhotoSettings--Eigenschaft des Objekts können Sie Eigenschaften für das zurückgegebene Foto angeben, z. B. das Bildformat des Fotos. Standardmäßig unterstützt die Kameraaufnahme-UI das Zuschneiden des Fotos, bevor es zurückgegeben wird. Dies kann mit der eigenschaft AllowCropping deaktiviert werden. In diesem Beispiel wird die CroppedSizeInPixels- so festgelegt, dass das zurückgegebene Bild eine Größe von 200 x 200 Pixeln haben soll.

Hinweis

Das Zuschneiden von Bildern im CameraCaptureUI- wird für Geräte in der Mobilgerätefamilie nicht unterstützt. Der Wert der Eigenschaft AllowCropping wird ignoriert, wenn Ihre App auf diesen Geräten ausgeführt wird.

Rufen Sie CaptureFileAsync- auf, und geben Sie CameraCaptureUIMode.Photo- an, um anzugeben, dass ein Foto aufgenommen werden soll. Die Methode gibt eine StorageFile- Instanz zurück, die das Bild enthält, wenn die Aufnahme erfolgreich ist. Wenn der Benutzer die Erfassung abbricht, ist das zurückgegebene Objekt 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;
}

Die -StorageFile--Datei, die das aufgenommene Foto enthält, bekommt einen dynamisch generierten Namen und wird im lokalen Ordner Ihrer App gespeichert. Um Ihre aufgenommenen Fotos besser zu organisieren, können Sie die Datei in einen anderen Ordner verschieben.

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

Wenn Sie Ihr Foto in Ihrer App verwenden möchten, könnten Sie ein SoftwareBitmap--Objekt erstellen, das mit verschiedenen Funktionen universeller Windows-Apps verwendet werden kann.

Schließen Sie zunächst den Windows.Graphics.Imaging Namespace in Ihr Projekt ein.

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;

Rufen Sie OpenAsync auf, um einen Datenstrom aus der Bilddatei zu erhalten. Rufen Sie BitmapDecoder.CreateAsync auf, um einen Bitmap-Decoder für den Datenstrom zu erhalten. Rufen Sie dann GetSoftwareBitmap auf, um eine SoftwareBitmap-Darstellung des Bildes abzurufen.

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

Um das Bild in Ihrer Benutzeroberfläche anzuzeigen, deklarieren Sie ein Bild-Steuerelement in Ihrer XAML-Seite.

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

Um die Softwarebitmap auf Ihrer XAML-Seite zu verwenden, binden Sie den Namespace Windows.UI.Xaml.Media.Imaging in Ihr Projekt ein.

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

Für das Bild--Steuerelement muss die Bildquelle im BGRA8-Format mit prämultiplizierter Alpha oder ohne Alpha vorliegen. Rufen Sie die statische Methode SoftwareBitmap.Convert auf, um eine neue Softwarebitmap mit dem gewünschten Format zu erstellen. Erstellen Sie als Nächstes ein neues SoftwareBitmapSource-Objekt und nennen Sie es SetBitmapAsync, um der Quelle das Software-Bitmap zuzuweisen. Legen Sie abschließend die Eigenschaft Quelle des Steuerelements Bild fest, um das aufgenommene Foto in der Benutzeroberfläche anzuzeigen.

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

Aufnehmen eines Videos mit CameraCaptureUI

Um ein Video aufzunehmen, erstellen Sie ein neues CameraCaptureUI-Objekt. Mithilfe der Eigenschaft des Objekts VideoSettings des Objekts können Sie Eigenschaften für das zurückgegebene Video angeben, beispielsweise das Format des Videos.

Rufen Sie CaptureFileAsync auf und geben Sie Video an, um ein Video aufzunehmen. Die Methode gibt eine StorageFile- Instanz zurück, die das Video enthält, wenn die Aufnahme erfolgreich ist. Wenn Sie die Aufnahme abbrechen, ist das zurückgegebene Objekt 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;
}

Was Sie mit der aufgenommenen Videodatei tun, hängt vom Szenario für Ihre App ab. Im restlichen Artikel erfahren Sie, wie Sie schnell eine Medienkomposition aus einem oder mehreren aufgenommenen Videos erstellen und in Ihrer Benutzeroberfläche anzeigen können.

Fügen Sie zunächst ein MediaPlayerElement Steuerelement hinzu, in dem die Videokomposition auf Der XAML-Seite angezeigt wird.

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

Wenn die Videodatei von der Kameraaufnahme-UI zurückgegeben wird, erstellen Sie eine neue MediaSource-, indem Sie CreateFromStorageFile-aufrufen. Rufen Sie die Methode Play des standardmäßigen MediaPlayer auf, der mit dem MediaPlayerElement verknüpft ist, um das Video abzuspielen.

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