AVFoundation扫描二维码,条形码

在使用AVFoundation以前用过,zbar,zxing来实现二维码的生成以及解析,可是未进行扫描二维码,经过查阅资料发现使用AVFoundation会更有优点。html

zbar和zxing有哪些优劣势能够看看:http://www.cocoachina.com/industry/20140530/8615.html  这篇文章,这里就很少述。git

本文主要是为了说明,在参考网上一些使用AVFoundation进行扫描去实现二维码,条形码扫描时出现的问题,解决的方法以及技巧。github

1、实现ide

    参考上面提供的里面的代码,应该均可以实现效果,也能够参考本人的写的一个demo:https://github.com/yanghaha/HYScanningView spa

二,问题及解决rest

    在封装HYScanningView 这个控件的时候,发现扫描区域的设定的问题。code

    查询相关资料,发现好多资料也提到了关键点,设置AVCaptureMetadataOutput的rectOfInterest属性,可是须要注意的rectOfInterest这个范围都是0~1之间的数值;并且在设置rectOfInterest的方法上大部分相似以下代码htm

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);
}

这段代码看上去没问题,可是本人使用的是如下这段代码get

   CGRect rectOfInterest = [self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame];
    _output.rectOfInterest = rectOfInterest;

使用it

self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame

这个获取转换后的rect时,须要确保 self.videoPreviewLayer已经添加到指定的layer上而且已显示

相关文章
相关标签/搜索