美文网首页
iOS二维码扫描

iOS二维码扫描

作者: 野猪哥123 | 来源:发表于2017-03-13 16:49 被阅读806次

在 iOS7 以前,在iOS中实现二维码和条形码扫描,我们所知的有,两大开源组件ZBar与ZXing. 这两大组件我们都有用过,这里总结下各自的缺点:

ZBar

ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 “圆角二维码” 的扫描确很困难。如:

iOS二维码扫描

ZXing

ZXing 是 Google Code上的一个开源的条形码扫描库,是用java设计的,连Google Glass 都在使用的。但有人为了追求更高效率以及可移植性,出现了c++ port. Github上的Objectivc-C port,其实就是用OC代码封装了一下而已,而且已经停止维护。这样效率非常低,在instrument下面可以看到CPU和内存疯涨,在内存小的机器上很容易崩溃。

AVFoundation

AVFoundation无论在扫描灵敏度和性能上来说都是最优的,所以毫无疑问我们应该切换到AVFoundation,需要兼容iOS 6或之前的版本可以用zbar或zxing代替。

下面介绍本文的重点,无论你是用以上哪一种或其他的解决方案,都需要知道下面两点。

1. 图片很小的二维码

以前测试提了一个bug,说有二维码扫不了,拿到二维码一看,是个很小的二维码,边长不到1cm,于是就修改了 sessionPreset 为 1080p 的,当时用的是ZXing, 当把图片质量改清楚时,也造成了性能的下降,基本打开扫描界面就会报memoryWarning,但是也确实解决了小二维码扫描的问题。

AVCaptureSession 可以设置 sessionPreset 属性,这个决定了视频输入每一帧图像质量的大小。

AVCaptureSessionPreset320x240

AVCaptureSessionPreset352x288

AVCaptureSessionPreset640x480

AVCaptureSessionPreset960x540

AVCaptureSessionPreset1280x720

AVCaptureSessionPreset1920x1080

以上列举了部分的属性值,分别代表输入图片质量大小,一般来说AVCaptureSessionPreset640x480就够使用,但是如果要保证较小的二维码图片能快速扫描,最好设置高些,如AVCaptureSessionPreset1920x1080(就是我们常说的1080p).

2. scanCrop

另一个提升扫描速度和性能的就是设置解析的范围,在zbar和zxing中就是scanCrop, AVFoundation中设置 AVCaptureMetadataOutput 的 rectOfInterest 属性来配置解析范围。

最开始我按照文档说的按照比例值来设置这个属性,如下:

CGSize size = self.view.bounds.size;

CGRect cropRect = CGRectMake(40, 100, 240, 240);

captureOutput.rectOfInterest = CGRectMake(cropRect.origin.x/size.width,

cropRect.origin.y/size.height,

cropRect.size.width/size.width,

cropRect.size.height/size.height);

但是发现, Ops, 好像不对啊,扫不到了,明显不正确呢,于是猜想: AVCapture输出的图片大小都是横着的,而iPhone的屏幕是竖着的,那么我把它旋转90°呢:

CGSize size = self.view.bounds.size;

CGRect cropRect = CGRectMake(40, 100, 240, 240);

captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,

cropRect.origin.x/size.width,

cropRect.size.height/size.height,

cropRect.size.width/size.width);

OK,貌似对了,在iPhone5上一切工作良好,但是在4s上,或者换了sessionPreset的大小之后,这个框貌似就不那么准确了, 可能发现超出框上下一些也是可以扫描出来的。 再次猜想: 图片的长宽比和手机屏幕不是一样的,这个rectOfInterest是相对于图片大小的比例。比如iPhone4s屏幕大小是 640x960, 而图片输出大小是 1920x1080. 实际的情况可能就是下图中的效果:

上图中下面的代表iPhone4s屏幕,大小640x960, 上面代表AVCaptureVideoPreviewLayer中预览到的图片位置,在图片输入为1920x1080大小时,实际大小上下会被截取一点的,因为我们AVCaptureVideoPreviewLayer设置的videoGravity是AVLayerVideoGravityResizeAspectFill, 类似于UIView的UIViewContentModeScaleAspectFill效果。

于是我对大小做了一下修正:

CGSize size = self.view.bounds.size;

CGRect cropRect = CGRectMake(40, 100, 240, 240);

CGFloat p1 = size.height/size.width;

CGFloat p2 = 1920./1080.;  //使用了1080p的图像输出

if (p1 < p2) {

CGFloat fixHeight = bounds.size.width * 1920. / 1080.;

CGFloat fixPadding = (fixHeight - size.height)/2;

captureOutput.rectOfInterest = CGRectMake((cropRect.origin.y + fixPadding)/fixHeight,

cropRect.origin.x/size.width,

cropRect.size.height/fixHeight,

cropRect.size.width/size.width);

} else {

CGFloat fixWidth = bounds.size.height * 1080. / 1920.;

CGFloat fixPadding = (fixWidth - size.width)/2;

captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,

(cropRect.origin.x + fixPadding)/fixWidth,

cropRect.size.height/size.height,

cropRect.size.width/fixWidth);

}

经过上面的验证,证实了猜想rectOfInterest是基于图像的大小裁剪的。

3. 小结

scanCrop对于扫描来说是比较重要的,试想图片截小点来解析是不是理论上就会更快了呢。网络上貌似很难搜到关于scanCrop的详解,希望对看到的人有帮助。

原文地址:http://blog.sina.com.cn/s/blog_77e377860102wzr6.html

转载地址:http://www.cocoachina.com/ios/20141225/10763.html

相关文章

  • iOS开发:二维码扫描与生成(扫描篇)

    iOS开发中经常要用到生成二维码与扫描二维码的功能,iOS7开始,系统支持原生的扫描二维码,iOS7 扫描二维码可...

  • ZBar

    iOS中使用ZBar扫描二维码自定义扫描界面

  • iOS开发之二维码扫描

    iOS开发之二维码扫描 在 iOS7 以前,在IOS中实现二维码和条形码扫描,我们所知的有,两大开源组件 ZBar...

  • IOS中生成二维码、扫描二维码

    title : IOS中生成二维码、扫描二维码category : UI IOS中生成二维码、保存二维码 标签(空...

  • iOS二维码扫描

    前面我们已经学会了iOS二维码生成相关的知识,这篇文章主要是讲解一下iOS二维码扫描相关的知识. 二维码扫描步骤 ...

  • 二维码扫描和创建(上)

    扫描二维码(包括读取和解码) 扫描二维码OC的开源库有ZBar和ZXing。iOS7以后iOS拥有原生的扫码功能。...

  • 2019-06-03

    iOS二维码扫描//设置条码类型 ****.metadataObjectTypes =@[... - 简书

  • 详细易懂的二维码的扫描、识别与生成

    ios7之前我们实现二维码扫描是借助第三方(ZBar,ZXing等)来实现的,在ios7之后系统自己提供二维码扫描...

  • 二维码扫描

    来源 二维码扫描 ios7之前我们实现二维码扫描一般是借助第三方来实现,但是在ios7之后系统自己提供二维码扫面的...

  • iOS 二维码扫描

    iOS开发中 二维码扫描 前言 在移动开发中二维码扫描这种事情越来越常见了,在iOS中我选择了用ZBar这个第三方...

网友评论

      本文标题:iOS二维码扫描

      本文链接:https://www.haomeiwen.com/subject/zccqnttx.html