IOS 开发笔记——二维码的生成和扫描

开发当中我们经常遇到二维码的生成或者说是扫描,但是苹果官方给我们准备好了这些 API,那么接下来作者为大家详细讲述一下二维码

在二维码的生成中,我们要用到一个类CIFilter,这是系统的一个滤镜类,可以用来做各种的滤镜,但是个人感觉比较卡,做滤镜的话还是建议大家用 GUPImage这个第三方框架的好,因为这个框架完全是涉及 CUP 的运行,效率非常快

以下这个例子是为百度网站生成一个二维码,同学们也可以自己换一个地址试试

 // 实例化二维码滤镜对象
let filter = CIFilter(name: "CIQRCodeGenerator")

// 恢复滤镜默认对象属性(因为可能滤镜会保存上一次的属性)
filter.setDefaults()

// 将字符串转换成NSdata
let data = "https://www.baidu.com".dataUsingEncoding(NSUTF8StringEncoding)

// 通过 KVO设置滤镜,传入 data,滤镜就会将传入的二进制数据 data 转换成生成二维码
filter.setValue(data, forKey: "inputMessage")

// 生成二维码图片,但是这个是 CIImage
let outputImage = filter.outputImage

// 将 CIIimage 转换成UIImage 并显示出来
self.imageView.image = UIImage(CIImage: outputImage)

二维码的扫描分以下好几步
1.导入AVFoundation框架
2.实例化拍摄设备
3.设置元数据输出
4.添加拍摄回话(相当于一个桥梁,把上面的输入和输出连接起来)
5.显示视觉预览图层
6.设置界面显示扫描结果

按照这个思路,我们开始创建代码

1.导入AVFoundation框架

import AVFoundation
var session:AVCaptureSession!
var previewLayer:AVCaptureVideoPreviewLayer!

2.实例化拍摄设备

// 1.实例化拍摄设备(告诉系统,你想用哪一种拍摄设备)
let device:AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

// 2.设置输入设备
 let input = AVCaptureDeviceInput.deviceInputWithDevice(device, error: nil) as! AVCaptureDeviceInput

3.设置元数据输出

// 3.1 实例化拍摄元数据输出
var output = AVCaptureMetadataOutput.new()
 // 3.2设置输出数据代理,当然控制器要遵循AVCaptureMetadataOutputObjectsDelegate这个代理来调用扫描完成后元数据输出的代理方法
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()!) // 这里设置主线程和子线程都没有关系

4.添加拍摄回话(相当于一个桥梁,把上面的输入和输出连接起来)

// 4.1 实例化拍摄会话
self.session = AVCaptureSession.new()
// 4.2 添加会话输入
self.session.addInput(input)
// 4.3 添加会话输出
self.session.addOutput(output)

// 4.4 设置输出数据的类型,将元数据输出添加会话后,才能指定元数据类型,否则会报错
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode] // 这里设置元数据输出类型为二维码

5.显示视觉预览图层

// 5.1 实例化预览图层,传递 session 是为了告诉图层将来要显示什么内容
self.previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(self.session) as! AVCaptureVideoPreviewLayer

// 设置图层的显示范围
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
self.previewLayer.frame = self.view.bounds

// 5.2 将图层插入当前视图
self.view.layer.insertSublayer(self.previewLayer, atIndex: 100)
 // 启动会话
self.session.startRunning()

6.设置界面显示扫描结果

// 当二维码扫描后就会调用这个代理方法
 func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
        // 1.扫描完成,停止会话
        self.session.stopRunning() // 如果不停止会话,系统会不断扫描,调用代理方法

        // 2.删除预览图层
        self.previewLayer.removeFromSuperlayer()

        // 3.设置界面显示扫描结果
        if metadataObjects.count > 0 {
            let obj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject // 二维码对象
            // 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!
            print(obj.stringValue)
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值