web-dev-qa-db-ja.com

WindowsPhone用のWindowsストアアプリでの写真のキャプチャ

さて、私の質問は簡単です:
カメラを使用して、Windows Store AppWindows Phone 8.1で写真をキャプチャするにはどうすればよいですか?
MSDNのサンプルはWindows.Media.Capture.CameraCaptureUIを使用していますが、これはWindows Phoneでは使用できないか、Silverlight用です。
Windowsランタイムを使用するWindowsPhoneアプリ専用のドキュメントまたはサンプルが見つかりません。
誰かがこれを知っているか、あるいはこのためのドキュメントさえ持っていれば、私はうれしいです。

18
GlorfSf

WP8.1ランタイム(Silverlightでも)では、 MediaCapture を使用できます。要するに:

// First you will need to initialize MediaCapture
Windows.Media.Capture.MediaCapture  takePhotoManager = new Windows.Media.Capture.MediaCapture();
await takePhotoManager.InitializeAsync();

プレビューが必要な場合は、 CaptureElement を使用できます。

// In XAML: 
<CaptureElement x:Name="PhotoPreview"/>

次に、背後のコードで、次のようにプレビューを開始/停止できます。

// start previewing
PhotoPreview.Source = takePhotoManager;
await takePhotoManager.StartPreviewAsync();
// to stop it
await takePhotoManager.StopPreviewAsync();

最後に、写真を撮るには、たとえば、ファイルに直接撮る CapturePhotoToStorageFileAsync またはストリームに CapturePhotoToStreamAsync

ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg();

// a file to save a photo
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
        "Photo.jpg", CreationCollisionOption.ReplaceExisting);

await takePhotoManager.CapturePhotoToStorageFileAsync(imgFormat, file);

ビデオをキャプチャしたい場合は 詳細はこちら

また、マニフェストファイルのWebcamCapabilitiesを追加し、RequirementsFront/Rear Cameraを追加することを忘れないでください。


カメラ(フォント/バック)を選択する必要がある場合は、カメラIDを取得してから、必要な設定でMediaCaptureを初期化する必要があります。

private static async Task<DeviceInformation> GetCameraID(Windows.Devices.Enumeration.Panel desired)
{
    DeviceInformation deviceID = (await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture))
        .FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == desired);

    if (deviceID != null) return deviceID;
    else throw new Exception(string.Format("Camera of type {0} doesn't exist.", desired));
}

async private void InitCamera_Click(object sender, RoutedEventArgs e)
{
    var cameraID = await GetCameraID(Windows.Devices.Enumeration.Panel.Back);
    captureManager = new MediaCapture();
    await captureManager.InitializeAsync(new MediaCaptureInitializationSettings
        {
            StreamingCaptureMode = StreamingCaptureMode.Video,
            PhotoCaptureSource = PhotoCaptureSource.Photo,
            AudioDeviceId = string.Empty,
            VideoDeviceId = cameraID.Id                    
        });
}
48
Romasz

ユニバーサルWindowsPhone 8.1(WinRT)アプリでは、組み込みのカメラアプリに直接ジャンプして、写真の撮影時にコールバックを受信することはできなくなりました。

これを行うには、上記のようにWindows.Media.Capture.MediaCaptureを実装する必要があります。以前はCameraCatureUIがありましたが、Windows Phone8.1のWinRTアプリでは使用できません。

ただし、「回避策」があります。Windows.Storage.Pickers.FileOpenPickerを使用して、画像を選択するように構成できます。これで、ピッカーにカメラボタンが表示されます。ユーザーがカメラボタンをクリックすると、内蔵のカメラアプリが開きます。ユーザーが写真を撮ると、アプリにコールバックが届きます。 FileOpenPickerコールバックは実装するのが少し面倒ですが、機能します。ユーザビリティへの影響に耐えられるのであれば、これは有効なアプローチかもしれません。

2014年のMicrosoftのビルド会議中にこのトピックに関するセッションがありました。 このリンクからオンラインでセッションを見ることができます。

3
RhodanV5500

this linkでアプローチできます。すべてが非常にうまく説明されています。

PhotoCameraクラスを使用するだけで、アプリマニフェストでカメラの使用を有効にすることを忘れないでください