在 IOS7 以前,在IOS中实现二维码和条形码扫描,有两大开源组件 ZBar
与 ZXing
. 总结下各自的缺点:
ZBar
在扫描的灵敏度上,和内存的使用上相对于ZXing
上都是较优的,但是对于 “圆角二维码” 的扫描确很困难。
- ZXing 是 Google Code上的一个开源的条形码扫描库,是用java设计的,连Google Glass 都在使用的。但有人为了追求更高效率以及可移植性,出现了c++ port. Github上的Objectivc-C port,其实就是用OC代码封装了一下而已,而且已经停止维护。
AVFoundation系统原生方法(demo)
这里说下使用过程中出现的问题:
1.关于提高识别效率设置解析范围 rectOfInterest(在zbar和zxing中就是scanCrop
, AVFoundation
是 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); }
1 __weak typeof(self) weakSelf = self; 2 [[NSNotificationCenter defaultCenter]addObserverForName:AVCaptureInputPortFormatDescriptionDidChangeNotification 3 object:nil 4 queue:[NSOperationQueue mainQueue] 5 usingBlock:^(NSNotification * _Nonnull note) { 6 if (weakSelf){ 7 //调整扫描区域 8 AVCaptureMetadataOutput *output = weakSelf.session.outputs.firstObject; 9 output.rectOfInterest = [weakSelf.previewLayer metadataOutputRectOfInterestForRect:weakSelf.scanerView.scanAreaRect]; 10 } 11 }];
这两种方法设置的rectOfInterest是一致的,不过第二种会导致控制台报错
<Error>: CGAffineTransformInvert: singular matrix. 原因不明
2.关于同时识别二维码和条形码导致条形码识别缓慢,需要对齐中心才能识别的问题。
是在Detect Center那個點,畫一個無限延伸的米字型,然後去判斷每一條線上能否解析出條形碼所需要的0101010序列。而iOS默認的Center是 Layer 的 Center。