你的位置:首页 > 软件开发 > ASP.net > 给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理

给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理

发布时间:2016-06-06 13:00:09
在“如何用MediaCapture解决二维码扫描问题”这篇文章中,我们通过“成像”、“截图”与“识别”三个步骤介绍了使用 ...

在“如何用MediaCapture解决二维码扫描问题”这篇文章中,我们通过“成像”、“截图”与“识别”三个步骤介绍了使用MediaCapture扫码的主要过程及注意事项。本文主要针对“识别”的过程,对Barcode的概念作出一个较为简单的介绍,同时也会讨论ZXing的使用方法。

 

ZXing是一个Java实现的开源库,可以支持多种Barcode的识别和生成,同时也为其它的语言提供了相应的接口,比如C++、Python、.Net等等。这里,我们使用ZXing.Net,可以很方便的集成在UWP环境中,便于扫码工作的开发。

 

Barcode简介

Barcode是一种机器可读的数据表示方式,作为某种商品或产品的唯一标识。通常被翻译成条码,但我个人并不喜欢这种翻译,因为不是所有的barcode都是条形的。当然,这应该是有历史原因的。Barcode的形式多种多样,按照它们的外观,可以分为Linear barcode(一维码)和Matrix barcode(二维码)。你可能认为你对它们都有所了解,因为它们大概都是这个样子的:

给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理      给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理

但事实上,它们有甚至有可能是这样子的:

给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理    给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理

我们通常所说的二维码和上文提到的二维码有所不同,只是Matrix barcode的一种,叫做QR code。举这些例子只是为了说明Barcode种类繁多,有些编码格式并不常用,即使是ZXing也没有做到所有格式的支持,开发者只需了解就好。

 

Code 39、Code 128、EAN、UPC、QR Code是我们生活中能经常见到的几种编码格式,同时ZXing对几种格式都有比较好的支持。其中,UPC-A是一种国际通用的编码格式,由12个数字构成,EAN-13是在UPC-A基础上的一种扩充(多了一个数字)。快数一数你身边的薯片的编码是不是13位!如果是的话,它最前边的两个数字是不是“69”?在EAN-13的编码体系中,前三位数字表示商品生产商的国家(并不是商品所属公司的国家),中国的编码是690~699,美国是(000~019、030~039、060~139),日本是(450~459、490~499),and so on。不同的编码格式通常用在不同的领域,如果你看到了一个Code 39或者Code 128的Barcode,那么这很就可能是一个快递编码,这个时候你就可以去那些提供快递查询的网站查询一下你的快递信息,如果有API提供出来那就更是再好不过了。至于QR Code,就是我们经常用手机扫一扫的二维码,表示的信息更是多种多样,并不仅仅是一个url那么简单,至于这些信息如何处理,是我们一会儿将要讨论的内容。

 

配置工程

在另一篇文章中提到,可以在Visual Studio环境下,通过nuget管理器安装ZXing.Net,如果你仅仅希望通过扫码得到一个扫码结果(比如字符串,或者是一个链接),当然可以这样做,而且过程十分简单。但这里我们并不推荐这种方法,因为从NuGet上得到的package只提供了一些简单的API接口,并没有将ZXing.Net的API全部提供出来,至于为什么这么做,说实话,我也不知道,可能是为了稳定性等原因。如果你是一个比较执着的programmer,也可以在使用NuGet包的情况下,自己实现其它丰富的功能,毕竟有ZXing的源代码可以参考,这就是开源的好处!在这篇文章中,我们还是以简单为主,毕竟ZXing.Net已经为我们提供了编译好的动态连接库,有什么理由让我们不用呢?

 

Important 官网提供的库和NuGet提供的库API稍微有些不同,如果需要更换,需要稍作修改,但过程并不是很繁琐。

 

你可以从http://zxingnet.codeplex.com/下载ZXing.Net的Release,压缩包目录下的/winrt/zxing.winrt.dll即是我们希望添加到工程的引用。

 

然后,把这个reference添加到相应的工程里就行:

给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理

 

 

获取Barcode内容信息

 

首先,你可以按照“如何用MediaCapture解决二维码扫描问题”这篇文章中提供的步骤,初始化摄像头、设置Timer并添加Tick事件,在Tick事件中,通过调用ZXing.Net的API获取扫码结果。

private async void TimerTick(object sender, object e){  try  {    if (_mediaCapture == null)      return;    var props = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview);    uint width = 0, height = 0;    if (props is ImageEncodingProperties)    {      width = (props as ImageEncodingProperties).Width;      height = (props as ImageEncodingProperties).Height;    }    else if (props is VideoEncodingProperties)    {      width = (props as VideoEncodingProperties).Width;      height = (props as VideoEncodingProperties).Height;    }    System.Diagnostics.Debug.WriteLine("Start scanning...");    Result decodeResult = null;    using (VideoFrame frameFormat = new VideoFrame(BitmapPixelFormat.Rgba8, (int)width, (int)height))    {      using (var frame = await _mediaCapture.GetPreviewFrameAsync(frameFormat))      {        var buffer = new Windows.Storage.Streams.Buffer(          (uint)(4 * frame.SoftwareBitmap.PixelWidth * frame.SoftwareBitmap.PixelHeight));        frame.SoftwareBitmap.CopyToBuffer(buffer);        var reader = new BarcodeReader();        decodeResult = reader.Decode(buffer.ToArray(), (int)width, (int)height, RGBLuminanceSource.BitmapFormat.RGB32);        System.Diagnostics.Debug.WriteLine(decodeResult);        if (decodeResult != null)        {          await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>          {            resultTextBlock.Text = decodeResult.Text;          });        }      }    }    //You can handle decodeResult by other ways.    if (decodeResult != null)      await Windows.System.Launcher.LaunchUriAsync(new Uri(decodeResult.Text));  }  catch (ArgumentNullException ane)  {    System.Diagnostics.Debug.WriteLine(ane.ToString());  }  catch (UriFormatException ufe)  {    System.Diagnostics.Debug.WriteLine(ufe.ToString());  }  catch (Exception ex)  {    System.Diagnostics.Debug.WriteLine("Timer tick exception: {0}!", ex);  }}

原标题:给你的应用“一只”智慧的眼睛 —— Barcode常识普及以及识别信息处理

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录