二维码

作者: 亡灵诅咒 | 来源:发表于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