iOS中二维码的生成与使用(入门篇)

      这里简单总结一下关于二维码的扫描与生成,用的是原生的AVFoundation框架,其实这个框架目前功能还是够用的,不过这里推荐一个二维码扫描的第三方(face++),网址就不贴了,直接度娘就OK,里面的内容足够丰富,感兴趣的朋友可以自己去倒弄一下。

     一.二维码的扫描     

步骤:
1.创建输入视频设备(默认是后置摄像头)
2.创建输入设备对象
3.创建元数据输出设备
4.创建session目的是将输入和输出联系在一起)
5.把输出设备添加到session,将输入设备添加到session
6.设置数据源的类型(需要真机这个才有值),指定代理(在代理方法中监听结果)
7.开始扫描
8.添加视频的预览界面(这里是打开相机
9.代理方法的实现
代码实现:
  
 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3 
 4 //    1.创建输入视频设备
 5     //默认为后置摄像头
 6     AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
 7 //    2.创建输入设备对象
 8     NSError * error = nil;
 9     AVCaptureDeviceInput * inputDevice = [[AVCaptureDeviceInput alloc]initWithDevice:device error:&error];
10     
11 //    3.创建元数据输出设备
12     AVCaptureMetadataOutput * outputDevice = [[AVCaptureMetadataOutput alloc]init];
13 //    4.创建session(作用是为了将输入和输出联系起来)
14     self.session = [[AVCaptureSession alloc]init];
15 //    5.把输出设备添加到session
16     if ([self.session canAddOutput:outputDevice]) {
17         [self.session addOutput:outputDevice];
18     }
19 //    6.把输入设备添加的session
20     if ([self.session canAddInput:inputDevice]) {
21         [self.session addInput:inputDevice];
22     }
23 //    7.设置数据源类型,这个值要真机才会有值
24 //    NSLog(@"%@",outputDevice.availableMetadataObjectTypes);
25     outputDevice.metadataObjectTypes = @[@"org.iso.QRCode"];
26     //设置输出的代理
27     [outputDevice setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
28 //    8.开始扫描
29     [self.session startRunning];
30     
31 //    9.设置预览界面
32     //视频预览层
33     AVCaptureVideoPreviewLayer * previewL = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session];
34     //设置frame
35     previewL.frame = self.view.bounds;
36     //添加到控制器的view
37     [self.view.layer addSublayer:previewL];
38     
39 }
40 
41 #pragma mark - AVCaptureMetadataOutputObjectsDelegate
42 //在这个代理中打印输出的结果
43 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
44 {
45     AVMetadataMachineReadableCodeObject * object = [metadataObjects firstObject];
46     NSLog(@"%@",object.stringValue);
47     //停止扫描,这样相机会停住了
48     [self.session stopRunning];
49 }

 

 
  二.二维码的生成(此列是根据一段文本生成一个二维码的图片)
 1  1.1 创建用于生成二维码滤镜
 2     CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
 3     NSData *messageData = [@"最近好吗?" dataUsingEncoding:NSUTF8StringEncoding];
 4 //  1.2 设置二维滤镜的输入
 5     [qrFilter setValue:messageData forKey:@"inputMessage"];
 6 //  1.3取出图片
 7     CIImage *ciImage = qrFilter.outputImage;
 8 //  1.4 放大图片
 9     ciImage = [ciImage imageByApplyingTransform:CGAffineTransformMakeScale(8, 8)];
10         
11 #pragma mark - 修改二维码的前景色和背景色
12 //  修改二维码的前景色和背景色,当你修改了前景色或背景色都会降低图片的识别度
13     CIFilter *falseColorFilter = [CIFilter filterWithName:@"CIFalseColor"];
14 //    inputImage, 图片
15 //    inputColor0, 前景颜色
16 //    inputColor1  背景色
17 //    这三个参数都是CoreImage中的对象
18 //     NSLog(@"%@",falseColorFilter.inputKeys);
19 //  图片
20     [falseColorFilter setValue:ciImage forKey:@"inputImage"];
21 //  前景色
22     [falseColorFilter setValue:[CIColor colorWithRed:1 green:0 blue:0] forKey:@"inputColor0"];
23 //  背景色
24     [falseColorFilter setValue:[CIColor colorWithRed:0 green:0 blue:1] forKey:@"inputColor1"];
25    
26     
27 
28 //  取出滤镜中的图片
29     ciImage = falseColorFilter.outputImage;
30     
31 //  二维码上面添加头像,也会降低二维码的识别度
32     UIImage *qrImage = [UIImage imageWithCIImage:ciImage];
33     
34 #pragma mark - 在原来的二维码的图片上画一个头像
35 //  在原来的二维码的图片上画一个头像
36 //  开启图片上下文
37     UIGraphicsBeginImageContext(qrImage.size);
38 //  绘制二维码图片
39     [qrImage drawInRect:CGRectMake(0, 0, qrImage.size.width, qrImage.size.height)];
40 //  绘制头像
41     UIImage *headImage = [UIImage imageNamed:@"cang"];
42     CGFloat headW = qrImage.size.width * 0.2;
43     CGFloat headH = qrImage.size.height * 0.2;
44     CGFloat headX = (qrImage.size.width - headW) * 0.5;
45     CGFloat headY = (qrImage.size.height - headH) * 0.5;
46     [headImage drawInRect:CGRectMake(headX, headY, headW, headH)];
47 //  从图片上下文中取出图片
48     qrImage  = UIGraphicsGetImageFromCurrentImageContext();
49     
50 //  关闭图片上下文
51     UIGraphicsEndImageContext();
52     
53 //  1.6 把CIImage转换为UIImage
54     self.imageView.image = qrImage;
55     

效果图:

ps:此列比较简单,写得比较简陋,后续有需求会逐渐完善,大家有什么好的代码也可以贴上来,一起交流。

 

posted @ 2016-06-25 21:10  码锋窝  阅读(2358)  评论(0编辑  收藏  举报