【WP 8.1开发】解决摄像头翻转问题(RuntimeApp篇)
昨天,我非常马虎地给大家说了有关处理物理摄像头翻转的话题,今天,还是这个话题,而且内容不差,只是为了完整性,顺便也提供了运行时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 DEBUGif (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
转载于:https://www.cnblogs.com/tcjiaan/p/3946266.html
【WP 8.1开发】解决摄像头翻转问题(RuntimeApp篇)相关推荐
- php调用linux摄像头,Linux_Linux中开发USB摄像头驱动详解,USB摄像头以其良好的性能和低 - phpStudy...
Linux中开发USB摄像头驱动详解 USB摄像头以其良好的性能和低廉的价格得到广泛应用.同时因其灵活.方便的特性,易于集成到嵌入式系统中.但是如果使用现有的符合Video for Linux标准的驱 ...
- Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题
Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题 参考文章: (1)Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题 ...
- UE4 如何解决摄像头移动毛边问题
UE4 如何解决摄像头移动毛边问题 当视角改变或者物体运动时周边会产生毛边,像下面这种效果 解决方法是:在场景中找到[PostProcessVolume],如果场景中没有,就放入一个.用他包裹住场景, ...
- Android 短视频编辑开发之摄像头预览实时美颜(三)
前言: 在上一篇文章中给小伙伴们介绍了进行Camera预览,如果你还没有看过的话,建议先去看上一篇文章<Android 短视频开发之摄像头预览(二> 本篇文章会介绍如何实现摄像头预览画面实 ...
- 猿创征文 | 微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存
文章目录 一.什么是 缓存? ⛅为什么用缓存? ⚡如何使用缓存 二.实现一个商家缓存 ⌛环境搭建 ♨️核心源码 ✅测试接口 三.采用 微服务 Spring Boot 注解开启缓存 ✂️@CacheEn ...
- 家庭装修APP软件开发解决需求
家庭装修APP开发,家庭装修软件开发解决需求.根据家庭装修版块的人性化需求,家庭装修APP软件开发应时而生,完成平台的多用途服务项目归纳展现. 一.家庭装修APP软件开发销售市场需求剖析 现阶段的家庭 ...
- 同城货运app开发解决货运市场运输效率问题
同城货运app开发解决货运市场运输效率问题 随着互联网的发展,货运市场的竞争也会变得越来越激烈.但是真正可以从用户需求出发的没有几个. 为了解决这个问题,同城货运app开发就应运而生,这款手机应用端可 ...
- 【Vuforia AR Unity 2018.3.12f1】MikuAR安卓程序开发实践(二)MMD篇_2019.4.23
Unity平台 + Vuforia SDK实现的AR程序开发 !版权声明 项目源码 关于Github项目下载过慢的解决方法 关于Gitee下载报错的问题 一.解析 1 源码目录 2 Unity项目目录 ...
- 开发人员MySQL调优-实战篇2-让SQL使用索引详解
2019独角兽企业重金招聘Python工程师标准>>> 建议先看看开发人员MySQL调优-实战篇0 让执行的SQL使用索引 虽然DBA给我们建了很多索引,但没有经验的开发人员往往只看 ...
最新文章
- python远程桌面控制_手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
- 加装的硬盘进入后点不了文件夹_Mac OS Catalina 挂载NTFS硬盘的问题 (无需第三方软件,几行代码即可)...
- Mining Precision Interface From Query Logs -- 学习笔记(三)
- 在Apache配置反向代理即实现输出内容替换
- [译]如何在visual studio中调试Javascript
- Django REST Framework API Guide 07
- Git的基本概念/常用命令及实例
- 五分钟带你了解前端开发,以及前端开发的发展机会
- 文件操作03 - 零基础入门学习C语言62
- linux 链接 time wait,linux 大量的TIME_WAIT解决办法
- vue项目解决: Invalid prop: type check failed for prop “index“问题
- 算法竞赛入门经典(第二版)习题解答——第一章
- ProE 5.0免安装版软件安装教程
- 如果你想学好Py thon,我这里有几本电子书想送你
- Android 读取本地Word/Pdf/Txt文件转文本输出
- 2020曼彻斯特大学计算机2020,2020年曼彻斯特大学申请要求完整版
- 软件需求分析(以美团外卖为例)
- Vivado、modelsim、VHDL错误集锦
- clickhouse分布式表调研
- 团队使我成长,学习使我快乐
热门文章
- 白内障预防+手术中人工晶状体的选择
- 真实集群下-flink shell的remote模式实验记录
- mysql8建立表格报错
- 报表工具流行度以及对linux的支持情况调研
- CodedInputStream encountered an embedded string or message which claimed to have negative size.
- spark的Web UI中的Storage啥信息都没有
- 批量kill掉包含某个nginx的进程
- 批量绘制train和test关于特征上的差异
- python2.7调用mysql存储过程并且返回结果
- centos云服务器出现No module named ‘_sqlite3′