Windows の組み込みカメラ UI を使った写真とビデオのキャプチャCapture photos and video with Windows built-in camera UI

この記事では、CameraCaptureUI クラスを使用して、Windows に組み込まれているカメラ UI で写真またはビデオをキャプチャする方法を説明します。This article describes how to use the CameraCaptureUI class to capture photos or videos using the camera UI built into Windows. この機能は使いやすく、わずか数行のコードで、ユーザーがキャプチャした写真やビデオをアプリに取り込むことができます。This feature is easy to use and 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.

注意

指定しないで、 web カメラまたはマイクマニフェスト ファイルをアプリでは、CameraCaptureUI のみで使用する場合、アプリで機能します。You should not specify the webcam or microphone capabilities in your app manifest file if your app only uses CameraCaptureUI. 指定すると、アプリはデバイスのカメラのプライバシー設定に表示されますが、ユーザーがアプリからのカメラへのアクセスを拒否しても、CameraCaptureUI はメディアをキャプチャできます。If you do so, your app will be displayed in the device's camera privacy settings, but even if the user denies camera access to your app, it will not 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. アプリには、Windows アプリケーションの認定キットの認定、唯一の写真キャプチャ メカニズムとして CameraCaptureUI を使用する場合に、web カメラまたはマイク機能を指定する場合は、ストアに送信されたときに失敗します。Your app may fail Windows Application Certification Kit certification when submitted to the Store if you specify the webcam or microphone capabilities when using CameraCaptureUI as your only photo capture mechanism. MediaCapture を使用して、音声、写真、またはビデオをプログラムによってキャプチャする場合は、アプリのマニフェスト ファイルで Web カメラまたはマイク機能を指定する必要があります。You must specify the webcam or microphone capabilities in your app manifest file if you are 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 プロパティを使うと、写真の画像形式など、返される写真のプロパティを指定することができます。Using the object's PhotoSettings property you can specify properties for the returned photo such as the image format of the photo. 既定では、ユーザーはカメラ キャプチャ UI を使うことにより、返される前に写真のトリミングを行うことができます。ただし、この機能は AllowCropping プロパティを使って無効にすることもできます。By default, the camera capture UI allows the user to crop the photo before it is returned, although 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 での画像のトリミングはサポートされていません。Imaging cropping in the CameraCaptureUI is not 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 may want to 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.Graphics.Imaging 名前空間を含める必要があります。First you should 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. 次に、GetSoftwareBitmap を呼び出して、画像の SoftwareBitmap 表現を取得します。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;

Image コントロールでは、画像のソースが BGRA8 形式プリマルチプライ済みアルファまたはアルファなしであることが求められるため、静的メソッド SoftwareBitmap.Convert を呼び出して、目的の形式で新しいソフトウェア ビットマップを作成します。The Image control requires that the image source be in BGRA8 format with premultiplied alpha or no alpha, so call the static method SoftwareBitmap.Convert to create a new software bitmap with the desired format. 次に、新しい SoftwareBitmapSource オブジェクトを作成して SetBitmapAsync を呼び出し、ソフトウェア ビットマップをソースに割り当てます。Next, create a new SoftwareBitmapSource object and call 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 プロパティを使うと、ビデオの形式など、返されるビデオのプロパティを指定することができます。Using the object's VideoSettings property you can specify properties for the returned video such as the format of the video.

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

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

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

カメラ キャプチャ UI から返されたビデオ ファイルを使用し、CreateFromStorageFile を呼び出して、新しい MediaSource を作成します。With the video file returned 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();