AVFoundation扫描二维码,条形码

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

zbar和zxing有哪些优劣势可以看看:http://www.cocoachina.com/industry/20140530/8615.html  这篇文章,这里就不多述。

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

一、实现

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

二,问题及解决

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

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

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

这段代码看上去没问题,但是本人使用的是以下这段代码

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

使用

self.videoPreviewLayer metadataOutputRectOfInterestForRect:self.boxFrame

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


你可能感兴趣的:(ios,二维码,条形码,AVFoundation,扫描区域)