Windows ビルトインカメラ UI を使用して写真とビデオをキャプチャするCapture photos and video with the Windows built-in camera UI

この記事では、CameraCaptureUI クラスを使用して、Windows に組み込まれているカメラ UI を使用して写真やビデオをキャプチャする方法について説明します。This article describes how to use the CameraCaptureUI class to capture photos or videos by using the camera UI built into Windows. この機能は簡単に使用できます。This feature is easy to use. これにより、わずか数行のコードで、ユーザーがキャプチャした写真またはビデオをアプリで取得できるようになります。It allows your app to get a user-captured photo or video with just a few lines of code.

独自のカメラ用 UI を用意する場合、またはキャプチャ操作に対してより堅牢で低レベルな制御が必要な場合は、MediaCapture オブジェクトを使用して、独自のキャプチャ操作を実装する必要があります。If you want to provide your own camera UI or if your scenario requires more robust, low-level control of the capture operation, you should use the MediaCapture object and implement your own capture experience. 詳しくは、「MediaCapture を使った基本的な写真、ビデオ、およびオーディオのキャプチャ」をご覧ください。For more information, see Basic photo, video, and audio capture with MediaCapture.

注意

アプリで CameraCaptureUI のみを使用する場合は、アプリマニフェストファイルでwebcamまたはマイクの機能を指定しないでください。You shouldn't specify the webcam or microphone capabilities in your app manifest file if your app only uses CameraCaptureUI. この操作を行うと、デバイスのカメラのプライバシー設定にアプリが表示されますが、ユーザーがアプリへのカメラアクセスを拒否しても、CameraCaptureUI がメディアをキャプチャできなくなることはありません。If you do, your app will be displayed in the device's camera privacy settings, but even if the user denies camera access to your app, this won't prevent the CameraCaptureUI from capturing media.

これは、Windows の組み込みのカメラ アプリが、写真、音声、ビデオのキャプチャをボタンを押して開始する必要がある、信頼されているファースト パーティ アプリであるためです。This is because the Windows built-in camera app is a trusted first-party app that requires the user to initiate photo, audio, and video capture with a button press. CameraCaptureUI を唯一の写真キャプチャメカニズムとして使用する場合に、web カメラまたはマイクの機能を指定すると、アプリが Microsoft Store に送信されたときに Windows アプリケーション認定キットの認定に失敗する可能性があります。Your app may fail Windows Application Certification Kit certification when submitted to Microsoft Store if you specify the webcam or microphone capabilities when using CameraCaptureUI as your only photo capture mechanism.

MediaCapture を使用してオーディオ、写真、またはビデオをプログラムでキャプチャする場合は、アプリマニフェストファイルで webcam またはマイクの機能を指定する必要があります。You must specify the webcam or microphone capabilities in your app manifest file if you're using MediaCapture to capture audio, photos, or video programmatically.

CameraCaptureUI を使った写真のキャプチャCapture a photo with CameraCaptureUI

カメラ キャプチャ UI を使うには、プロジェクトに Windows.Media.Capture 名前空間を含めます。To use the camera capture UI, include the Windows.Media.Capture namespace in your project. 返された画像ファイルでファイル操作を行うには、Windows.Storage を含めます。To do file operations with the returned image file, include Windows.Storage.

using Windows.Media.Capture;
using Windows.Storage;

写真をキャプチャするには、新しい CameraCaptureUI オブジェクトを作成します。To capture a photo, create a new CameraCaptureUI object. オブジェクトのPhotosettingsプロパティを使用して、写真の画像形式など、返された写真のプロパティを指定できます。By using the object's PhotoSettings property, you can specify properties for the returned photo, such as the image format of the photo. 既定では、カメラのキャプチャ UI では、画像が返される前にトリミングがサポートされています。By default, the camera capture UI supports cropping the photo before it's returned. これは、 Allowcroppingプロパティを使用して無効にすることができます。This can be disabled with the AllowCropping property. この例では、CroppedSizeInPixels を設定して、返される画像のサイズが 200 x 200 ピクセルになるよう要求しています。This example sets the CroppedSizeInPixels to request that the returned image be 200 x 200 in pixels.

注意

CameraCaptureUIでのイメージのトリミングは、モバイルデバイスファミリのデバイスではサポートされていません。Image cropping in the CameraCaptureUI isn't supported for devices in the Mobile device family. アプリがこれらのデバイスで実行されている場合、AllowCropping プロパティの値は無視されます。The value of the AllowCropping property is ignored when your app is running on these devices.

写真をキャプチャすることを指定するには、CaptureFileAsync を呼び出して、CameraCaptureUIMode.Photo を指定します。Call CaptureFileAsync and specify CameraCaptureUIMode.Photo to specify that a photo should be captured. キャプチャに成功すると、このメソッドは、画像が格納された StorageFile インスタンスを返します。The method returns a StorageFile instance containing the image if the capture is successful. ユーザーがキャプチャを取り消した場合、返されるオブジェクトは null になります。If the user cancels the capture, the returned object is 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;
}

キャプチャした写真が格納されている StorageFile は、動的に生成された名前が付けられて、アプリのローカル フォルダーに保存されます。The StorageFile containing the captured photo is given a dynamically generated name and saved in your app's local folder. キャプチャした写真をより効果的に整理するために、ファイルを別のフォルダーに移動できます。To better organize your captured photos, you can move the file to a different folder.

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

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

アプリで写真を使用するために、SoftwareBitmapオブジェクトを作成できます。このオブジェクトは、ユニバーサル Windows アプリのさまざまな機能で使用できます。To use your photo in your app, you may want to create a SoftwareBitmap object that can be used with several different Universal Windows app features.

最初に、プロジェクトにWindowsの画像の名前空間を含めます。First, include the Windows.Graphics.Imaging namespace in your project.

using Windows.Storage.Streams;
using Windows.Graphics.Imaging;

画像ファイルからストリームを取得するには、OpenAsync を呼び出します。Call OpenAsync to get a stream from the image file. ストリームのビットマップ デコーダーを取得するには、BitmapDecoder.CreateAsync を呼び出します。Call BitmapDecoder.CreateAsync to get a bitmap decoder for the stream. 次に、 Get$ bitmapを呼び出して、イメージのソフトウェアビットマップ表現を取得します。Then, call GetSoftwareBitmap to get a SoftwareBitmap representation of the image.

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

UI に画像を表示するには、XAML ページで Image コントロールを宣言します。To display the image in your UI, declare an Image control in your XAML page.

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

XAML ページでソフトウェア ビットマップを使用するには、Windows.UI.Xaml.Media.Imaging 名前空間の using 指定を含めます。To use the software bitmap in your XAML page, include the using Windows.UI.Xaml.Media.Imaging namespace in your project.

using Windows.UI.Xaml.Media.Imaging;

イメージコントロールを使用するには、イメージソースの BGRA8 形式が、前乗算されたアルファまたはアルファなしである必要があります。The Image control requires that the image source be in BGRA8 format with premultiplied alpha or no alpha. 静的メソッドの software bitmap. Convertを呼び出して、目的の形式の新しいソフトウェアビットマップを作成します。Call the static method SoftwareBitmap.Convert to create a new software bitmap with the desired format. 次に、新しい software bitmapsourceオブジェクトを作成し、 setbitmapasyncを呼び出して、ソフトウェアビットマップをソースに割り当てます。Next, create a new SoftwareBitmapSource object and call it SetBitmapAsync to assign the software bitmap to the source. 最後に、キャプチャした写真を UI に表示できるように、Image コントロールの Source プロパティを設定します。Finally, set the Image control's Source property to display the captured photo in the UI.

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

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

imageControl.Source = bitmapSource;

CameraCaptureUI を使ったビデオのキャプチャCapture a video with CameraCaptureUI

ビデオをキャプチャするには、新しい CameraCaptureUI オブジェクトを作成します。To capture a video, create a new CameraCaptureUI object. オブジェクトのVideosettingsプロパティを使用して、ビデオの形式など、返されるビデオのプロパティを指定できます。By using the object's VideoSettings property, you can specify properties for the returned video, such as the format of the video.

CaptureFileAsyncを呼び出し、ビデオをキャプチャするビデオを指定します。Call CaptureFileAsync and specify Video to capture a video. キャプチャに成功すると、このメソッドは、ビデオが格納された StorageFile インスタンスを返します。The method returns a StorageFile instance containing the video if the capture is successful. キャプチャをキャンセルした場合、返されるオブジェクトは null になります。If you cancel the capture, the returned object is 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;
}

キャプチャしたビデオ ファイルをどのように使うかは、アプリのシナリオによって異なります。What you do with the captured video file depends on the scenario for your app. この記事の残りの部分では、キャプチャした 1 つ以上のビデオからメディア コンポジションをすばやく作成し、UI に表示する方法を説明します。The rest of this article shows you how to quickly create a media composition from one or more captured videos and show it in your UI.

まず、XAML ページにビデオコンポジションが表示されるMediaPlayerElementコントロールを追加します。First, add a MediaPlayerElement control in which the video composition will display on your XAML page.

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

カメラキャプチャ UI からビデオファイルが返されたら、 CreateFromStorageFile を呼び出して新しいmediasourceを作成します。When the video file returns from the camera capture UI, create a new MediaSource by calling CreateFromStorageFile. MediaPlayerElement に関連付けられている既定の MediaPlayerPlay メソッドを呼び出してビデオを再生します。Call the Play method of the default MediaPlayer associated with the MediaPlayerElement to play the video.

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