且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在适用于 Windows Phone 的 Windows Store 应用程序上捕获照片

更新时间:2023-10-20 14:47:58

在 WP8.1 运行时(也在 Silverlight 中)您可以使用 MediaCapture.简而言之:

In WP8.1 Runtime (also in Silverlight) you can use MediaCapture. In short:

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

如果您需要预览,可以使用 捕获元素:

If you need a preview you can use a CaptureElement:

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

然后在后面的代码中你可以像这样开始/停止预览:

Then in the code behind you can start/stop previewing like this:

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

最后要拍一张照片,例如你可以直接把它放到一个文件 CapturePhotoToStorageFileAsync 或流CapturePhotoToStreamAsync:

Finally to take a Photo you can for example take it directly to a file CapturePhotoToStorageFileAsync or to a 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);

如果您想捕获视频,请这里有更多信息.

If you want to capture video then here is more information.

另外不要忘记在清单文件的Capabilities 中添加Webcam,在RequirementsFront/Rear Camera/代码>.

Also don't forget to add Webcam in Capabilities of your manifest file, and Front/Rear Camera in Requirements.

如果您需要选择相机(前/后),您将需要获取相机 ID,然后使用所需设置初始化 MediaCapture:

In case you need to choose a Camera (fornt/back), you will need to get the Camera Id and then initialize MediaCapture with desired settings:

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                    
        });
}