18

好吧,我的问题很简单:
如何使用相机拍摄带有Windows Store Appfor的图片Windows Phone 8.1
MSDN 上的示例使用Windows.Media.Capture.CameraCaptureUI,在 Windows Phone 上不可用,或者用于Silverlight.
我找不到任何专门针对使用 Windows 运行时的 Windows Phone 应用程序的文档或示例。
如果有人知道,甚至有这方面的文档,我会很高兴。

4

3 回答 3

48

在 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或 Stream 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);

如果您想捕捉视频,那么这里有更多信息

也不要忘记添加清单文件,并Webcam在.CapabilitiesFront/Rear CameraRequirements


如果您需要选择相机(前/后),您需要获取相机 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                    
        });
}
于 2014-05-12T10:28:48.217 回答
3

在通用 Windows Phone 8.1 (WinRT) 应用程序中,不再可能直接跳转到内置相机应用程序并在拍照时接收回调。

为此,您必须Windows.Media.Capture.MediaCapture按上述方式实施。曾经有,CameraCatureUI但在 Windows Phone 8.1 的 WinRT 应用程序中不可用。

但是,有一个“解决方法”。您可以使用Windows.Storage.Pickers.FileOpenPicker和配置它来挑选图像。现在选择器将有一个相机按钮。用户可以单击相机按钮,内置相机应用程序将打开。用户拍照后,您将在您的应用中收到回调。FileOpenPicker回调实现起来有点烦人,但它确实有效。如果您可以忍受可用性的影响,这可能是一种有效的方法。

在 2014 年 Microsoft 的 build-Conference 期间有一个关于此主题的会议。您可以通过此链接在线观看会议。

于 2015-02-19T15:23:15.000 回答
0

您可以采用链接上的方法。一切都解释得很好。

只需使用PhotoCamera该类,不要忘记在您的应用清单中启用相机使用

于 2014-05-12T10:06:39.663 回答