基于iOS原生态API 的二维码扫描

前几天由于项目的需要,需要对名片的二维码进行扫描,获取名片上的信息, 在扫描的过程中发现对有些二维码图像界面比较复杂时, 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

你可能感兴趣的:(基于iOS原生态API 的二维码扫描)