前几天由于项目的需要,需要对名片的二维码进行扫描,获取名片上的信息, 在扫描的过程中发现对有些二维码图像界面比较复杂时, ZBarSDK 这个第三方无法扫描成功, 具体是什么原因还尚不清楚, 于是利用的原生态的二维码API, 在iOS7 之后, 苹果提供了一套扫描二维码的API。
基本设置代码如下:
- (void)scanBeginning
{
//获取摄像设备
AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//创建输入流
AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
//创建输出流
AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
//设置代理 在主线程里刷新
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//初始化链接对象
self.session = [[AVCaptureSession alloc]init];
//高质量采集率
[self.session setSessionPreset:AVCaptureSessionPresetHigh];
[self.session addInput:input];
[self.session addOutput:output];
//设置扫码支持的编码格式(如下设置条形码和二维码兼容)
output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
layer.frame=self.view.layer.bounds;
[self.view.layer insertSublayer:layer atIndex:0];
// //扫描区域坐标系转换 不知道为什么转换不了
// CGRect intertRect = [layer metadataOutputRectOfInterestForRect:_scanCropView.frame];
//rectOfInterest 是一个 CGRect 类型, 其值在(0,1)之间
CGFloat x = _scanCropView.frame.origin.x / CGRectGetWidth(self.view.frame);
CGFloat y = _scanCropView.frame.origin.y / CGRectGetWidth(self.view.frame);
CGFloat width = _scanCropView.frame.size.width / CGRectGetHeight(self.view.frame);
CGFloat height = _scanCropView.frame.size.height / CGRectGetHeight(self.view.frame);
output.rectOfInterest = CGRectMake(x, y, width, height);
DLog(@"______%@",NSStringFromCGRect(CGRectMake(x, y, width, height)));
//开始捕获
[self.session startRunning];
}
扫描的结果在代理方法里返回:
#pragma mark - Delegate
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
if (metadataObjects.count>0) {
AVMetadataMachineReadableCodeObject * metadataObject = metadataObjects.firstObject;
//输出扫描字符串
NSString *resultStr = metadataObject.stringValue;
// 这是返回的扫描结果
DLog(@"_________%@",resultStr);
}
}
完整的 Demo已上传到 Github: https://github.com/leo-ll/QRCode