一、二维码的生成
// 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];
二、读取二维码
// 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