二维码的介绍

  • 二维码是用特定的几何图形来记录信息

  • 在之前,常用的二维码开发框架有:ZXing和ZBarSDK

  • 苹果从iOS7开始集成了二维码的生成和读取功能,并且之前的框架不支持64位,因此目前只使用苹果的框架即可

  • 二维码的开发

    • 生成二维码

    • 扫描二维码

二维码的生成

  • 二维码的生成就是将固定的信息生成对应的二维码图形

  • 生成二维码的步骤:

    • 导入CoreImage框架

    • 通过滤镜CIFilter生成二维码

        - 创建滤镜对象
      
        - 设置滤镜的默认设置
      
        - 给滤镜设置数据(KVC)
      
        - 获取生成的二维码图形
      
  • 代码实现


#import <CoreImage/CoreImage.h>



    // 1.创建滤镜对象

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



    // 2.设置相关的信息

    [filter setDefaults];



    // 3.设置二维码的数据

    NSString *dataString = @"http://www.520it.com";

    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];

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



    // 4.获取输出的图片

    CIImage *outputImage = [filter outputImage];

二维码的扫描

  • 二维码扫描就是将二维码的图像读取,并且解析成我们可以识别的信息

  • 扫描二维码的步骤

    • 读取二维码需要导入AVFoundation框架

    • 利用摄像头读取信息,并且输入

        - 获取捕捉会话(**AVCaptureSession**)
      
        - 设置输入(摄像头)
      
        - 设置输出(数据)
      
        - 添加预览图层
      
        - 开始扫描二维码
      
  • 代码实现


#import <AVFoundation/AVFoundation.h>



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    // 1.获取捕捉会话

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

    self.session = session;



    // 2.设置捕捉会话的输入设备

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

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

    [session addInput:input];



    // 3.设置捕捉会话的输出设备

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

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

    [session addOutput:output];

    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];



    // 4.添加扫描阅览的layer

    AVCaptureVideoPreviewLayer *player = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    player.frame = self.view.bounds;

    self.layer = player;

    [self.view.layer addSublayer:player];



    // 5.开始扫描

    [session startRunning];

}



#pragma mark - 实现元数据的回调方法

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{ 

    if (metadataObjects.count > 0) {

        AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];

        NSLog(@"%@", object.stringValue);



        [self.session stopRunning];

        [self.layer removeFromSuperlayer];

    }

}

zhunjiee
260 声望5 粉丝

简简单单每一天,做一只快乐的程序猿!


引用和评论

0 条评论