与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片
作者:webabcd
介绍
与众不同 windows phone 8.0 之 相机和照片
- 通过 PhotoCaptureDevice 捕获照片
示例
演示 PhotoCaptureDevice(wp8)的应用
CameraAndPhoto/PhotoCaptureDeviceDemo.xaml
<phone:PhoneApplicationPage
x:Class="Demo.CameraAndPhoto.PhotoCaptureDeviceDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True"> <Grid x:Name="LayoutRoot" Background="Transparent">
<StackPanel> <StackPanel Orientation="Horizontal">
<Canvas Width="240" Height="180" RenderTransformOrigin="0.5 0.5">
<Canvas.Background>
<VideoBrush x:Name="videoBrush" />
</Canvas.Background>
<Canvas.RenderTransform>
<RotateTransform x:Name="rt" />
</Canvas.RenderTransform>
</Canvas>
<Image Name="imgPreview" Width="240" Height="180" />
</StackPanel> <StackPanel Orientation="Horizontal" Margin="0 50 0 0">
<Button Name="btnCapture" Content="照相" Click="btnCapture_Click" />
<Button Name="btnFocus" Content="自动对焦" Click="btnFocus_Click" />
</StackPanel> <TextBlock x:Name="lblMsg" TextWrapping="Wrap" Margin="0 10 0 0" /> </StackPanel>
</Grid> </phone:PhoneApplicationPage>
CameraAndPhoto/PhotoCaptureDeviceDemo.xaml.cs
/*
* 演示 PhotoCaptureDevice(wp8)的应用
*
* 关于 PhotoCamera(wp7)的应用参见
* http://www.cnblogs.com/webabcd/archive/2012/08/13/2635698.html
* http://www.cnblogs.com/webabcd/archive/2012/08/15/2639428.html
*
*
* 注:
* 需要在 manifest 中增加配置 <Capability Name="ID_CAP_ISV_CAMERA" /> <Capability Name="ID_CAP_MEDIALIB_PHOTO" />
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using Microsoft.Phone.Controls;
using Windows.Phone.Media.Capture;
using Microsoft.Devices;
using System.IO;
using Microsoft.Xna.Framework.Media;
using Microsoft.Phone; namespace Demo.CameraAndPhoto
{
public partial class PhotoCaptureDeviceDemo : PhoneApplicationPage
{
private PhotoCaptureDevice _captureDevice; public PhotoCaptureDeviceDemo()
{
InitializeComponent(); this.Loaded += PhotoCaptureDeviceDemo_Loaded;
} private async void PhotoCaptureDeviceDemo_Loaded(object sender, RoutedEventArgs e)
{
// 一些概述类的说明
Summary(); // 是否有后置摄像头
if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back))
{
// 获取后置摄像头照相时的可用分辨率
IReadOnlyList<Windows.Foundation.Size> supportedResolutions = PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back);
Windows.Foundation.Size resolution = supportedResolutions[]; try
{
// 让后置摄像头以指定的分辨率捕获镜头内容
_captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, resolution); /*
* SetCaptureResolutionAsync() - 设置捕获照片的分辨率
* SetPreviewResolutionAsync() - 设置捕获照片的预览图的分辨率
* CaptureResolution - 获取当前捕获的分辨率
* PreviewResolution - 获取当前捕获的预览图的分辨率
* FocusRegion - 对焦区域
* SensorLocation - 当前摄像头的位置(CameraSensorLocation 枚举:Back 或 Front)
* SensorRotationInDegrees - 获取照相机传感器相对于屏幕的旋转度数
*/ /*
* KnownCameraPhotoProperties 属性集包括
* FlashMode - 闪光灯模式:FlashState.On, FlashState.Auto, FlashState.Off
* FlashPower - 闪光亮度,无单位且不同设备上的值不同
* FocusIlluminationMode - 闪光灯的对焦方式:FocusIlluminationMode.Auto, FocusIlluminationMode.Off, FocusIlluminationMode.On
* ExposureCompensation - 曝光补偿,单位:1/6 EV
* ExposureTime - 曝光时间,单位:微秒
* ManualWhiteBalance - 手动设置白平衡
* WhiteBalancePreset - 设置预置白平衡(WhiteBalancePreset 枚举,包括多云、荧光灯等等)
* LockedAutoFocusParameters - 自动对焦、自动曝光或自动白平衡参数(AutoFocusParameters 枚举,有 flag 标记)
* AutoFocusParameters.None - 对焦、曝光和白平衡全自动
* AutoFocusParameters.Focus - 暂停自动对焦
* AutoFocusParameters.Exposure - 暂停自动曝光
* AutoFocusParameters.WhiteBalance - 暂停自动白平衡
* Iso - 感光度
* SceneMode - 场景模式(CameraSceneMode 枚举,包括人像优化、夜景优化等等)
*/
_captureDevice.SetProperty(KnownCameraPhotoProperties.FlashMode, FlashState.On); /*
* KnownCameraGeneralProperties 属性集包括
* AutoFocusRange - 自动对焦的范围(AutoFocusRange 枚举,包括微距等)
* EncodeWithOrientation - 照片捕获完成后编码时的旋转角度,必须是 90 的倍数
* SpecifiedCaptureOrientation - 照片捕获完成后照片元数据中的旋转角度,必须是 90 的倍数
* IsShutterSoundEnabledByUser - 用户是否启用了快门声音,只读
* IsShutterSoundRequiredForRegion - 运行应用程序的区域是否需要快门声音(有些区域为了保护隐私,要求照相或录像必须要有快门声音),只读
* PlayShutterSoundOnCapture - 指定捕获时是否播放快门声音
* ManualFocusPosition - 手动对焦的位置
*/
_captureDevice.SetProperty(KnownCameraGeneralProperties.AutoFocusRange, AutoFocusRange.Normal);
_captureDevice.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation, _captureDevice.SensorRotationInDegrees); // 获取指定属性的值
// _captureDevice.GetProperty(KnownCameraGeneralProperties.IsShutterSoundEnabledByUser); /*
* 获取指定的范围类属性在当前相机中所允许的值的范围
*/
// PhotoCaptureDevice.GetSupportedPropertyRange(CameraSensorLocation.Back, KnownCameraPhotoProperties.ExposureCompensation); /*
* 获取指定的值类属性在当前相机中所允许的值的列表
*/
// PhotoCaptureDevice.GetSupportedPropertyValues(CameraSensorLocation.Back, KnownCameraPhotoProperties.FlashMode); // 实时显示捕获的内容
videoBrush.SetSource(_captureDevice); // 扩展方法来自:Microsoft.Devices.CameraVideoBrushExtensions rt.Angle = _captureDevice.SensorRotationInDegrees;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
else
{
MessageBox.Show("没有后置摄像头");
}
} // 照相
private async void btnCapture_Click(object sender, RoutedEventArgs e)
{
// 创建捕获序列,目前系统仅支持单帧捕获
CameraCaptureSequence seq = _captureDevice.CreateCaptureSequence(); // 设置序列中的指定帧的 KnownCameraPhotoProperties 属性和 KnownCameraGeneralProperties 属性
// seq.Frames[0].DesiredProperties[KnownCameraPhotoProperties.FlashMode] = FlashState.On;
// seq.Frames[0].DesiredProperties[KnownCameraGeneralProperties.AutoFocusRange] = AutoFocusRange.Infinity; // 捕获到的图片的内存流
MemoryStream captureStream = new MemoryStream();
// 捕获到的图片的预览图的内存流
MemoryStream captureStreamPreview = new MemoryStream(); // 设置捕获到的图片的内存流
seq.Frames[].CaptureStream = captureStream.AsOutputStream();
// 设置捕获到的图片的预览图的内存流
seq.Frames[].ThumbnailStream = captureStreamPreview.AsOutputStream(); try
{
// 根据捕获序列的设置,准备好捕获前的相关数据
await _captureDevice.PrepareCaptureSequenceAsync(seq); // 开始捕获
await seq.StartCaptureAsync(); captureStream.Position = ;
captureStreamPreview.Position = ; // 保存捕获到的图片到“本机照片”
MediaLibrary library = new MediaLibrary();
Picture picture = library.SavePictureToCameraRoll("xxx.jpg", captureStream); // 如果有重名,会自动重命名 // 显示捕获到的图片的预览图(也可以通过 picture.GetThumbnail() 来获取预览图)
imgPreview.Source = PictureDecoder.DecodeJpeg(captureStreamPreview); lblMsg.Text += "拍照完成,且已保存到照片中心";
lblMsg.Text += System.Environment.NewLine;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
} captureStream.SetLength();
captureStreamPreview.SetLength(); captureStream.Dispose();
captureStreamPreview.Dispose();
} // 自动对焦
private async void btnFocus_Click(object sender, RoutedEventArgs e)
{
// 启动自动对焦、自动曝光和自动白平衡,参考 LockedAutoFocusParameters
CameraFocusStatus status = await _captureDevice.FocusAsync();
lblMsg.Text += status.ToString();
lblMsg.Text += System.Environment.NewLine; // 复位对焦
// _captureDevice.ResetFocusAsync();
} private void Summary()
{
lblMsg.Text = ""; // 获取电话上的可用相机
foreach (CameraSensorLocation csl in PhotoCaptureDevice.AvailableSensorLocations)
{
// Back 或 Front
lblMsg.Text += "摄像头:" + csl.ToString();
lblMsg.Text += System.Environment.NewLine; // 捕获所支持的分辨率
lblMsg.Text += "捕获照片的可用分辨率:";
foreach (var size in PhotoCaptureDevice.GetAvailableCaptureResolutions(csl))
{
lblMsg.Text += size.Width + "*" + size.Height + " ";
}
lblMsg.Text += System.Environment.NewLine; // 捕获后的预览图所支持的分辨率
lblMsg.Text += "捕获照片的预览图的可用分辨率:";
foreach (var size in PhotoCaptureDevice.GetAvailablePreviewResolutions(csl))
{
lblMsg.Text += size.Width + "*" + size.Height + " ";
}
lblMsg.Text += System.Environment.NewLine; lblMsg.Text += "是否支持自动对焦:" + PhotoCaptureDevice.IsFocusSupported(csl);
lblMsg.Text += System.Environment.NewLine;
lblMsg.Text += "是否支持以编程方式自动对焦:" + PhotoCaptureDevice.IsFocusRegionSupported(csl);
lblMsg.Text += System.Environment.NewLine;
lblMsg.Text += System.Environment.NewLine; // 关于 CameraButtons 参见以前的文章:http://www.cnblogs.com/webabcd/archive/2012/08/15/2639428.html
// CameraButtons.ShutterKeyHalfPressed 事件,CameraButtons.ShutterKeyPressed 事件,CameraButtons.ShutterKeyReleased 事件
}
}
}
}
OK
[源码下载]
与众不同 windows phone (42) - 8.0 相机和照片: 通过 PhotoCaptureDevice 捕获照片的更多相关文章
- 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频
[源码下载] 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 作者:webabcd 介绍与众不同 win ...
- 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展
[源码下载] 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 作者:webabcd 介绍与众不同 windows ph ...
- 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector
[源码下载] 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的 ...
- 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask
[源码下载] 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirec ...
- 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile
[源码下载] 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile 作者:webabcd 介绍与众不同 windows ...
- 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件
[源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...
- 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议
[源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...
- 与众不同 windows phone (39) - 8.0 联系人和日历
[源码下载] 与众不同 windows phone (39) - 8.0 联系人和日历 作者:webabcd 介绍与众不同 windows phone 8.0 之 联系人和日历 自定义联系人存储的增删 ...
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能
[源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...
随机推荐
- jarsigner 签名android apk
1.查看签名: jarsigner -verify app_signed.apk 查看是否签名,如果已经签名会打印 "jar verified". jarsigner -verif ...
- C# winForm 窗体闪烁问题
在构造函数里加上以下代码: this.DoubleBuffered = true;//设置本窗体 SetStyle(ControlStyles.UserPaint, true); ...
- CSS3实现旋转的太极图(二):只用1个DIV
效果预览: PS: 1.昨天用3个DIV实现了太极图(点击查看),,今天试着用1个Div来做. 2.公司刚忙过双10周年庆,最近空闲下来,闲着也是闲着,总得写点东西吧. 3.高手莫喷,小弟仅仅是没 ...
- GitHub 操作流程示例
最新文章:Virson's Blog 参考文章: 博客园-Web前端开发,博客园-喻头快跑,GotGitHub 首先.通过github网站新建一个仓库,得到仓库地址 https://github.co ...
- MailMessage to EML
EML格式是微软公司在Outlook中所使用的一种遵循RFC822及其后续扩展的文件格式,并成为各类电子邮件软件的通用格式. 做个笔记,C# 邮件处理保存为eml格式: 一.网上好多这样的写法,可以在 ...
- Windows Server 2008 Workstation Converter优化设置
http://www.win2008workstation.com/windows-server-2008-workstation-converter/ If you don’t want to co ...
- 【转载】div层调整zindex属性无效原因分析及解决方法
在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效.在CSS中,只能通过代码改变层级,这个属性就是z-index,要让z-index起作用有个小小前提,就是元素的pos ...
- smartjs 0.2 OOP讲解 - factory
本篇介绍OOP的第二个对象factory.在以往项目中其实真正使用klass的地方相当少,而factory则是十分常见的. 在smartjs中的factory并不是指的是工厂模式.在factory要求 ...
- EditorWindow中手动控制焦点
在Unity3D中制作编辑器的时候,有时候会需要手动控制界面上控件的焦点,与此相关的有三个函数都在下面的示例代码中了: public void Test() { // 给控件命名 GUI.SetNex ...
- codeforces C. Bits(数学题+或运算)
题意:给定一个区间,求区间中的一个数,这个数表示成二进制的时候,数字1的个数最多! 如果有多个这样的数字,输出最小的那个! 思路:对左区间的这个数lx的二进制 从右往左将0变成1,直到lx的值大于右区 ...