Aufnehmen von Fotos und Videos mit der in Windows integrierten 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.

Wenn Sie Eine eigene Kamera-UI bereitstellen oder für Ihr Szenario eine robustere Steuerung des Aufnahmevorgangs auf niedriger Ebene erforderlich ist, sollten Sie die MediaCapture-Klasse verwenden und Ihre eigene Aufnahmeerfahrung implementieren. Weitere Informationen finden Sie unter "Einfache Foto-, Video- und Audioaufnahme mit MediaCapture".

Hinweis

Sie sollten die Webcam- oder Mikrofonfunktionen in Ihrer App-Manifestdatei nicht 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, wird dies nicht verhindern, dass CameraCaptureUI Medien erfasst.

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 schlägt möglicherweise die Zertifizierung des Zertifizierungskits für Windows-Anwendungen fehl, wenn Sie an den Microsoft Store übermittelt werden, wenn Sie die Webcam- oder Mikrofonfunktionen angeben, wenn Sie CameraCaptureUI als einzigen Fotoaufnahmemechanismus verwenden.

Sie müssen die Webcam- oder Mikrofonfunktionen in Ihrer App-Manifestdatei angeben, wenn Sie MediaCapture zum programmgesteuerten Aufnehmen von Audio, Fotos oder Videos verwenden.

Aufnehmen eines Fotos mit CameraCaptureUI

Um die Kameraaufnahme-UI 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.Storage ein.

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 AllowCropping-Eigenschaft deaktiviert werden. In diesem Beispiel wird die CroppedSizeInPixels so festgelegt, dass das zurückgegebene Bild 200 x 200 Pixel beträgt.

Hinweis

Das Zuschneiden von Bildern im CameraCaptureUI wird für Geräte in der Mobilgerätefamilie nicht unterstützt. Der Wert der AllowCropping-Eigenschaft 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 mit dem aufgenommenen Foto erhält 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önnen Sie ein SoftwareBitmap-Objekt erstellen, das mit verschiedenen Universellen Windows-App-Features 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 abzurufen. Rufen Sie BitmapDecoder.CreateAsync auf, um einen Bitmap-Decoder für den Datenstrom abzurufen. Rufen Sie dann GetSoftwareBitmap auf, um eine SoftwareBitmap-Darstellung des Bilds 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 auf der Benutzeroberfläche anzuzeigen, deklarieren Sie ein Bildsteuerelement auf der 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, fügen Sie den Windows.UI.Xaml.Media.Imaging-Namespace 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 Bildsteuerelement 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 rufen Sie es SetBitmapAsync auf, um die Softwarebitmapa der Quelle zuzuweisen. Legen Sie schließlich die Source-Eigenschaft des Bildsteuerelements 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 VideoSettings-Eigenschaft des Objekts können Sie Eigenschaften für das zurückgegebene Video angeben, z. B. 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 durch Aufrufen von CreateFromStorageFile. Rufen Sie die Wiedergabemethode des Standardmäßigen MediaPlayers auf, der dem MediaPlayerElement zugeordnet ist, um das Video wiederzugeben.

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