二维码

作者: 亡灵诅咒 | 来源:发表于2016-05-24 11:20 被阅读102次

    二维码

    • 二维码的生成和读取
      -生成二维码:就是讲给定的信息,将其按照二维码的编码方式生成一张图片
      -读取二维码:识别二维码图像里面存储的数据

    • 二维码的生成方式
      -从iOS7开始继承了二维码的生成和读取功能
      -15年2月起苹果不允许不支持64位处理器的APP上架,此前广泛使用的zbarsdk目前是不支持64位处理器的

    • 二维码的生成

    • 导入CoreImage框架,一些图片处理操作的功能都可以通过这个框架实现,比如滤镜效果,毛玻璃,美颜相机...

    • 通过滤镜CIFilter生成二维码

      • 1.实例化二维码滤镜
      • 2.设置滤镜的默认属性
      • 3.通过KVC来设置滤镜的inputMessage
      • 4.从滤镜中获取图片 图片的类型是CIImage类型,所以需要转换类型
      • 5.设置图片
          //1.创建二维码滤镜
          let filter = CIFilter(name: "CIQRCodeGenerator")
          //1.1设置默认属性
          filter?.setDefaults()
          //2.通过KVC设置滤镜的inputMessage
          //2.1将输入的内容转换成二进制数据
          let data = self.textfield.text?.dataUsingEncoding(NSUTF8StringEncoding)
          filter?.setValue(data, forKey: "inputMessage")
          //3.从滤镜中获取图片
          var outImage = filter?.outputImage
          //4.转换图片的大小
          let transform = CGAffineTransformMakeScale(20, 20)
          outImage = outImage?.imageByApplyingTransform(transform)
          //3.1转化图片的类型
          let image = UIImage(CIImage: outImage!)
          imageView.image = image
      

    -自定义二维码
    - 自定义二维码,就是给二维码添加一些图片,或者改变颜色
    - 可以给二维码添加图片,是因为二维码具备一定的纠错率,如果二维码被部分遮挡,可以更具其他部分计算出被遮挡的部分内容,但是需要确保三个角不能被遮挡,这三个角是用来定位的
    - 可以通过KVC来设置滤镜的纠错率inputCorrectionLevel
    - L水平 7%的字码可被修改
    - M水平 %15的字码可被修改
    - Q水平 %25的字码可被修改
    - H水平 %30的字码可被修改
    - 自定义二维码的原理,将生成的二维码图片和自定义的图片重绘,合成一张图片,不过需要注意二维码的容错率
    func addImage(image: UIImage,centerImage: UIImage) ->UIImage{ let rect = CGRectMake(0, 0, image.size.width, image.size.height) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) image.drawInRect(rect) let w :CGFloat = 100 let h :CGFloat = 100 let x :CGFloat = (rect.size.width - w) * 0.5 let y :CGFloat = (rect.size.height - h) * 0.5 let center = CGRectMake(x, y, w, h) centerImage.drawInRect(center) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }

    • 二维码的识别

    • 1.识别图片二维码

      • 1.创建探测器
      • 2.获取探测器识别的图像特征
      • 3.遍历图片特征,获取数据
          //识别二维码图片
      func deleterQr(){
          let context = CIContext()
          //1.创建探测器
          let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: context, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])
          //获取需要识别的图片
          guard let imagec = CIImage(image: imageView.image!) else{return}
          //从图片中获取数据
          let fratures = detector.featuresInImage(imagec)
          for frature in fratures{
              if frature.isKindOfClass(CIQRCodeFeature){
                  let temp = frature as! CIQRCodeFeature
                  print(temp.messageString)
              }
          }
      }
      
    • 二维码扫描功能

      • 1.实例化拍摄设备
      • 2.设置输入设备
      • 3.设置元数据输出处理对象
      • 4.添加拍摄会话
      • 5.视屏预览图层
      • 6.启动会话
      • 7.监听元数据处理后的结果
         //创建拍摄设备
          let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
          //创建输入设置
          var input :AVCaptureInput
          do{
              input = try AVCaptureDeviceInput(device: device)
          }catch{
              return
          }
          //创建元数据输出对象
          let output = AVCaptureMetadataOutput()
          //设置代理,从代理方法中获取数据
          output.setMetadataObjectsDelegate(self, queue:  dispatch_get_main_queue())
          //创建拍摄会话对象
          let session = AVCaptureSession()
          //添加会话输入和输出
          if session.canAddOutput(output) && session.canAddInput(input){
              session.addInput(input)
              session.addOutput(output)
          }
          //设置输出数据类型,需要将元输出输出添加到会话后,才能指定元数据类型,否则会报错
          output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
          //开启会话
          session.startRunning()
          //设置预览图层
          let layer = AVCaptureVideoPreviewLayer(session: session)
          layer.frame = view.bounds
          view.layer.insertSublayer(layer, atIndex: 0)
      
    • 二维码的扫描边框处理

      • 在代理方法中获取当了二维码后,就可以获取二维码的四个角,但是这里需要转换坐标,将坐标转换成为预览图层上的坐标.获取到4点可以通过形状图层来将边框绘制,但是需要注意的是,要将之前的渲染好的图层移除
              let shapLayer = CAShapeLayer()
          shapLayer.fillColor = UIColor.clearColor().CGColor
          shapLayer.strokeColor = UIColor.redColor().CGColor
          shapLayer.lineWidth = 6
          let path = UIBezierPath()
          //获取坐标,画出边框
          var count = 0
          for corner in qrCodeObj.corners{
              var point = CGPointZero
              CGPointMakeWithDictionaryRepresentation(corner as! CFDictionary, &point)
              if count == 0{
                  path.moveToPoint(point)
              }else{
                  path.addLineToPoint(point)
              }
              count += 1
          }
          path.closePath()
          shapLayer.path = path.CGPath
          self.layer?.addSublayer(shapLayer)
      }
      
    • 设置输出的兴趣区域,限制扫描区域

      • 可以通过设置元数据输出处理对象的rectOfInterest属性来限制扫描的区域,但是需要注意这里的坐标原点

    相关文章

      网友评论

          本文标题:二维码

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