二维码
-
二维码的生成和读取
-生成二维码:就是讲给定的信息,将其按照二维码的编码方式生成一张图片
-读取二维码:识别二维码图像里面存储的数据 -
二维码的生成方式
-从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
属性来限制扫描的区域,但是需要注意这里的坐标原点
- 可以通过设置元数据输出处理对象的
网友评论