Swift:使用系统AVFoundation实现二维码扫描和生成
来源:互联网 发布:圣约瑟夫大学 知乎 编辑:程序博客网 时间:2024/05/28 18:45
系统提供的AVCaptureSession只适用于iOS7.0以上的系统;之前的请用Zbar来替代
下载地址:http://download.csdn.net/detail/huobanbengkui/8881097
配置工程:
引入:
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实现二维码扫描和生成
- Swift AVFoundation 二维码扫描和生成
- IOS下使用AVFoundation实现条形码和二维码扫描
- 使用AVFoundation扫描二维码
- iOS使用AVFoundation实现二维码扫描
- 使用AVFoundation完成二维码扫描
- iOS二维码生成与扫描(zbar和原生AVFoundation)
- 使用系统提供的AVFoundation 实现二维码扫描(带动画)
- iOS 开发AVFoundation系统原生二维码扫描实现
- iOS使用zbar以及AVFoundation实现二维码扫描
- swift版二维码扫描和生成
- swift生成二维码,扫描二维码
- iOS 使用AVFoundation 扫描二维码并限定扫描区域(带代码生成蒙版)
- 用AVFoundation实现扫描二维码功能
- iOS 利用 AVFoundation 实现二维码/条形码扫描
- 采用系统API实现的二维码扫描、识别和生成
- IOS 使用AVFoundation 扫描条形码、二维码等
- 使用ZXing扫描二维码和生成二维码
- 文章标题
- 安装R语言的包的方法
- CSS(Cascading Style Sheets)层叠样式表
- 复习整理1
- Android 中如何使用CountDownTimer进行倒计时
- Swift:使用系统AVFoundation实现二维码扫描和生成
- 自定义Cell注册两种方式
- centos6.5常用命令
- C++的XML编程经验――LIBXML2库使用指南
- 同时判断CPU是大端还是小端完全实现
- <c:when> <c:forEach> 标签
- 面向对象编程的特征以及常用的修饰符
- TCP/IP基础
- Landsat 8(一)