昨天,我非常马虎地给大家说了有关处理物理摄像头翻转的话题,今天,还是这个话题,而且内容不差,只是为了完整性,顺便也提供了运行时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篇)相关推荐

  1. php调用linux摄像头,Linux_Linux中开发USB摄像头驱动详解,USB摄像头以其良好的性能和低 - phpStudy...

    Linux中开发USB摄像头驱动详解 USB摄像头以其良好的性能和低廉的价格得到广泛应用.同时因其灵活.方便的特性,易于集成到嵌入式系统中.但是如果使用现有的符合Video for Linux标准的驱 ...

  2. Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题

    Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题 参考文章: (1)Android开发 - 解决DialogFragment在全屏时View被状态栏遮住的问题 ...

  3. UE4 如何解决摄像头移动毛边问题

    UE4 如何解决摄像头移动毛边问题 当视角改变或者物体运动时周边会产生毛边,像下面这种效果 解决方法是:在场景中找到[PostProcessVolume],如果场景中没有,就放入一个.用他包裹住场景, ...

  4. Android 短视频编辑开发之摄像头预览实时美颜(三)

    前言: 在上一篇文章中给小伙伴们介绍了进行Camera预览,如果你还没有看过的话,建议先去看上一篇文章<Android 短视频开发之摄像头预览(二> 本篇文章会介绍如何实现摄像头预览画面实 ...

  5. 猿创征文 | 微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

    文章目录 一.什么是 缓存? ⛅为什么用缓存? ⚡如何使用缓存 二.实现一个商家缓存 ⌛环境搭建 ♨️核心源码 ✅测试接口 三.采用 微服务 Spring Boot 注解开启缓存 ✂️@CacheEn ...

  6. 家庭装修APP软件开发解决需求

    家庭装修APP开发,家庭装修软件开发解决需求.根据家庭装修版块的人性化需求,家庭装修APP软件开发应时而生,完成平台的多用途服务项目归纳展现. 一.家庭装修APP软件开发销售市场需求剖析 现阶段的家庭 ...

  7. 同城货运app开发解决货运市场运输效率问题

    同城货运app开发解决货运市场运输效率问题 随着互联网的发展,货运市场的竞争也会变得越来越激烈.但是真正可以从用户需求出发的没有几个. 为了解决这个问题,同城货运app开发就应运而生,这款手机应用端可 ...

  8. 【Vuforia AR Unity 2018.3.12f1】MikuAR安卓程序开发实践(二)MMD篇_2019.4.23

    Unity平台 + Vuforia SDK实现的AR程序开发 !版权声明 项目源码 关于Github项目下载过慢的解决方法 关于Gitee下载报错的问题 一.解析 1 源码目录 2 Unity项目目录 ...

  9. 开发人员MySQL调优-实战篇2-让SQL使用索引详解

    2019独角兽企业重金招聘Python工程师标准>>> 建议先看看开发人员MySQL调优-实战篇0 让执行的SQL使用索引 虽然DBA给我们建了很多索引,但没有经验的开发人员往往只看 ...

最新文章

  1. python远程桌面控制_手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
  2. 加装的硬盘进入后点不了文件夹_Mac OS Catalina 挂载NTFS硬盘的问题 (无需第三方软件,几行代码即可)...
  3. Mining Precision Interface From Query Logs -- 学习笔记(三)
  4. 在Apache配置反向代理即实现输出内容替换
  5. [译]如何在visual studio中调试Javascript
  6. Django REST Framework API Guide 07
  7. Git的基本概念/常用命令及实例
  8. 五分钟带你了解前端开发,以及前端开发的发展机会
  9. 文件操作03 - 零基础入门学习C语言62
  10. linux 链接 time wait,linux 大量的TIME_WAIT解决办法
  11. vue项目解决: Invalid prop: type check failed for prop “index“问题
  12. 算法竞赛入门经典(第二版)习题解答——第一章
  13. ProE 5.0免安装版软件安装教程
  14. 如果你想学好Py thon,我这里有几本电子书想送你
  15. Android 读取本地Word/Pdf/Txt文件转文本输出
  16. 2020曼彻斯特大学计算机2020,2020年曼彻斯特大学申请要求完整版
  17. 软件需求分析(以美团外卖为例)
  18. Vivado、modelsim、VHDL错误集锦
  19. clickhouse分布式表调研
  20. 团队使我成长,学习使我快乐

热门文章

  1. 白内障预防+手术中人工晶状体的选择
  2. 真实集群下-flink shell的remote模式实验记录
  3. mysql8建立表格报错
  4. 报表工具流行度以及对linux的支持情况调研
  5. CodedInputStream encountered an embedded string or message which claimed to have negative size.
  6. spark的Web UI中的Storage啥信息都没有
  7. 批量kill掉包含某个nginx的进程
  8. 批量绘制train和test关于特征上的差异
  9. python2.7调用mysql存储过程并且返回结果
  10. centos云服务器出现No module named ‘_sqlite3′