如何用MediaCapture解决二维码扫描问题
2017-09-20 13:58
113 查看
原文:如何用MediaCapture解决二维码扫描问题二维码扫描的实现,简单的来说可以分三步走:“成像”、“截图”与“识别”。
UWP开发中,最常用的媒体工具非MediaCapture莫属了,下面就来简单介绍一下如何利用MediaCapture来实现扫描和截图并且利用Zxing识别二维码,以及会遇到的问题和需要注意的地方。
1. 初始化与成像
View Code
顺便提一下记得要使用如下两个命名空间
否则无法实现buffer.AsStream().AsRandomAccessStream()
B) 连续聚焦
并不是所有机型都支持连续聚焦的(FocusMode.Continuous),这个时候只能自己实现间断性持续聚焦了
C) 截图之后图片处理
有的时候为了实现一些功能(比如说扫描框)或者提高识别率,我们需要对截取出来的图片进行一些二次处理,或剪裁或缩放或旋转,我们可以使用BitmapDecoder和BitmapEncoder来实现
D) 挂起和唤醒
另外值得注意的是,程序在Suspending和Resuming还有Activated时出现的一系列状态转换,这时候很容易引起bug,需要处理好避免crash。
4. 最后
识别出来的字符串处理一般也就超链接和普通文本两种,当然也可以增加条码扫描功能,识别出的是编码,不管怎样,大家可以根据项目具体需求做相应的处理。
UWP开发中,最常用的媒体工具非MediaCapture莫属了,下面就来简单介绍一下如何利用MediaCapture来实现扫描和截图并且利用Zxing识别二维码,以及会遇到的问题和需要注意的地方。
1. 初始化与成像
private async void _timer_Tick(object sender, object e) { var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties; using (var videoFrame = new VideoFrame(BitmapPixelFormat.Rgba8, (int)previewProperties.Width, (int)previewProperties.Height)) { using (var currentFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame)) { using (var previewFrame = currentFrame.SoftwareBitmap) { var buffer = new Windows.Storage.Streams.Buffer((uint)(4 * previewFrame.PixelWidth * previewFrame.PixelHeight)); previewFrame.CopyToBuffer(buffer); using (var stream = buffer.AsStream().AsRandomAccessStream()) { //利用Zxing识别,成功:停止timer;失败:继续 var reader = new BarcodeReader(); var bitmapWriteable = new WriteableBitmap((int)previewProperties.Width, (int)previewProperties.Height); bitmapWriteable.SetSource(stream); var result = reader.Decode(bitmapWriteable); if (!string.IsNullOrEmpty(result.Text)) { _timer.Stop(); } } } } } }
View Code
顺便提一下记得要使用如下两个命名空间
using System.IO; using System.Runtime.InteropServices.WindowsRuntime;
否则无法实现buffer.AsStream().AsRandomAccessStream()
B) 连续聚焦
并不是所有机型都支持连续聚焦的(FocusMode.Continuous),这个时候只能自己实现间断性持续聚焦了
C) 截图之后图片处理
有的时候为了实现一些功能(比如说扫描框)或者提高识别率,我们需要对截取出来的图片进行一些二次处理,或剪裁或缩放或旋转,我们可以使用BitmapDecoder和BitmapEncoder来实现
using (var stream = buffer.AsStream().AsRandomAccessStream()) { var decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.JpegDecoderId, stream); var destStream = new InMemoryRandomAccessStream(); var encoder = await BitmapEncoder.CreateForTranscodingAsync(destStream, decoder); //剪裁 encoder.BitmapTransform.Bounds = new BitmapBounds() { X = 0, Y = 0, Width = 100, Height = 100 }; //缩放 encoder.BitmapTransform.ScaledWidth = 100; encoder.BitmapTransform.ScaledHeight = 100; //旋转 encoder.BitmapTransform.Rotation = BitmapRotation.Clockwise90Degrees; await encoder.FlushAsync(); await destStream.FlushAsync(); }
D) 挂起和唤醒
另外值得注意的是,程序在Suspending和Resuming还有Activated时出现的一系列状态转换,这时候很容易引起bug,需要处理好避免crash。
4. 最后
识别出来的字符串处理一般也就超链接和普通文本两种,当然也可以增加条码扫描功能,识别出的是编码,不管怎样,大家可以根据项目具体需求做相应的处理。
相关文章推荐
- 如何用MediaCapture解决二维码扫描问题
- 如何用MediaCapture解决二维码扫描问题
- PHP如何解决网站大流量与高并发的问题
- 如何解决Linux操作系统找不到网卡的问题
- 如何解决Eclipse挂掉的问题
- 如何解决虚拟机安装CentOS无法全屏显示问题
- 如何解决MSYS中Couldn’t reserve space for cygwin’s heap问题
- 如何解决office2007无法重装的问题
- 如何解决AJAX跨域问题
- 如何解决Python脚本在Linux和Windows上的格式问题
- 如何解决VMware Converter P2V迁移失败问题
- 如何解决ALV的负数符号前显的问题
- 如何解决Ajax请求结果的缓存问题说明
- 【xinfanqie】如何解决Win8系统硬盘灯老闪的问题
- 网站如何解决图片过大加载慢的问题?
- 如何解决乱码的问题
- 如何解决Eclipse按"alt+/"后闪屏(窗口闪个不停/不停抖动)的问题
- 如何优化代码节约系统资源解决重复实例化对象的问题——神奇的单例模式(C#设计模式)
- 如何解决WebService参数传递中文的问题
- 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题