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。大家能够尝试改动。

时间: 2024-10-29 01:24:22

Swift:使用系统AVFoundation实现二维码扫描和生成的相关文章

Swift AVFoundation 二维码扫描和生成

项目最终不须要支持iOS6了(泪崩),在二维码扫描这一块,可以全然的放弃ZXing库,改用系统的AVFoundation了,拿swift写了个Demo,效果例如以下: github地址:点这里 有关AVFoundation和Core Image(滤镜等),可以先看看objc.io第21期和第23期的有关介绍. 初始化视频捕捉 // 初始化视频捕获 private func initCapture() { // 代表抽象的硬件设备,这里传入video let captureDevice = AVC

【转】 iOS使用AVFoundation实现二维码扫描

原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应介绍也非常多,如:http://rdcworld-iphone.blogspot.in/2013/03/how-to-use-barcode-scanner-br-and-qr-in.html ZXing google推出的开源项目,相应介绍如:http://blog.devtang.com/blo

iOS使用AVFoundation实现二维码扫描(ios7以上)——转载

关于二维码扫描有不少优秀第三方库: ZBar SDK 里面有详细的文档,相应介绍也非常多,如:http://rdcworld-iphone.blogspot.in/2013/03/how-to-use-barcode-scanner-br-and-qr-in.html ZXing google推出的开源项目,相应介绍如:http://blog.devtang.com/blog/2012/12/23/use-zxing-library/ 关于AVFoundation AVFoundation 是一

iOS使用AVFoundation实现二维码扫描

实现过程如下: Step1:需要导入:AVFoundation Framework 包含头文件: #import <AVFoundation/AVFoundation.h> Step2:设置捕获会话 设置 AVCaptureSession 和 AVCaptureVideoPreviewLayer 成员 1 2 3 4 5 6 7 8 9 10 #import <AVFoundation/AVFoundation.h> static const char *kScanQRCodeQu

使用AVFoundation完成二维码扫描

其中有几点需要注意的 1.应该使用异步线程来配置那几个属性,这样可以防止阻塞主线程加载UI. 2.output的rectOfInterst是感应区域,就是说,在这个区域内才有扫描效果.但是由于摄像头的关系,这个rect的x和y是反着的,width和height也是反着的,就是说,这里的x坐标对应着正常情况下的y坐标,这里的宽度对应着正常情况下的高度. 3.sessionPreset属性是用来设置扫描精度的. 4.metaObjectTypes属性可以设置扫描的类型,有二维码和一维码(条形码).

android 二维码 扫描与生成(内置)

本文使用 zxing-android-embedded 这个开源项目实现 二维码扫描/生成 功能: 开发工具:android studio 1.如何将zxing-android-embedded添加到我们的项目中 1.1  添加arr依赖包 将以下代码添加到build.gradle文件中. repositories {     mavenCentral()     maven {         url "https://dl.bintray.com/journeyapps/maven"

二维码扫描与生成

为了方便下载挂一个百度盘链接,包含: 1.ZBarSDK .a文件(armv7 arm64和armv7 arm64 i386两种,如有其他需求请自行生成) 2.ZBarSDK 3.libqrencode 4.ZBar相机扫描 相册扫描 iOS原生相机扫描 和 libqrencode生成二维码示例程序 (一)二维码扫描之ZBarSDK的使用 1.1 生成.a文件 (1)打开ZBar-master/iphone/zbar.xcodeproj (2)更改Architectures (3)如果弹出警告,

Android实战简易教程-第三十五枪(将二维码扫描和生成Demo引入项目实例)

网上有很多关于二维码扫码和二维码生成的Demo,你可能不想透彻的了解它是如何实现的,但是你必须要知道如何引入到你的项目之中,我们研究一下如何将这些Demo引入到自己的项目之中. 我也写了一个Demo,看一下它的目录结构. 这些打红色箭头的部分都是必须要复制到你的项目之中的.引入到你的项目之后会有一些报错,你可以根据错误提示进行修改. strings里面有一个字段要加入到你的项目之中 colors.xml中有一些你也要复制过去,还好他们都会报错提醒你. 下面我们看一下Demo的代码: 1.Main

iOS 简单易用的二维码扫描及生成二维码三方控件LFQRCode,可灵活自定义UI

扫描的控件是一个view,使用者只需贴在自己的控制器内即可.其他UI用户可在自己控制器随便添加.代码如下 - (void)viewDidLoad { [super viewDidLoad]; //扫描有效区(即框内透明区域) CGRect interestRect = CGRectMake(20, (self.view.frame.size.height - (self.view.frame.size.width - 40))/2.0f, self.view.frame.size.width -