美文网首页iOS 细节大集合swift3.0橙红科技有限公司
iOS二维码的生成和扫码详细介绍(手把手教)

iOS二维码的生成和扫码详细介绍(手把手教)

作者: IIronMan | 来源:发表于2016-11-01 03:26 被阅读3967次
    • 二维码是用特定的几何图形来记录信息
    • 在之前,常用的二维码开发框架有:ZXingZBarSDK
    • 苹果从iOS7开始集成了二维码的生成和读取功能,并且之前的框架不支持64位,因此目前只是用苹果的框架即可

    二.二维码的生成

    • 二维码的生成就是将固定的信息生成对应的二维码
    • 生成二维码的步骤:
      (1).导入CoreImage框架
      (2).通过滤镜CIFilter生成二维码
      <1>.创建滤镜对象
      <2>.设置滤镜的默认设置
      <3>.给滤镜设置数据(KVC)
      <4>.获取生成的二维码图形

    下面是实际代码:

    • 1.导入#import <CoreImage/CoreImage.h> :此框架非常强大

    • 2.创建CIFilte(滤镜)对象

       CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
      
    • 3.恢复滤镜默认设置

      [filter setDefaults];
      
    • 4.设置数据(通过滤镜对象的KVC)

      //存放的信息
      NSString *info = @"我叫王冲";
      //把信息转化为NSData
      NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding];
      //滤镜对象kvc存值
      [filter setValue:infoData forKeyPath:@"inputMessage"];
      
      //我们可以打印,看过滤器的 输入属性.这样我们才知道给谁赋值
       NSLog(@"%@",qrImageFilter.inputKeys);
       /*
          inputMessage,        //二维码输入信息
          inputCorrectionLevel //二维码错误的等级,就是容错率
        */
      
    • 5.生成二维码(前提建立一个UIIMageView对象存放图片),但是图片 发现有的小 (27,27),我们需要放大

      CIImage *outImage = [filter outputImage];
      

      (1).不处理的情况下生成的二维码(其实生成的二维码是小的,目前是被放大了)

      imageView.image = [UIImage imageWithCIImage:outImage];//不处理图片模糊,故而调用下面的信息

    二维码不清晰

    (2).处理过的图片(需要调用一个方法来处理图片)

    imageView.image = [self createNonInterpolatedUIImageFormCIImage:outImage withSize:300];
    
    /**
     *  根据CIImage生成指定大小的UIImage
     *
     *  @param image CIImage
     *  @param size  图片宽度以及高度
     */
    - (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
    {
      CGRect extent = CGRectIntegral(image.extent);
      CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
    
      //1.创建bitmap;
      size_t width = CGRectGetWidth(extent) * scale;
      size_t height = CGRectGetHeight(extent) * scale;
      CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
      CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
      CIContext *context = [CIContext contextWithOptions:nil];
      CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
      CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
      CGContextScaleCTM(bitmapRef, scale, scale);
      CGContextDrawImage(bitmapRef, extent, bitmapImage);
    
      //2.保存bitmap到图片
      CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
      CGContextRelease(bitmapRef);
      CGImageRelease(bitmapImage);
      return [UIImage imageWithCGImage:scaledImage];
    }
    

    生成的二维码

    处理过的二维码

    iOS生成二维码code 密码: bt8f
    iOS二维码生成方法封装过的code 密码: 3vqj

    重点:在此我进行了对二维码的改善:效果如下

    带logo的二维码

    你需要做的是:(已经封装好了)

     1.导入:SDWebImage 框架
     2.拖入我封装好的类 ,导入 #import "LogoQR.h"
     3.创建UIImageView的对象来放二维码
     4.调用方法
      /**
     *  [LogoQR new] 调用方法的对象
     *  QRurl :头像的链接
     *  messages: 二维码里面存放的信息
     */
    UIImageView的对象.image = [[LogoQR new] QRurl:urlString
                                 messages:self.messages];
    

    带logo的二维码 密码: q6s6

    三.二维码的扫描

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

    (1).读取二维码需要导入AVFoundation框架
    (2).利用摄像头读取信息,并且输入

     <1>.获取捕捉会话(AVFoundation框架)
     <2>.设置输入摄像头
     <3>.设置输出数据
     <4>.添加预览图层
     <5>.开始扫描二维码
    
    • 1.导入框架 #import <AVFoundation/AVFoundation.h>

    • 2.获取捕捉会话

      AVCaptureSession *session = [[AVCaptureSession alloc]init];
      self.session = session;
      
    • 3.设置输入(摄像头)

      //AVMediaTypeVideo:摄像头, AVMediaTypeAudio:话筒, AVMediaTypeMuxed:弹幕
      AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
      if (error) {
        //防止模拟器崩溃
        NSLog(@"没有摄像头设备");
        return;
      }
      AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
      [session addInput:input];
      
    • 4.设置输出(数据) 挂代理

      <AVCaptureMetadataOutputObjectsDelegate> 挂代理 
      
      AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc]init];
      [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
      [session addOutput:output];
      //设置输出类型,必须在output 加入到会话之后来设置
      [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
      
    • 5.添加预览层

      AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
      layer.frame = self.view.bounds;
      [self.view.layer addSublayer:layer];
      self.layer = layer;
      
    • 6.开始扫描

      [session startRunning];
      
    • 7.调用扫面结果的代理方法

    -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
      if (metadataObjects.count>0)
       {
          //1.获取到扫描的内容
          AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
        
          NSLog(@"扫描的内容==%@",object.stringValue);
        
          //2.停止会话
          [self.session stopRunning];
        
          //3.移除预览图层
          [self.layer removeFromSuperlayer];
        }
    }
    

    比较好的二维码扫描
    也挺详细的;
    说明:扫描的内容是什么是可以打印出来的,如果是链接,你可以用WebView来加载的

    相关文章

      网友评论

      • ChooseYourself:请问微信那种样式不同的二维码怎么生成
        ChooseYourself:@JoanKing 然而我没找到,找到的都是只是换个颜色的,。。。
        IIronMan:@ChooseYourself 这种demo很多的

      本文标题:iOS二维码的生成和扫码详细介绍(手把手教)

      本文链接:https://www.haomeiwen.com/subject/hzbputtx.html