Swift:使用系统AVFoundation实现二维码扫描和生成
系统提供的AVCaptureSession仅仅适用于iOS7.0以上的系统。之前的请用Zbar来替代
下载地址:http://download.csdn.net/detail/huobanbengkui/8881097
配置project:
引入:
import Foundation
import AVFoundation
接受AVCaptureMetadataOutputObjectsDelegate(如: class QrcodeVC: UIViewController,AVCaptureMetadataOutputObjectsDelegate, UIAlertViewDelegate)
定义属性:
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let session = AVCaptureSession()
var layer: AVCaptureVideoPreviewLayer?
一. 二维码扫描
1.使用相机捕捉二维码
func setupCamera(){
self.session.sessionPreset = AVCaptureSessionPresetHigh
var error : NSError?
let input = AVCaptureDeviceInput(device: device, error: &error)
if (error != nil && input == nil) {
var errorAlert = UIAlertView(title: "提醒", message: "请在iPhone的\"设置-隐私-相机\"选项中,同意本程序訪问您的相机", delegate: self, cancelButtonTitle: "确定")
errorAlert.show()
return
}
if session.canAddInput(input) {
session.addInput(input)
}
layer = AVCaptureVideoPreviewLayer(session: session)
layer!.videoGravity = AVLayerVideoGravityResizeAspectFill
//能够看到的镜头区域
layer!.frame = CGRectMake(0, 0,320,568)
self.view.layer.insertSublayer(self.layer, atIndex: 0)
let output = AVCaptureMetadataOutput()
//设置响应区域
// output.rectOfInterest = CGRectMake(0, 0, 0, 0)
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
if session.canAddOutput(output) {
session.addOutput(output)
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode];
}
session.startRunning()
}
2.识别二维码以后,解析数据(实现AVCaptureMetadataOutputObjectsDelegate的代理方法)
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
var stringValue:String?
if metadataObjects.count > 0 {
var metadataObject = metadataObjects[0] as!AVMetadataMachineReadableCodeObject
stringValue = metadataObject.stringValue
if stringValue != nil{
self.session.stopRunning()
}
}
self.session.stopRunning()
var alertView = UIAlertView(title: "二维码", message: stringValue, delegate: self, cancelButtonTitle: "确定")
alertView.show()
}
最后在页面消失的时候:
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
if self.session.running {
self.session.stopRunning()
}
}
二. 二维码生成
func createQRForString(qrString: String?, qrImageName: String?) -> UIImage?{
if let sureQRString = qrString {
let stringData = sureQRString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
// 创建一个二维码的滤镜
let qrFilter = CIFilter(name: "CIQRCodeGenerator")
qrFilter.setValue(stringData, forKey: "inputMessage")
qrFilter.setValue("H", forKey: "inputCorrectionLevel")
let qrCIImage = qrFilter.outputImage
// 创建一个颜色滤镜,黑白色
let colorFilter = CIFilter(name: "CIFalseColor")
colorFilter.setDefaults()
colorFilter.setValue(qrCIImage, forKey: "inputImage")
colorFilter.setValue(CIColor(red: 0, green: 0, blue: 0), forKey: "inputColor0")
colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1")
// 返回二维码image
let codeImage = UIImage(CIImage: colorFilter.outputImage.imageByApplyingTransform(CGAffineTransformMakeScale(5, 5)))
// 通常,二维码都是定制的,中间都会放想要表达意思的图片
if let iconImage = UIImage(named: qrImageName!) {
let rect = CGRectMake(0, 0, codeImage!.size.width, codeImage!.size.height)
UIGraphicsBeginImageContext(rect.size)
codeImage!.drawInRect(rect)
let avatarSize = CGSizeMake(rect.size.width * 0.25, rect.size.height * 0.25)
let x = (rect.width - avatarSize.width) * 0.5
let y = (rect.height - avatarSize.height) * 0.5
iconImage.drawInRect(CGRectMake(x, y, avatarSize.width, avatarSize.height))
let resultImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resultImage
}
return codeImage
}
return nil
}
怎样使用呢??
var imageViewIcon = UIImageView(frame: CGRectMake(100, 100, 150, 150))
imageViewIcon.image = createQRForString("好好", qrImageName: "ocrBack") //“ocrBack” 放入二维码中间图片的名字
self.view.addSubview(imageViewIcon)
如图:
最后说明:
AVFoundation框架不仅支持二维码扫描。还支持非常多别的条码类别。比如Code39,Code128,Aztec,和PDF417。大家能够尝试改动。
Swift:使用系统AVFoundation实现二维码扫描和生成的更多相关文章
- Android二维码扫描、生成
Android二维码扫描.生成 现在使用二维码作为信息的载体已经越来越普及,那么二维码的生成以及扫描是如何实现的呢 google为我们提供了zxing开源库供我们使用 zxing GitHub源码地址 ...
- iOS 原生二维码扫描和生成
代码地址如下:http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描工 ...
- iOS开发技术 - 二维码扫描、生成
QRecLevel:QR_ECLEVEL_H // 二维码容错率,最高为30%(即QR_ECLEVEL_H),即LOGO有大 ...
- Swift AVFoundation 二维码扫描和生成
项目最终不须要支持iOS6了(泪崩),在二维码扫描这一块,可以全然的放弃ZXing库,改用系统的AVFoundation了,拿swift写了个Demo,效果例如以下: github地址:点这里 有关A ...
- iOS使用AVFoundation实现二维码扫描(ios7以上)——转载
关于二维码扫描有不少优秀第三方库: ZBar SDK 里面有详细的文档,相应介绍也非常多,如:http://rdcworld-iphone.blogspot.in/2013/03/how-to-use ...
- iOS使用AVFoundation实现二维码扫描
原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...
- 【转】 iOS使用AVFoundation实现二维码扫描
原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...
- iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)
Create QRScanner.swift file // // QRScanner.swift // NativeQR // // Created by Harvey on 2017/10/24. ...
- iOS 简单易用的二维码扫描及生成二维码三方控件LFQRCode,可灵活自定义UI
一.扫码 扫描的控件是一个view,使用者只需贴在自己的控制器内即可.其他UI用户可在自己控制器随便添加.代码如下 - (void)viewDidLoad { [super viewDidLoad]; ...
随机推荐
- xhprof failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
wget http://www.graphviz.org/pub/graphviz/ARCHIVE/graphviz-2.28.0.tar.gz tar xzvf graphviz-2.28.0.ta ...
- 页面打开直接执行a点击事件
<script> window.onload = function(){ function autoclick(){ var url = document.getElementById(' ...
- python基础学习笔记5--对象方法、属性和迭代器
对象方法.属性和迭代器 1.构造方法 1)构造方法和一般方法的不同点:当一个对象被创建后,会立即调用构造方法. 2)在Python中创建一个构造方法很容易,只要把init方法的名字从简单的init修改 ...
- 高效率JavaScript编写技巧
最近在编写一个JavaScript框架,发现有很多细节注意得不够,担心长时间积累会导致框架实际应用的时候出现严重的效率问题.于是开始关注JavaScript提高效率的一些技巧,在这里分享给大家. 1. ...
- ZOJ 2562 More Divisors(高合成数)
ZOJ 2562 More Divisors(高合成数) ACM 题目地址:ZOJ 2562 More Divisors 题意: 求小于n的最大的高合成数,高合成数指一类整数,不论什么比它小的自然数 ...
- iOS开发宝典:String用法大全
一.NSString 创建字符串. NSString *astring = @"This is a String!"; 创建空字符串,给予赋值. NSString *astri ...
- iframe的一些简单记录
//获取当前所在IFrame的id var frameId = window.frameElement && window.frameElement.id || ''; //Jquer ...
- C#复习一( Twenty Days)
今天开始将要复习最近所学的一些C#知识.下面就来总结一下今天所复习的内容,以此来巩固我对C#知识的掌握.今天主要以举几个程序为例. 首先还是要注意代码的规范: –注释//,/**/,/// –骆驼 ...
- SSIS DB目录设置 (Integration Services Catalogs)
1.创建SSISDB目录 这里没什么好说的,点击Enable CLR Integration ,然后设置一个加密密码 2. SSIS Catalog设置 Retention Period (days) ...
- Oracle中的Spool缓冲池技术可以实现Oracle导出txt格式文件
利用Oracle中的Spool缓冲池技术可以实现Oracle数据导出到文本文件 1.在Oracle PL/SQL中输入缓冲开始命令,并指定输出的文件名: spool d:output.txt; 2.设 ...