(一〇五)二维码的生成和扫描

【生成二维码】

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

原文地址:https://www.cnblogs.com/aiwz/p/6154084.html