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 Kamerabenutzeroberfläche aufzunehmen. Dieses Feature ist einfach zu verwenden. Damit kann Ihre App ein vom Benutzer aufgenommenes Foto oder Video mit nur wenigen Codezeilen abrufen.

Wenn Sie Eine eigene Kamerabenutzeroberfläche bereitstellen möchten oder 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 Allgemeine 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 der Kamera des Geräts angezeigt. Selbst wenn der Benutzer den Kamerazugriff auf Ihre App verweigert, wird dies nicht verhindern, dass CameraCaptureUI Medien erfasst.

Das liegt daran, dass es sich bei der integrierten Kamera-App von Windows um eine vertrauenswürdige Erstanbieter-App handelt, die erfordert, dass der Benutzer die Foto-, Audio- und Videoaufnahme durch einen Tastendruck initiiert. 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 Aufzeichnen 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-Benutzeroberfläche das Zuschneiden des Fotos, bevor es zurückgegeben wird. Dies kann mit der AllowCropping-Eigenschaft deaktiviert werden. In diesem Beispiel wird CroppedSizeInPixels festgelegt, um anzufordern, dass das zurückgegebene Bild 200 x 200 Pixel hat.

Hinweis

Das Zuschneiden von Bildern in CameraCaptureUI wird für Geräte in der Mobilen Gerä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 festzulegen, dass ein Foto aufgenommen werden soll. Die Methode gibt eine StorageFile-Instanz mit dem Bild zurück, wenn die Aufnahme erfolgreich ist. Wenn der Benutzer die Aufnahme 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 der 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();

Zur Verwendung des Fotos in der App kann die Erstellung eines SoftwareBitmap-Objekts hilfreich sein, das mit unterschiedlichen Funktionen für universelle Windows-Apps genutzt werden kann.

Fügen 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 Stream aus der Bilddatei abzurufen. Rufen Sie BitmapDecoder.CreateAsync auf, um einen Bitmap-Decoder für den Stream 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 in der Benutzeroberfläche anzuzeigen, deklarieren Sie ein Image-Steuerelement auf der XAML-Seite.

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

Um die Software-Bitmap in der XAML-Seite zu verwenden, schließen 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 Image-Steuerelement muss die Bildquelle im BGRA8-Format mit prämultipliziertem Alpha oder ohne Alpha vorliegen. Rufen Sie die statische Methode SoftwareBitmap.Convert auf, um eine neue Software-Bitmap mit dem gewünschten Format zu erstellen. Erstellen Sie als Nächstes ein neues SoftwareBitmapSource-Objekt , und nennen Sie es SetBitmapAsync , um die Softwarebitbitbit zur Quelle zuzuweisen. Legen Sie abschließend die Source-Eigenschaft des Image-Steuerelements 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 mit dem Video zurück, wenn die Aufnahme erfolgreich ist. Wenn Sie die Erfassung 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;
}

Wofür Sie die aufgenommene Videodatei verwenden, ist von dem Szenario für Ihre App abhängig. Im weiteren Verlauf dieses Artikels wird gezeigt, wie Sie schnell eine Medienkomposition aus einem oder mehreren aufgenommenen Videos erstellen und diese in der Benutzeroberfläche anzeigen.

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-Benutzeroberfläche zurückgegeben wird, erstellen Sie eine neue MediaSource , indem Sie CreateFromStorageFile aufrufen. Rufen Sie die Play-Methode des Standardmäßigen MediaPlayer 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();