iOS--iOS7摄像头识别二维码功能

iOS–iOS7摄像头识别二维码功能

属性介绍:

AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件。

  • AVCaptureDevice 是关于相机硬件的接口。它被用于控制硬件特性,诸如镜头的位置、曝光、闪光灯等。
  • AVCaptureDeviceInput 提供来自设备的数据。
  • AVCaptureOutput 是一个抽象类,描述 capture session 的结果。以下是三种关于静态图片捕捉的具体子类:
    • AVCaptureStillImageOutput 用于捕捉静态图片
    • AVCaptureMetadataOutput 启用检测人脸和二维码
    • AVCaptureVideoOutput 为实时预览图提供原始帧
  • AVCaptureSession 管理输入与输出之间的数据流,以及在出现问题时生成运行时错误。
  • AVCaptureVideoPreviewLayer 是 CALayer 的子类,可被用于自动显示相机产生的实时图像。它还有几个工具性质的方法,可将 layer 上的坐标转化到设备上。它看起来像输出,但其实不是。另外,它拥有 session (outputs 被 session 所拥有)。

设置属性:

@property (nonatomic, strong) AVCaptureSession *session;
@property (nonatomic, strong) AVCaptureDevice *device;
@property (nonatomic, strong) AVCaptureDeviceInput *input;
@property (nonatomic, strong) AVCaptureMetadataOutput *outPut;
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;

添加摄像头方法

/**
 *  设置摄像头代码
 */
- (void)setupCamera{
    //设备
    _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    //输入绑定设备
    NSError *error;
    _input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error];
    if (error) {
        return;
    }

    //输出
    _outPut = [[AVCaptureMetadataOutput alloc]init];
    [_outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    //session
    _session = [[AVCaptureSession alloc]init];
    [_session setSessionPreset:AVCaptureSessionPresetHigh];  //设置画面采集的质量
    if ([_session canAddInput:_input]) {
        [_session addInput:_input];
    }
    if ([_session canAddOutput:_outPut]) {
        [_session addOutput:_outPut];
    }

     //一定要先设置session的输出为output之后,再指定输出的元数据类型为二维码类型!
    [_outPut setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

    //预览图层
    _previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_session];
//    _previewLayer.videoGravity = AVLayerVideoGravityResizeAspect;   //preview图层的属性,使视图形状为屏幕大小形状
    _previewLayer.frame = self.view.frame;//preview图层的大小
    [self.view.layer insertSublayer:_previewLayer atIndex:0]; //将图层添加到视图的图层

    //开始运行
    [_session startRunning];
}

注意output中设置了一个delegate,我们需要怎么这个协议,然后在下面的代码中设置
[_outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]

协议的实现部分如下:

#pragma mark - AVCaptureMetadataOutputObjectsDelegate
// 在完成二维码解码时,调用
// 如果QRCode的内容越大,转换需要的时间就越长
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{

    NSString *stringValue;
    if ([metadataObjects count] >0)
    {
        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
        stringValue = metadataObject.stringValue;
    }

    NSLog(@"%@",stringValue);
    //获取扫描数据,结束编辑
    [_session stopRunning];
    [self dismissViewControllerAnimated:YES completion:nil];
}

二维码生成网站,测试时可使用

http://cli.im/text?text053e86238125abe22dd1474278f5855d

原文地址:https://www.cnblogs.com/AbeDay/p/5026886.html