这一节主要介绍如何去设置MediaCapture拍照的分辨率。

MediaCapture 包含一个 VideoDeviceController对象,凭借它可以控制摄像头的很多设置,其中包括设置拍照的分辨率。 首先通过GetAvailableMediaStreamProperties方法来获取设备所支持的 Encoding Properties,要注意的是即使你指定了MediaStreamType为Photo,这个API也会有可能同时返回 ImageEncodingProperties /VideoEncodingProperties对象。 因此我们在比较设备支持的Encoding Properties,需要手动去将它强制转换为 ImageEncodingProperties/VideoEncodingProperties对象。 此外还需要找到宽高比非常接近我们所期望的分辨率,误差范围在0.015之内。示例代码使用的宽高比为16:9,常见的还有4:3。

比较奇怪的IMediaEncodingProperties没有声明Width/Height属性,让代码写的有点啰嗦。

实现代码如下:

  1. uint desiredWidth = ;
  2. uint desiredHeight = ;
  3.  
  4. private async Task<uint[]> SetResolution(MediaStreamType streamType)
  5. {
  6. //Get the supported encoding properties.
  7. var mediaStreamProperties = mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(streamType);
  8. if (mediaStreamProperties == null || mediaStreamProperties.Count == )
  9. return null;
  10.  
  11. var imageEncodingProperty = mediaStreamProperties.Select(e => e as ImageEncodingProperties)
  12. .Where(e => e != null && e.Width <= desiredWidth
  13. && e.Height < desiredHeight && IsMatchingRatio(e))
  14. .OrderByDescending(e => e.Width * e.Height)
  15. .FirstOrDefault();
  16. if (imageEncodingProperty != null)
  17. {
  18. await mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(streamType, imageEncodingProperty);
  19. return new uint[] { imageEncodingProperty.Width, imageEncodingProperty.Height };
  20. }
  21.  
  22. var videoEncodingProperty = mediaStreamProperties.Select(e => e as VideoEncodingProperties)
  23. .Where(e => e != null && e.Width <= desiredWidth
  24. && e.Height < desiredHeight && IsMatchingRatio(e))
  25. .OrderByDescending(e => e.Width * e.Height)
  26. .FirstOrDefault();
  27. if (videoEncodingProperty != null)
  28. {
  29. await mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(streamType, videoEncodingProperty);
  30. return new uint[] { videoEncodingProperty.Width, videoEncodingProperty.Height };
  31. }
  32.  
  33. return null;
  34. }
  35.  
  36. private bool IsMatchingRatio(ImageEncodingProperties e)
  37. {
  38. double tolerance = 0.015;
  39. return Math.Abs(GetAspectRatio(e.Height, e.Width) - GetAspectRatio(desiredHeight, desiredWidth)) < tolerance;
  40. }
  41.  
  42. private bool IsMatchingRatio(VideoEncodingProperties e)
  43. {
  44. double tolerance = 0.015;
  45. return Math.Abs(GetAspectRatio(e.Height, e.Width) - GetAspectRatio(desiredHeight, desiredWidth)) < tolerance;
  46. }
  47.  
  48. private double GetAspectRatio(uint heiht, uint width)
  49. {
  50. return Math.Round((heiht != ) ? (width / (double)heiht) : double.NaN, );
  51. }

另外我决定采用的 LowLagPhotoCapture 来拍摄照片,可以调用 MediaCapture.PrepareLowLagPhotoCaptureAsync 初始化 LowLagPhotoCapture,初始化成功后就可以得到 LowLagPhotoCapture 对象。
然后使用 CaptureAsync 来捕获低快门滞后照片,拍照成功后得到一个 CapturedPhoto 对象,该对象包含两个 CapturedFrame 对象,其中一个返回的是缩略图,另外一个正是我们需要的。
最后使用 FinishAsync 释放 LowLagPhotoCapture 对象和资源,LowLagPhotoCapture 对象被释放后,再次拍照需要再次初始化。

  1. private LowLagPhotoCapture lowLagPhotoCapture;
  2. ...
  3. // Initialize MediaCapture
  4. try
  5. {
  6. await mediaCapture.InitializeAsync(settings);
  7. var imageEnCodingProperties = ImageEncodingProperties.CreatePng();
  8. var resolution = await SetResolution(MediaStreamType.Photo);
  9. if (resolution != null)
  10. {
  11. imageEnCodingProperties.Width = resolution[];
  12. imageEnCodingProperties.Height = resolution[];
  13. }
  14. lowLagPhotoCapture = await mediaCapture.PrepareLowLagPhotoCaptureAsync(imageEnCodingProperties);
  15. isInitialized = true;
  16. }
  17. catch (UnauthorizedAccessException)
  18. {
  19. await ShowMessage("Denied access to the camera.");
  20. }
  21. catch (Exception ex)
  22. {
  23. await ShowMessage("Exception when init MediaCapture. " + ex.Message);
  24. }
  25. ...

下一节将介绍采用ZXing.UWP来实现扫描二维码的功能。

How To Scan QRCode For UWP (3)的更多相关文章

  1. How To Scan QRCode For UWP (4)

    QR Code的全称是Quick Response Code,中文翻译为快速响应矩阵图码,有关它的简介可以查看维基百科. 我准备使用ZXing.Net来实现扫描二维码的功能,ZXing.Net在Cod ...

  2. How To Scan QRCode For UWP (2)

    这篇随笔主要介绍照相预览功能,重要使用的是MediaCapture对象,MediaCapture对象还可以用来处理录音和录制视频,本文只讨论照相功能. 1:查找摄像头 后置摄像头优先,找不到后置摄像头 ...

  3. How To Scan QRCode For UWP (1)

    本文将介绍实现一个类似于微信扫一扫功能的UI界面,后续会再实现具体的识别二维码的功能. 实例使用的Win10 SDK Version是Windows 10 Anniversary Edition(10 ...

  4. SWIFT Scan QRCode

    SWIFT中扫描QRCode代码如下,照着敲一次再看下API的注释应该就没问题了. import UIKit import Foundation import AVFoundation class V ...

  5. Python生成二维码脚本

    简单的记录下二维码生成和解析的Python代码 依赖下面三个包: PIL(图像处理包,安装:pip install PIL) qrcode(二维码生成包,安装:pip install qrcode) ...

  6. 初涉扫码登录:edusoho实现客户端扫码登录(简版)

    一.项目简介及需求 edusoho是一套商业版的在线教育平台,项目本身基于symfony2框架开发,现在有一款自己的APP,要求在不多修改edusoho自身代码的基础上,实现客户端对PC端扫码登录.不 ...

  7. 一次使用Python连接数据库生成二维码并安装为windows服务的工作任务

    最近有一个需求,在现有生产系统上的人员库中增加一个此人员关键信息的二维码,支持文字版和跳转版两种方式,与报表工具关联,可打印.以windows服务方式,定时检查,只要发现某人员没有此二维码信息,就生成 ...

  8. python库使用整理

    1. 环境搭建 l  Python安装包:www.python.org l  Microsoft Visual C++ Compiler for Python l  pip(get-pip.py):p ...

  9. AppCan移动应用开发平台新增9个超有用插件(内含演示样例代码)

    使用AppCan平台进行移动开发.你所须要具备的是Html5+CSS +JS前端语言基础.此外.Hybrid混合模式应用还需结合原生语言对功能模块进行封装,对于没有原生基础的开发人员,怎样实现App里 ...

随机推荐

  1. 第22章:MongoDB-聚合操作--聚合管道--$out

    ①$out $out:利用此操作可以将查询结果输出到指定的集合里面. ②范例:将投影的结果输出到集合里

  2. VIP之CVI CVO

        3. VIP CVI CVO   在开始时,对于CVI和CVO是不知道应该怎样去调试的,就是不知道应该从哪里去确认是对还是错. 关于这一点从再次看到关于数据包的格式才明朗的.去分析CVI和输出 ...

  3. Linux学习(1)- TCP/IP网络协议基础

    Linux学习(1)- TCP/IP网络协议基础 一.TCP/IP 简介 学习内容 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输 ...

  4. MFC载入JPG图片

    ## 1.定义画图函数 HRESULT CIPCamDlg::draw(char *lpImageFile, HWND hWnd, int nScrWidth, int nScrHeight) { H ...

  5. linux 修改密码

    1.开机 2.按下e键 直接进入编辑页面 3.找到ro 删除ro那一段 输入 rw init=/sysroot/bin/sh 4.进入单用户模式 5.改变程序执行时所参考的根目录位置 chroot / ...

  6. java基础-day20

    第09天 IO流 今日内容介绍 u  File类 u  字符流与字节流 第1章   File类 1.1      File概述 打开API,搜索File类.阅读其描述:File文件和目录路径名的抽象表 ...

  7. node linux

    在linux下安装nodejs 教程:http://my.oschina.net/blogshi/blog/260953 连接linux服务器,supervisor bin/www,断开连接,服务器还 ...

  8. D3_book 11.2 stack

    <!-- book :interactive data visualization for the web 11.2 stack 一个堆叠图的例子 --> <!DOCTYPE htm ...

  9. 杂谈--SQL SERVER版本

    SQL SERVER 内部版本号: SQL   Server Version Internal Database Version SQL Server 2014 782 SQL Server 2012 ...

  10. tfs查看最近签入记录及文件

    在团队资源管理=>源代码管理资源管理器=>选择某个最近签入的文件夹=>右键=>查看历史记录=>双击某个文件夹 就能看到最近变更集文件