Windows 組み込みのカメラ UI を使用してデスクトップ アプリで写真とビデオをキャプチャする

この記事では、 CameraCaptureUI クラスを使用して、Windows に組み込まれているカメラ UI を使用して写真やビデオをキャプチャする方法について説明します。 この機能を使用すると、数行のコードでユーザーがキャプチャした写真やビデオをアプリで取得できます。

独自のカメラ UI を提供する場合、またはシナリオでキャプチャ操作をより堅牢で低レベルで制御する必要がある場合は、 MediaCapture クラスを使用し、独自のキャプチャ エクスペリエンスを実装する必要があります。 詳細については、「MediaCaptureを使用した基本的な写真、ビデオ、オーディオのキャプチャ を参照してください。

CameraCaptureUI クラスを使用して写真をキャプチャする

アプリ ウィンドウの AppWindow.Id プロパティを渡して、CameraCaptureUI の新しいインスタンスを作成します。 PhotoSettings プロパティを使用すると、キャプチャした写真に関するいくつかの制約 (ファイル形式と最大解像度、キャプチャ後にユーザーが写真をトリミングできるかどうかを UI で許可するかどうかなど) を指定できます。 VideoSettings プロパティは、最大解像度や再生時間、キャプチャ後にユーザーがビデオをトリミングできるかどうかを示す、ビデオ キャプチャの同様のプロパティを提供します。

CaptureFileAsync を呼び出して、カメラ キャプチャ UI を非同期的に起動します。 CameraCaptureUIMode のいずれかの値を使用して、UI で写真キャプチャ、ビデオ キャプチャ、またはその両方を許可するかどうかを指定します。 CaptureFileAsync が完了すると、キャプチャされた写真またはビデオを含む StorageFile ファイル オブジェクトが返されます。 返されたオブジェクトが null の場合は、ユーザーがキャプチャ操作を取り消したか、エラーが発生したことを意味します。

次の例では、写真キャプチャ用に CameraCaptureUI を起動し、画像形式を PNG として指定し、トリミングを無効にする方法を示します。 この例では、キャプチャした写真が Image コントロールのソースとして設定されています。

var cameraCaptureUI = new CameraCaptureUI(this.AppWindow.Id);
cameraCaptureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Png;
cameraCaptureUI.PhotoSettings.AllowCropping = false;

// Capture a photo asynchronously
StorageFile photo = await cameraCaptureUI.CaptureFileAsync(CameraCaptureUIMode.Photo);

if (photo != null)
{
    // Photo capture was successful

    // Show the captured photo in a XAML Image control  
    using (IRandomAccessStream fileStream = await photo.OpenAsync(Windows.Storage.FileAccessMode.Read))
    {
        // Set the image source to the selected bitmap 
        BitmapImage bitmapImage = new BitmapImage();
        await bitmapImage.SetSourceAsync(fileStream);
        iCapturedImage.Source = bitmapImage;
    }
} else
{
    // Photo capture failed or was cancelled
}

CameraCaptureUI クラスを使用してビデオをキャプチャする

次の例では、ビデオ キャプチャ用に CameraCaptureUI を起動し、最大ビデオを標準定義として指定し、トリミングを無効にする方法を示します。 この例では、キャプチャされた写真が MediaPlayerElement コントロールのソースとして設定されています。

var cameraCaptureUI = new CameraCaptureUI(this.AppWindow.Id);
cameraCaptureUI.VideoSettings.MaxResolution = CameraCaptureUIMaxVideoResolution.StandardDefinition;
cameraCaptureUI.VideoSettings.AllowTrimming = true;
StorageFile videoFile = await cameraCaptureUI.CaptureFileAsync(CameraCaptureUIMode.Video);

if (videoFile != null)
{
    // Video capture was successful

    // Show the captured video in a MediaPlayerElement control
    mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(videoFile);
    mediaPlayerElement.MediaPlayer.Play();
}
else
{
    // Video capture failed or was cancelled
}

キャプチャしたメディア ファイルの移動と名前の変更

CameraCaptureUI では、キャプチャされたメディア ファイルのランダム化された名前が作成されるため、キャプチャされたファイルの名前を変更して移動して整理することができます。 次の例では、キャプチャされたファイルを移動して名前を変更します。

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

if (photo != null)
{
    // Move and rename captured photo
    StorageFolder destinationFolder =
    await ApplicationData.Current.LocalFolder.CreateFolderAsync("ProfilePhotoFolder",
        CreationCollisionOption.OpenIfExists);

    await photo.CopyAsync(destinationFolder, "ProfilePhoto.jpg", NameCollisionOption.ReplaceExisting);
    await photo.DeleteAsync();
}