昨天,我非常马虎地给大家说了有关处理物理摄像头翻转的话题,今天,还是这个话题,而且内容不差,只是为了完整性,顺便也提供了运行时API的版本,其实实现起来与SL框架版本差不多,毕竟这两个框架都有不少API是共享的。
首先,打开清单文件,在“应用程序”选项卡上,把“支持的旋转”右面的横向选上,其他的不要选,只选横向。
然后切换到“功能”选项卡,把 网络摄像机 和 图片库 勾上,因为我们要用到它们。
同样,使用MediaCapture类时要注意,在应用程序挂起时把它释放掉,而在应用程序启动或继续运行时,对其进行初始化。
在App类中加入以下代码:
/// <summary>
/// 视频捕捉对象
/// </summary>
public MediaCapture TheCapture { get; private set; } /// <summary>
/// 初始化摄像头
/// </summary>
private async Task InitializeCapture ()
{
TheCapture = new MediaCapture();
// 查找后置摄像头
var deviceCollection = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
DeviceInformation backCamera = deviceCollection.FirstOrDefault(d => d.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back);
if (backCamera != null)
{
MediaCaptureInitializationSettings setting = new MediaCaptureInitializationSettings();
setting.AudioDeviceId = "";
setting.VideoDeviceId = backCamera.Id;
await TheCapture.InitializeAsync(setting);
}
else
{
await TheCapture.InitializeAsync();
}
} /// <summary>
/// 清理摄像头相关资源
/// </summary>
private void CleanupCapture ()
{
if (TheCapture != null)
{
TheCapture.Dispose();
TheCapture = null;
}
}
InitializeCapture方法用来初始化捕捉组件,CleanupCapture方法则用来清理。InitializeCapture方法使用了Task,表示它可以异步等待,因为稍后要在Launch中调用,在导航到主页前调用,如果不进行异步等待的话,应用程序会在MediaCapture未初始化之前就进入了主页,而在主页中开启预览就会发生异常,因此,通过异步等待,可以确保在进入主页前完成MediaCapture对象的初始化。
在OnLaunched方法中加入以下代码来初始化捕捉组件。
protected async override void OnLaunched(LaunchActivatedEventArgs e)
{
// 隐藏状态栏
Windows.UI.ViewManagement.StatusBar statusbar =
Windows.UI.ViewManagement.StatusBar.GetForCurrentView();
await statusbar.HideAsync();
#if DEBUG
if (System.Diagnostics.Debugger.IsAttached)
{
this.DebugSettings.EnableFrameRateCounter = true;
}
#endif await this.InitializeCapture();
……
使用StatusBar类是为了把系统栏隐藏起来,系统图标栏就是手机顶部那条图标栏,显示信号、时间等信息的地方。
在应用程序挂起时,要释放MediaCapture对象,故要处理Suspending事件。
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral(); // TODO: 保存应用程序状态并停止任何后台活动 // 停止拍摄预览
await TheCapture.StopPreviewAsync();
this.CleanupCapture(); deferral.Complete();
}
当应用程序从挂起(如切换到其他应用,或回到开始屏幕)状态中恢复时(回到应用程序),会引发Resuming事件,处理该事件并重新初始化MediaCapture对象。
async void OnResuming ( object sender, object e )
{
await this.InitializeCapture();
Frame root = Window.Current.Content as Frame;
if (root != null)
{
MainPage page = root.Content as MainPage;
if (page != null)
await page.SetCaptureSourceAsync();
}
}
SetCaptureSourceAsync方法是在MainPage页面类中定义的一个方法,作用是获取MediaCapture对象的引用,并开始拍摄预览。方法的定义如下:
public async System.Threading.Tasks.Task SetCaptureSourceAsync ()
{
capture = (App.Current as App).TheCapture;
ce.Source = capture;
await capture.StartPreviewAsync();
}
在Silverlight框架中,是通过VideoBrush来显示摄像头的预览画面的,而在运行时API中,从RT应用程序中移植了CaptureElement类,该类有一个Source属性,用于设置关联的MediaCapture实例,这样就可以在CaptureElement可视化元素中看到摄像头的预览效果了,接着调用StartPreviewAsync方法开始预览。
拍照和保存照片的方法和前面的示例差不多,不过,运行时API可以使用Windows.Storage中的类来进行文件处理。
通过以下代码获得图片库文件夹的引用:
StorageFolder picDir = KnownFolders.PicturesLibrary;
其他流程和前面的示例一样,先把照片捕捉到流中,再通过解码/编码的方法来调整图片的旋转方向。不过,这里还要提及一个细节:
下面是示例的下载地址:http://files.cnblogs.com/tcjiaan/CameraRTTestApp.zip
【WP 8.1开发】解决摄像头翻转问题(RuntimeApp篇)的更多相关文章
-
【WP 8.1开发】如何处理摄像头翻转的问题
模拟器就像我们儿时的梦境,在其上运行应用程序时,一切总是那么美好的:而真机测试如同我们这个纷乱无章的现实世界,你会遇到各种小人和畜生,常常会遭受莫名的挫折.面对挫折,有人迎难而上,或不予理采,走自己的 ...
-
【WP 8.1开发】How to 图像处理
在今天的吹牛节目开始之前,先交代一件事: 关于玩WP 8.1开发所使用的VS版本问题.对版本的要求是2013的Update2,这是最低要求,只要是这个版本或以上都可以,而update3,update4 ...
-
Android开发之漫漫长途 番外篇——内存泄漏分析与解决
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
-
安卓开发解决android.os.NetworkOnMainThreadException异常方法(主线程不能直接调用webservice)
安卓开发解决android.os.NetworkOnMainThreadException异常方法 2013-01-07 14:01:04| 分类: 技术 | 标签:安卓 技术 java | ...
-
WP Mail SMTP插件解决Contact Form 7表单提交失败问题
WP Mail SMTP插件解决Contact Form 7表单提交失败问题 WP Mail SMTP是一款非常优秀的解决WordPress主机因为不支持或者是禁用了mail()函数,导致无法实现在线 ...
-
Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...
-
【Linux开发】Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...
-
iPhone开发 数据持久化总结(终结篇)—5种数据持久化方法对比
iPhone开发 数据持久化总结(终结篇)—5种数据持久化方法对比 iphoneiPhoneIPhoneIPHONEIphone数据持久化 对比总结 本篇对IOS中常用的5种数据持久化方法进行简单 ...
-
Qt 开发 MS VC 控件终极篇
Qt 开发 MS VC 控件终极篇 1. 使用 MSVC2015 通过项目向导创建 Qt ActiveQt Server 解决方案 项目配置:以下文件需要修改 1. 项目属性页->项目属性-&g ...
随机推荐
-
XAF 如何将数据库中Byte array图片显示出来
问题比较简单,直接上代码. private Image _Cover; [Size(SizeAttribute.Unlimited), ValueConverter(typeof(ImageValue ...
-
BZOJ2426 [HAOI2010]工厂选址
Description 某地区有m座煤矿,其中第i号矿每年产量为ai吨,现有火力发电厂一个,每年需用煤b吨,每年运行的固定费用(包括折旧费,不包括煤的运费)为h元,每吨原煤从第i号矿运到原有发电厂的运 ...
-
Linux网络参数设置
1.ifconfig 查询.设定网络卡与ip 设置桥接网络 # vi /etc/sysconfig/network-script/ifcfg-br0 DEVICE=br0 ...
-
ajax调用aspx.cs中的WebMethod
前台: <script language="javascript" src="../js/jquery-1.8.2.js"></script& ...
-
ORM系列之一:Dos.ORM
阅读目录 引言 1.为什么使用Dos.ORM 2.配置 3.开始使用 3.1. 物理表 3.2. 实体类 3.3. 使用方法 引言 Dos.ORM(原名Hxj.Data)于2009年发布,2015年正 ...
-
hadoop job执行完的统计信息
Total committed heap usage (bytes)= Physical memory (bytes) snapshot= Virtual memory (bytes) snapsho ...
-
再一次强调,ORACLE外键必须加索引
外键加索引是常识,必须牢记.本来不想写这样的简单案例.可是连续遇到好几起外键不加索引导致性能问题,所以还是写一下. 一个兄弟问我 delete from Sa_Sales_Comm_Detail s ...
-
libiconv_百度百科
libiconv_百度百科 由于历史原因,国际化的文字常常由于语言或者国家的原因使用不同的编码.目录 1libiconv历史简介 2libiconv编码简介 3libico ...
-
MySQLzip archive版本(5.7.19)安装教程
1. 从官网下载zip archive版本http://dev.mysql.com/downloads/mysql/ 2. 解压缩至相应目录,并配置环境变量(将*\bin添加进path中): 3. ...
-
自己写的,然后配合zepto+iscroll的上拉加载
/** * Created by jl on 2016/3/28. *///初始化绑定iScroll控件var actHtml="";var myScroll, pullUp ...