美文网首页iOS学习
二维码生成和扫描

二维码生成和扫描

作者: iYeso | 来源:发表于2016-07-31 14:40 被阅读56次

    一.二维码的介绍

    • 二维码是用特定的几何图形来记录信息
    • 常用的二维码开发框架有:ZXing和ZBarSDK
    • 苹果从iOS7开始集成了二维码的生成和读取功能,并且之前的框架不支持64位,因此目前只使用苹果的框架即可

    二.二维码的生成

    • 二维码的生成就是将固定的信息生成对应的二维码图形
    • 生成二维码的步骤:
      • 导入CoreImage框架
      • 通过滤镜CIFilter生成二维码
        • 创建滤镜对象
        • 设置滤镜的默认设置
        • 给滤镜设置数据(KVC)
        • 获取生成的二维码图形
        //1. 创建滤镜
        CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    
        // 2.恢复默认设置
        [filter setDefaults];
    
        // 3. 设置数据
        NSString *info = @"http://www.jianshu.com/users/57da48d44319/latest_articles";
        NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding];
        [filter setValue:infoData forKey:@"inputMessage"];
    
        // 4. 生成二维码
        CIImage *im = [filter outputImage] ;
        self.imageView.image = [im createNonInterpolatedWithSize:300.0];
    

    三.二维码的扫描

    • 二维码扫描就是将二维码的图像读取,并且解析成我们可以识别的信息
    • 扫描二维码的步骤
      • 读取二维码需要导入AVFoundation框架
      • 利用摄像头读取信息,并且输入
        • 获取捕捉会话(AVCaptureSession)
        • 设置输入(摄像头)
        • 设置输出(数据)
        • 添加预览图层
        • 开始扫描二维码
    #pragma mark - 扫描二维码
    - (void)scanEWM{
        // 1.创建捕捉会话
        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        self.session = session;
    
        // 2.设置输入(摄像头)
        //  AVMediaTypeVideo:摄像头 AVMediaTypeAudio:话筒 AVMediaTypeMuxed:弹幕
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
        [session addInput:input];
    
        // 3.设置输出(数据)
        AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
        [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        [session addOutput:output];
        // 设置输入的类型,必须在output加入到会话之后来设置
        [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    
        // 4.添加阅览图层
        AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
        layer.frame = self.view.bounds;
        [self.view.layer addSublayer:layer];
        self.layer = layer;
    
        // 5.开始扫描
        [session startRunning];
    }
    
    
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
        if (metadataObjects.count > 0) {
            // 1.获取扫描到的内容
            AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
            NSLog(@"%@", object.stringValue);
    
            // 2.停止会话
            [self.session stopRunning];
    
            // 3.移除预览图层
            [self.layer removeFromSuperlayer];
        }
    }
    

    相关文章

      网友评论

      • 40c6620494c9:createNonInterpolatedWithSize 这方法你是从哪来的

      本文标题:二维码生成和扫描

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