美文网首页
基于iOS原生态API 的二维码扫描

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

作者: long2016 | 来源:发表于2017-05-02 15:16 被阅读37次

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

          本文链接:https://www.haomeiwen.com/subject/nstqtxtx.html