美文网首页iOS实用iOS 开发 iOS Developer
iOS_使用AVCaptureSession实现二维码和条形码的

iOS_使用AVCaptureSession实现二维码和条形码的

作者: Mark_Ming | 来源:发表于2016-06-07 13:32 被阅读6046次
上一篇文章提到了如何生成一张清晰的二维码图片,今天我们来使用iOS7.0之后苹果官方提供给我们的用来扫描二维码和条形码的方法,可能听说过ZBar或者ZXing这两个相对古老的第三方,在没有官方API之前,这两个三方在32位时期给了我们莫大的帮助,深表感谢!但经过对系统自带方法的使用,我发现苹果官方写的API效率真的很高。下面我们来实现扫描:

第一步:

//导入AVFoundation框架
#import <AVFoundation/AVFoundation.h>

第二步:

//签协议,我们会在协议方法里获取到扫描结果
@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>

第三步:

@property(nonatomic, strong)AVCaptureSession *session;//输入输出的中间桥梁

第四步:

#pragma mark -- 开始扫描
- (void)startScanWithSize:(CGFloat)sizeValue
{
    //获取摄像设备
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //创建输入流
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    //判断输入流是否可用
    if (input) {
        //创建输出流
        AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
        //设置代理,在主线程里刷新,注意此时self需要签AVCaptureMetadataOutputObjectsDelegate协议
        [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        //初始化连接对象
        self.session = [[AVCaptureSession alloc]init];
        //高质量采集率
        [_session setSessionPreset:AVCaptureSessionPresetHigh];
        [_session addInput:input];
        [_session addOutput:output];
        //设置扫码支持的编码格式(如下设置条形码和二维码兼容)
        output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
        //扫描区域大小的设置:(这部分也可以自定义,显示自己想要的布局)
        AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
        layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
        //设置为宽高为200的正方形区域相对于屏幕居中
        layer.frame = CGRectMake((self.view.bounds.size.width - sizeValue) / 2.0, (self.view.bounds.size.height - sizeValue) / 2.0, sizeValue, sizeValue);
        [self.view.layer insertSublayer:layer atIndex:0];
        //开始捕获图像:
        [_session startRunning];
    }
}

第五步:

#pragma mark -- 调用扫描方法
- (void)viewDidLoad {
    [super viewDidLoad];
    //300为正方形扫描区域边长
    [self startScanWithSize:300];
}

第六步:

#pragma mark - 扫面结果在这个代理方法里获取到
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    if (metadataObjects.count>0) {
        //获取到信息后停止扫描:
        [_session stopRunning];
        AVMetadataMachineReadableCodeObject *metaDataObject = [metadataObjects objectAtIndex:0];
        //输出扫描字符串:
        NSLog(@"%@", metaDataObject.stringValue);
        //移除扫描视图:
        AVCaptureVideoPreviewLayer *layer = (AVCaptureVideoPreviewLayer *)[[self.view.layer sublayers] objectAtIndex:0];
        [layer removeFromSuperlayer];
    }
}

注:有不足之处,还会继续研究完善,谢谢

相关文章

网友评论

  • 王远竹:第七步:声明权限
  • 武四三二一:xcode8 在设置 output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
    直接报错 什么情况
  • 956eec769113:请问如何做到多条码的识别?有什么启发可以分享一下吗?谢谢大牛
  • 唔将:我扫描出来怎么乱码了。要怎么解决啊,大神
  • e4d93d6aae84: :joy: 太原生了啊,没动画,边框白色,差评
    颜思齐:这只是入门,这种简单易懂清晰明了。想扩展成什么颜色什么动画自己写写就好了

本文标题:iOS_使用AVCaptureSession实现二维码和条形码的

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