How To Scan QRCode For UWP (3)

这一节主要介绍如何去设置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 = 1920;
 2         uint desiredHeight = 1080;
 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 == 0)
 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 != 0) ? (width / (double)heiht) : double.NaN, 2);
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[0];
12                         imageEnCodingProperties.Height = resolution[1];
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来实现扫描二维码的功能。

时间: 2025-01-07 17:41:47

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

SWIFT Scan QRCode

SWIFT中扫描QRCode代码如下,照着敲一次再看下API的注释应该就没问题了. import UIKit import Foundation import AVFoundation class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate,UIAlertViewDelegate { let device = AVCaptureDevice.defaultDeviceWithMediaType(A

How To Implement QRCode For UWP In Win10 (1)

本文将介绍实现一个类似于微信扫一扫功能的UI界面,后续会再实现具体的识别二维码的功能. 实例使用的Win10 SDK Version是Windows 10 Anniversary Edition(10.0;Build 14393). 简单的介绍UI布局 UI 布局采用 3*3 的Grid,扫描Foucs部分占据最中间,其他格子的背景色都是灰色并且设置了Opacity="0.2". 扫描的动画采用的是线性动画DoubleAnimation,需要提到的是Storyboard.TargetN

python库使用整理

1. 环境搭建 l  Python安装包:www.python.org l  Microsoft Visual C++ Compiler for Python l  pip(get-pip.py):pip.pypa.io/en/latest/installing.html n  pip install + 安装包          --安装包(.whl,.tar.gz,.zip) n  pip uninstall + 安装包        --卸载包 n  pip show --files +

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

使用AppCan平台进行移动开发,你所需要具备的是Html5+CSS +JS前端语言基础,此外,Hybrid混合模式应用还需结合原生语言对功能模块进行封装,对于没有原生基础的开发者,如何实现App里包括支付.界面布局.地图导航.IM等功能呢? 这里列出9个AppCan新插件,在使用AppCan平台进行移动开发时非常实用. 1. uexInAppPurchase iOS内部支付IAP插件:封装内部支付IAP相关操作. 方法说明: getProductList 得到产品列表方法 purchase 购

10月9日 Meteor Global Hackathon.

Meteor Global Hackathon 2015 Event Introduction Meteor Meetup groups from around the world will be participating in a global hackathon. Whether you're an experienced Meteor developer or just looking to get started, we hope you can join us. It will be

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

一.项目简介及需求 edusoho是一套商业版的在线教育平台,项目本身基于symfony2框架开发,现在有一款自己的APP,要求在不多修改edusoho自身代码的基础上,实现客户端对PC端扫码登录.不多修改edusoho代码的原因是为了避免下次升级主版本时发生错误. 二.版本信息及所需应用 edusoho 7.5.14 php 5.5.25 php  GD库 memcache(本次使用memcache作为存储介质,可用redis代替) 点我下载 phpqrcde(php生成二维码插件) 三.实现

纯js生成QRCode

纯js,不依赖jquery,非常好用,废话不多说,直接上代码! 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no"

Win10/UWP 让你的App使用上扫描仪

UWP的扫描仪功能现在被微软划分到了[Windows Desktop Extensions for the UWP]中,如果要使用扫描仪扫描图片到自己的App中,首先我们要添加[Windows Desktop Extensions for the UWP]的引用,这个dll中的所有类都是只能在Desktop设备上才能正常运行的.添加[Windows Desktop Extensions for the UWP] 扫描仪需要用Windows.Devices.Scanners 命名空间下的成员,有几

Windows 10 UWP 部署

原文  http://youthlin.com/20151105.html 我们知道VS连接手机可以直接部署到手机里,但平板貌似无法这样干,平板与电脑连接没有丝毫反应……那么想看VS里写的uwp应用在平板上的运行情况怎么办呢? 如果是本机电脑的话,也可以直接调试,要是平板———— 当然是部署啦,不过怎么部署呢,网上搜到的有命令行 winappdeploycmd.exe 命令的,有Win8.1时代部署方法的,我用winappdeploycmd.exe试了一下,一直无法找到设备,连手机也搜不到,于是