1

我使用以下代码使用 Windows Phone 8 中的 PhotoCaptureDevice 选项拍摄快照。

if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back) ||
                PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Front))
            {
                // Initialize the camera, when available.
                if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back))
                {
                    // Use the back camera.
                    System.Collections.Generic.IReadOnlyList<Windows.Foundation.Size> SupportedResolutions =
                        PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back);
                    Windows.Foundation.Size res = SupportedResolutions[0];
                    d = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, res);
                }
                else
                {
                    // Otherwise, use the front camera.
                    System.Collections.Generic.IReadOnlyList<Windows.Foundation.Size> SupportedResolutions =
                        PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Front);
                    Windows.Foundation.Size res = SupportedResolutions[0];
                    d = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Front, res);
                }

                await d.SetPreviewResolutionAsync(new Windows.Foundation.Size(640, 480));
                await d.SetCaptureResolutionAsync(new Windows.Foundation.Size(640, 480));

                d.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation,
                              d.SensorLocation == CameraSensorLocation.Back ?
                              d.SensorRotationInDegrees : -d.SensorRotationInDegrees);

                _device = d;
            }

最后,我将此设备设置为视频画笔的来源。但是当应用程序通过按住返回键进入此状态时,我来自休眠状态,它显示空白页面并且不显示任何相机。你能请任何人帮助我吗?

4

1 回答 1

3

诺基亚有一个很棒的示例应用程序,其中包含 WP8 的 PhotoCaptureDevice 中启用的许多功能。看看@http ://projects.developer.nokia.com/cameraexplorer

甚至在第一页上还有一个使用 PhotoCaptureDevice 作为 VideoBrush.SetSource() 的端到端示例。从 MainPage.xaml.cs 上的 OnNavigatedTo 方法开始,了解如何使用 PhotoCaptureDevice @ http://projects.developer.nokia.com/cameraexplorer/browser/CameraExplorer/MainPage.xaml.cs初始化相机取景器

以下是相关部分:

    /// <summary>
    /// If camera has not been initialized when navigating to this page, initialization
    /// will be started asynchronously in this method. Once initialization has been
    /// completed the camera will be set as a source to the VideoBrush element
    /// declared in XAML. On-screen controls are enabled when camera has been initialized.
    /// </summary>
    protected async override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (_dataContext.Device == null)
        {
            ShowProgress("Initializing camera...");

            await InitializeCamera(CameraSensorLocation.Back);

            HideProgress();
        }

        videoBrush.RelativeTransform = new CompositeTransform()
        {
            CenterX = 0.5,
            CenterY = 0.5,
            Rotation = _dataContext.Device.SensorLocation == CameraSensorLocation.Back ?
                       _dataContext.Device.SensorRotationInDegrees :
                     - _dataContext.Device.SensorRotationInDegrees
        };

        videoBrush.SetSource(_dataContext.Device);

        overlayComboBox.Opacity = 1;

        SetScreenButtonsEnabled(true);
        SetCameraButtonsEnabled(true);

        base.OnNavigatedTo(e);
    }

    /// <summary>
    /// Initializes camera. Once initialized the instance is set to the DataContext.Device property
    /// for further usage from this or other pages.
    /// </summary>
    /// <param name="sensorLocation">Camera sensor to initialize</param>
    private async Task InitializeCamera(CameraSensorLocation sensorLocation)
    {
        Windows.Foundation.Size initialResolution = new Windows.Foundation.Size(640, 480);
        Windows.Foundation.Size previewResolution = new Windows.Foundation.Size(640, 480);
        Windows.Foundation.Size captureResolution = new Windows.Foundation.Size(640, 480);

        PhotoCaptureDevice d = await PhotoCaptureDevice.OpenAsync(sensorLocation, initialResolution);

        await d.SetPreviewResolutionAsync(previewResolution);
        await d.SetCaptureResolutionAsync(captureResolution);

        d.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation,
                      d.SensorLocation == CameraSensorLocation.Back ?
                      d.SensorRotationInDegrees : - d.SensorRotationInDegrees);

        _dataContext.Device = d;
    }

以及相关的 XAML:

        <Canvas x:Name="VideoCanvas">
            <Canvas.Background>
                <VideoBrush x:Name="videoBrush"/>
            </Canvas.Background>
            <Rectangle x:Name="FocusIndicator" Stroke='Red' Opacity="0.7" Width="80" Height="80" StrokeThickness="5" Visibility="Collapsed"/>
        </Canvas>
于 2012-12-06T01:59:45.433 回答