zoukankan      html  css  js  c++  java
  • (一〇五)二维码的生成和扫描

    【生成二维码】

    iOS7以后苹果有CoreImage框架用于生成二维码,二维码通过滤镜生成,二维码滤镜可以将字符串转化为二维码。

    注意字符串必须转化为NSData传入,通过KVC告诉滤镜。

    滤镜输出为CIImage,注意要转化为UIImage使用。

    代码如下:

        // 1.实例化二维码滤镜
        CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
        // 2.重置滤镜属性
        [filter setDefaults];
        // 3.字符串转NSData
        NSData *data = [@"http://www.soulghost.com" dataUsingEncoding:NSUTF8StringEncoding];
        // 4.通过KVC设置属性
        [filter setValue:data forKey:@"inputMessage"];
        // 5.生成二维码
        CIImage *QRImage = [filter outputImage];
        UIImage *image = [UIImage imageWithCIImage:QRImage];
    


    【扫描二维码】

    扫描二维码通过输入源摄像头、会话转换数据、输出成字符串完成二维码的解析。

    代码如下:

    //
    //  ViewController.m
    //  读取二维码
    //
    //  Created by 11 on 8/3/15.
    //  Copyright (c) 2015 soulghost. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <AVFoundation/AVFoundation.h>
    
    @interface ViewController () <AVCaptureMetadataOutputObjectsDelegate>
    
    @property (nonatomic, strong) AVCaptureSession *session;
    @property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad{
        
        [super viewDidLoad];
        
        // 摄像头作为输入源
        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()];
        
        // 实例化一个会话,它将摄像头采集的图像(input)转换成字符串(output)。
        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        [session addInput:input];
        [session addOutput:output];
        _session = session;
        // 设置输出类型为二维码
        [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
        
        // 创建二维码的扫描视图,通过session判断显示的内容。
        AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];
        preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
        preview.frame = self.view.bounds;
        [self.view.layer insertSublayer:preview atIndex:100];
        _previewLayer = preview;
        
        // 开启会话
        [_session startRunning];
        
    }
    
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
        
        // 停止会话,移除扫描视图
        [_session stopRunning];
        [_previewLayer removeFromSuperlayer];
        
        // 取出数据
        if (metadataObjects.count > 0) {
            AVMetadataMachineReadableCodeObject *obj = [metadataObjects firstObject];
            NSLog(@"%@",obj);
        }
        
    }
    
    @end
    

  • 相关阅读:
    寒假学习(九)
    寒假学习(八)利用Sqoop导出Hive分析数据到MySQL库
    寒假学习(七)热词统计
    寒假学习(六)统计学生成绩
    寒假学习(五)模拟图形绘制
    寒假学习(四)编写MapReduce程序清洗信件内容数据
    寒假学习(三)北京市政百姓信件分析
    实现地图输出的相关知识
    使用Node.js+Socket.IO搭建WebSocket实时应用
    centos6 安装python3.5后pip无法使用的处理
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154084.html
Copyright © 2011-2022 走看看