我使用以下代码使用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;
}
最后,我将此设备设置为视频画笔的源。但是,当应用程序通过按住后退键进入此状态时,我来自休眠状态,它显示空白页面并且不显示任何相机。你能帮助我吗?
答案 0 :(得分:3)
诺基亚拥有WP8的PhotoCaptureDevice中启用的众多功能的优秀示例应用程序。查看@ http://projects.developer.nokia.com/cameraexplorer
甚至还有一个在第一页上使用PhotoCaptureDevice作为VideoBrush.SetSource()的端到端示例。从MainPage.xaml.cs上的OnNavigatedTo方法开始,了解如何使用PhotoCaptureDevice初始化Camera Viewfinder @ 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>