IOS-二维码

一、二维码的生成

从iOS7开始集成了二维码的生成和读取功能
此前被广泛使用的zbarsdk目前不支持64位处理器
 
生成二维码的步骤:
1.导入CoreImage框架
2.通过滤镜CIFilter生成二维码
 
二维码的内容(传统的条形码只能放数字):
纯文本
名片
URL
 
生成二维码

// 1. 实例化二维码滤镜

CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

// 2. 恢复滤镜的默认属性

[filter setDefaults];

// 3. 将字符串转换成NSData

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

// 4. 通过KVO设置滤镜inputMessage数据

[filter setValue:data forKey:@"inputMessage"];

// 5. 获得滤镜输出的图像

CIImage *outputImage = [filter outputImage];

// 6. 将CIImage转换成UIImage,并放大显示

return [UIImage imageWithCIImage:outputImage scale:20.0 orientation:UIImageOrientationUp];

二、读取二维码

读取二维码需要导入AVFoundation框架
利用摄像头识别二维码中的内容(模拟器不行)
 
1.输入(摄像头)
2.由会话将摄像头采集到的二维码图像转换成字符串数据
3.输出(数据)
4.由预览图层显示扫描场景
 
设置拍摄会话

// 1. 实例化拍摄设备

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

// 2. 设置输入设备

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

// 3. 设置元数据输出

// 3.1 实例化拍摄元数据输出

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

// 3.3 设置输出数据代理

[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

// 4. 添加拍摄会话

// 4.1 实例化拍摄会话

AVCaptureSession *session = [[AVCaptureSession alloc] init];

// 4.2 添加会话输入

[session addInput:input];

// 4.3 添加会话输出

[session addOutput:output];

// 4.3 设置输出数据类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

设置拍摄视频预览图层

// 5. 视频预览图层

// 5.1 实例化预览图层

AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];

preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

preview.frame = self.view.bounds;

// 5.2 将图层插入当前视图

[self.view.layer insertSublayer:preview atIndex:100];

self.previewLayer = preview;

// 6. 启动会话

[_session startRunning];

代码:

 1 //
 2 //  ViewController.m
 3 //  01-生成二维码
 4 //
 5 //  Created by apple on 15/8/18.
 6 //  Copyright (c) 2015年 xiaomage. All rights reserved.
 7 //
 8 
 9 #import "ViewController.h"
10 #import <CoreImage/CoreImage.h>
11 
12 @interface ViewController ()
13 
14 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
15 
16 @end
17 
18 @implementation ViewController
19 
20 - (void)viewDidLoad
21 {
22     [super viewDidLoad];
23 }
24 
25 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
26 {
27     // 1.创建滤镜对象
28     CIFilter *fiter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
29     
30     // 2.设置相关属性
31     [fiter setDefaults];
32     
33     // 3.设置输入数据
34     NSString *inputData = @"http://www.520it.com";
35     NSData *data = [inputData dataUsingEncoding:NSUTF8StringEncoding];
36     [fiter setValue:data forKeyPath:@"inputMessage"];
37     
38     // 4.获取输出结果
39     CIImage *outputImage = [fiter outputImage];
40     
41     // 5.显示二维码
42     self.imageView.image = [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:200];
43 }
44 
45 /**
46  *  根据CIImage生成指定大小的UIImage
47  *
48  *  @param image CIImage
49  *  @param size  图片宽度
50  */
51 - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
52 {
53     CGRect extent = CGRectIntegral(image.extent);
54     CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
55     
56     // 1.创建bitmap;
57     size_t width = CGRectGetWidth(extent) * scale;
58     size_t height = CGRectGetHeight(extent) * scale;
59     CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
60     CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
61     CIContext *context = [CIContext contextWithOptions:nil];
62     CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
63     CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
64     CGContextScaleCTM(bitmapRef, scale, scale);
65     CGContextDrawImage(bitmapRef, extent, bitmapImage);
66     
67     // 2.保存bitmap到图片
68     CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
69     CGContextRelease(bitmapRef);
70     CGImageRelease(bitmapImage);
71     return [UIImage imageWithCGImage:scaledImage];
72 }
73 
74 @end
 1 //
 2 //  ViewController.m
 3 //  02-扫描二维码
 4 //
 5 //  Created by apple on 15/8/18.
 6 //  Copyright (c) 2015年 xiaomage. All rights reserved.
 7 //
 8 
 9 #import "ViewController.h"
10 #import <AVFoundation/AVFoundation.h>
11 
12 @interface ViewController () <AVCaptureMetadataOutputObjectsDelegate>
13 
14 @end
15 
16 @implementation ViewController
17 
18 - (void)viewDidLoad {
19     [super viewDidLoad];
20 }
21 
22 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
23 {
24     // 1.创建捕捉会话
25     AVCaptureSession *session = [[AVCaptureSession alloc] init];
26     
27     // 2.设置输入设备
28     AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
29     AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
30     [session addInput:inputDevice];
31     
32     // 3.设置输入方式
33     AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
34     [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
35     [session addOutput:output];
36     [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
37     
38     // 4.添加一个显示的layer
39     AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
40     layer.frame = self.view.bounds;
41     [self.view.layer addSublayer:layer];
42     
43     // 5.开始扫描
44     [session startRunning];
45 }
46 
47 #pragma mark - 获取扫描结果
48 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
49 {
50     if (metadataObjects.count > 0) {
51         AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
52         NSLog(@"%@", object.stringValue);
53     }
54 }
55 
56 @end
 
 
原文地址:https://www.cnblogs.com/oc-bowen/p/5351982.html