系统提供的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实现二维码扫描和生成的更多相关文章

  1. Android二维码扫描、生成

    Android二维码扫描.生成 现在使用二维码作为信息的载体已经越来越普及,那么二维码的生成以及扫描是如何实现的呢 google为我们提供了zxing开源库供我们使用 zxing GitHub源码地址 ...

  2. iOS 原生二维码扫描和生成

    代码地址如下:http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描工 ...

  3. iOS开发技术 - 二维码扫描、生成

    QRecLevel:QR_ECLEVEL_H // 二维码容错率,最高为30%(即QR_ECLEVEL_H),即LOGO有大                                       ...

  4. Swift AVFoundation 二维码扫描和生成

    项目最终不须要支持iOS6了(泪崩),在二维码扫描这一块,可以全然的放弃ZXing库,改用系统的AVFoundation了,拿swift写了个Demo,效果例如以下: github地址:点这里 有关A ...

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

    关于二维码扫描有不少优秀第三方库: ZBar SDK 里面有详细的文档,相应介绍也非常多,如:http://rdcworld-iphone.blogspot.in/2013/03/how-to-use ...

  6. iOS使用AVFoundation实现二维码扫描

    原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...

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

    原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...

  8. iOS 原生库(AVFoundation)实现二维码扫描,封装的工具类,不依赖第三方库,可高度自定义扫描动画及界面(Swift 4.0)

    Create QRScanner.swift file // // QRScanner.swift // NativeQR // // Created by Harvey on 2017/10/24. ...

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

    一.扫码 扫描的控件是一个view,使用者只需贴在自己的控制器内即可.其他UI用户可在自己控制器随便添加.代码如下 - (void)viewDidLoad { [super viewDidLoad]; ...

随机推荐

  1. BZOJ 1559: [JSOI2009]密码( AC自动机 + 状压dp )

    建AC自动机后, dp(x, y, s)表示当前长度为x, 在结点y, 包括的串的状态为s的方案数, 转移就在自动机上走就行了. 对于输出方案, 必定是由给出的串组成(因为<=42), 所以直接 ...

  2. 为什么IIS中找不到.net framework 4.5(转)

    .net 4.5是4.0的update,所以直接用4.0部署就可以了 .NET 4.5 is an in-place replacement for .NET 4.0, When .NET 4.5 i ...

  3. adb wifi连接手机

    1. 默认情况下,ADB是通过USB来进行连接的. 不需要USB线,直接在android设备上安装一个超级终端,在终端里运行以下代码即可: su setprop service.adb.tcp.por ...

  4. Java的基本语法

    Java基本语法格式 Java基本语法格式 Java中的所有程序代码都必须存在于一个类中,用class关键字定义类,在class前面可以有一些修饰符. 修饰符 class 类名{ 程序代码} 注: ① ...

  5. PHP中include和require的区别

    include和require的区别,其实两者没有太大的区别,如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出. 根据测试,win32 ...

  6. 64bits Python2.7.5安装numpy包

    由于数值分析需要numpy计算包,我找了很多numpy-cp27的下载地址,下了最新版的.whl文件,但总是安装不成功,后来找到一个.exe文件 直接下载安装即可使用:下面是网址链接http://do ...

  7. Spring Boot MyBatis 连接数据库

    最近比较忙,没来得及抽时间把MyBatis的集成发出来,其实mybatis官网在2015年11月底就已经发布了对SpringBoot集成的Release版本,Github上有代码:https://gi ...

  8. HDU 5893 List wants to travel(树链剖分)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5893 [题目大意] 给出一棵树,每条边上都有一个边权,现在有两个操作,操作一要求将x到y路径上所有边 ...

  9. IOS学习之蓝牙4.0

    1建立中心角色 1 2 3 #import <CoreBluetooth/CoreBluetooth.h>  CBCentralManager *manager;  manager = [ ...

  10. 行内元素有哪些?块级元素有哪些?CSS的盒模型?转载

    块级元素:div p h1 h2 h3 h4 form ul行内元素: a b br i span input selectCss盒模型:内容,border ,margin,padding css中的 ...