• 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
     
     
  • 相关阅读:
    Algebraic Data Type 及其在 Haskell 和 Scala 中的表现
    理解Rust的引用与借用
    ZooKeeper学习之路 (九)利用ZooKeeper搭建Hadoop的HA集群
    ZooKeeper学习之路 (八)ZooKeeper原理解析
    ZooKeeper学习之路 (七)ZooKeeper设计特点及典型应用场景
    ZooKeeper学习之路 (六)ZooKeeper API的简单使用(二)级联删除与创建
    ZooKeeper学习之路 (五)ZooKeeper API的简单使用 增删改查
    ZooKeeper学习之路 (四)ZooKeeper开发环境eclipse配置
    Zookeeper学习之路 (三)shell操作
    Zookeeper学习之路 (二)集群搭建
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5351982.html
Copyright © 2020-2023  润新知