ios-深度解析二维码的生成与使用

利用一个小demo来对二维码进行学习,总共四个界面(主界面,生成二维码界面,识别二维码界面,扫描二维码界面)

一.二维码的介绍

1.什么是二维码?

二维条码/二维码是用某种特定的几何图形按一定规律在平面分布的黑白相间的图形记录数据符号信息的

总结: 用图形记录标记一些信息,方便通过图形识别来获取信息

2 应用场景

信息获取(名片、地图、WIFI密码、资料)

手机电商(用户扫码、手机直接购物下单)

手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端通道完成支付)

微信添加好友

二.二维码界面的搭建

1.总共四个界面,可以采用storyBoard来搭建

2.四个storyBoard放在一个界面,看起来不美观,还很容易搞混,有没有优化方案?

可以把四个storyBoard分别开来,单独放到一个界面里面

3.怎么把storyBoard单独放在一个界面,而且还让这些界面有联系(连线)?

可以用storyBoard reference 来解决  就是用一个引用来代替storyBoard,保持storyBoard间的联系(连线)

4.最终效果

三.二维码的生成

1.生成二维码的步骤

1.1 创建滤镜 CIFilter

滤镜属于CoreImage框架,要导入该框架   该框架将常用来处理图片(生成毛玻璃效果/二维码)

1.2 给滤镜设置内容(用kvc方式赋值)

内容必须为NSData类型

1.3 获取生成的二维码图片

获取的图片是CIImage类型的,使用的话要进行转换

2.运行程序发现生成的二维码图片很模糊,为什么?

生成为二维码图片大小为 27 * 27 被拉伸的太大,所以不清晰

3.怎么显示清晰的二维码?

苹果提供一个api(CIImage的方法)对图片放大,还不影响清晰度

1  // 1.创建Transform    orginalImage的数据类型为CIImage
2  let scale = imageView.bounds.width / orginalImage.extent.width
3  let transform = CGAffineTransformMakeScale(scale, scale)
4  // 2.放大图片
5  let hdImage = orginalImage.imageByApplyingTransform(transform)

4.设置前景图片

4.1 为什么要设置前景图片?

一般二维码中心都有一张小的图片,就是前景图片

生成二维码没有前景图片,需要手动添加前景图片

4.2 怎么添加前景图片?

就是把两张图片合成为一张图片,用绘图就可以轻松搞定

4.3 绘图的步骤

4.31 开启图形上下文

4.32 将二维码图片画到图形上下文(二维码的size = 图形上下文的size)

4.33 将前景图片画到图形上下文(前景图片的center = 图形上下文的center)

4.34 从图形上下文获取新的图片

4.35 关闭图形上下文

四.二维码的识别

1.获取相册中的二维码

1.1 怎么获取相册?

1.11 创建照片选择控制器

1.12 设置照片的来源类型

1.13 设置代理

1.14 弹出控制器

         // 1.创建照片选择控制器
        let ipc = UIImagePickerController()
        // 2.设置来源的类型
        ipc.sourceType = .PhotoLibrary
        // 3.设置代理
        ipc.delegate = self
        // 4.弹出控制器
        presentViewController(ipc, animated: true, completion: nil)

          在代理方法中实现    选中图片dismiss掉控制器
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
          //选中照片
        imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage

        picker.dismissViewControllerAnimated(true, completion: nil)
    }

2.识别二维码的步骤

2.1 创建 CIDetector对象(识别器)

2.2 获取图片,并将图片转成 CIIImage

2.3 识别图片中的二维码(得到一个数组,图片中可能有多个二维码)

2.4 遍历数组

       // 1.创建识别器
        let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: nil)

        // 2.获取图片,并且将图片转成CIIImage
        let image = imageView.image!
        guard let ciImage = CIImage(image: image) else {
            return
        }
        // 3.识别图片中二维码
        let features = detector.featuresInImage(ciImage)

        // 4.遍历数组中所有的元素
        for f in features {
          // feature类型是CIFeature  要转换成二维码类型 CIQRCodeFeature
            guard let qrCodeF = f as? CIQRCodeFeature else {
                continue
            }
            //打印二维码的信息
            print(qrCodeF.messageString)
        }

五.扫描二维码(需要真机操作)

1.扫描二维码界面搭建

1.1 主要就是扫描框的搭建

扫描框中再加上一个ImageView,给ImageView一个动画   模拟正在扫描(冲击波)

1.2 扫描框是一张图片,冲击波也是一张图片,他们的位置和尺寸是一样的

为了方便以后更改控件的位置,可以用一个view把扫描框和冲击波封装在里面

1.3 扫描动画(冲击波)动画怎么做?

1.31 设置冲击波的底部约束相对于父控件(view)有一个间距

1.32 更改约束的间距,来达到动画的效果

        // 1.改变约束(原来约束为-240)
        scanViewBottomCons.constant = 240
        // 2.执行动画
        UIView.animateWithDuration(1.0) {
            UIView.setAnimationRepeatCount(MAXFLOAT)
            self.qrCodeView.layoutIfNeeded()
        }

2.扫描二维码

2.1 扫描步骤

2.11 创建捕捉会话(需要导入AVFoundation框架)

2.12 设置输入(摄像头)

2.13 设置输出 Metadata

2.14 添加预览图层(可以没有)

预览图层是为了让用户知道扫描到哪里了,一般为了用户体验,都会添加

2.15 开始扫描

源代码:建议不要死记,用的时候直接拷贝

         // 1.创建捕捉会话
        let session = AVCaptureSession()

        // 2.设置输入(摄像头)
        let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
        guard let input = try? AVCaptureDeviceInput(device: device) else {
            return
        }
        session.addInput(input)

        // 3.设置输出(Metadata)
        let output = AVCaptureMetadataOutput()
        // 设置代理
        output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
        session.addOutput(output)
        // 设置output的输出的类型(该类型的设置必须在添加到session之后)
        output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]

        // 4.添加预览图层(可以没有)
        let previewLayer = AVCaptureVideoPreviewLayer(session: session)
        previewLayer.frame = view.bounds
        view.layer.insertSublayer(previewLayer, atIndex: 0)

        // 5.开始扫描
        session.startRunning()

3.获取扫描结果

3.1设置代理,在代理方法中拿到结果

代理方法

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
  guard let objc = metadataObjects.last as? AVMetadataMachineReadableCodeObject else {
    return
  }
    print(objc.stringValue)
 }

5.设置扫描区域.

5.1 为什么要设置扫描区域?

扫描二维码,发现只要二维码进入摄像头区域,就能直接扫描

要求是进入扫描框,才进行扫描

5.2 怎么设置扫描区域?

通过设置 output.rectOfInterest属性来设置扫描区域

     // 设置扫描的区域
        let screenW = UIScreen.mainScreen().bounds.width
        let screenH = UIScreen.mainScreen().bounds.height
        let x : CGFloat = qrCodeView.frame.origin.x / screenW
        let y : CGFloat = qrCodeView.frame.origin.y / screenH
        let w : CGFloat = qrCodeView.frame.width / screenW
        let h : CGFloat = qrCodeView.frame.height / screenH
        output.rectOfInterest = CGRect(x: y, y: x, width: h, height: w)

注意:扫描区域的坐标系与屏幕的坐标系正好相反  ( 扫描区域x = 屏幕坐标系 y)

5.3 设置扫描区域代码写到哪里?

扫描区域属于 输出的一个属性,应该写到创建输出代码的后边

时间: 2024-12-17 20:20:43

ios-深度解析二维码的生成与使用的相关文章

Android zxing 解析二维码,生成二维码极简demo

zxing 官方的代码很多,看起来很费劲,此demo只抽取了有用的部分,实现了相机预览解码,解析本地二维码,生成二维码三个功能. 简化后的结构如下: 废话少说直接上代码: BaseDecodeHandler: package com.song.zxing.decode; import android.graphics.Bitmap; import android.os.Bundle; import com.google.zxing.BarcodeFormat; import com.google

iOS中 扫描二维码/生成二维码详解 韩俊强的博客

最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[SecondViewController new]]; 每日更新关注:http://weibo.com/hanjunqi

iOS二维码的生成与扫描

由于近期工作中遇到了个需求:需要将一些固定的字段 在多个移动端进行相互传输,所以就想到了 二维码 这个神奇的东东! 现在的大街上.连个摊煎饼的大妈 都有自己的二维码来让大家进行扫码支付.可见现在的二维码使用率多高, 不光如此,在很多的社交类的APP 基本都有扫一扫加好友这个功能吧,因此决定学一学这个神奇的东西. 查找了一些资料博客啊发现,iOS7之前 对于开发人员来说 熟悉的第三方QRCode库有: ZXingGoogle出品并开源 一直到现在都还有专人维护 是世界上使用最广的二维码库 iOS上

java二维码的生成与解析代码

二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍. 2.  编码范围广 该条码可以把图片.声音.文字.签字.指纹等可以数字化的信息进行编码,用条码表示出来:可以表示多种语言文字:可表示图像数据. 3.  容错能力强,具有纠错功能 这使得二维条码因穿孔.污损等引起局部损坏时,照样可以正确

Java使用QRCode.jar生成与解析二维码

正题:Java使用QRCode.jar生成与解析二维码demo 欢迎新手共勉,大神监督指正 # 不知道QRCode的请移步wiki,自行了解,这里不多做解释 *******创建二维码之前的工作******** 去下面给出的地址下载QRCode.jar包,此jar包已经包括 生成与解析 . 官网下载到的jar包是没有解析的 https://files.cnblogs.com/files/bigroc/QRCode.zip ***创建好你的测试类导好jar包开始吧*** 第一部分:生成二维码 pac

使用zxing生成和解析二维码

二维码: 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的: 在代码编制上巧妙的利用构成计算机内部逻辑基础的0和1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理: 二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息: 二维码相对于条形码的优势就是省空间: zxing简介: zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库

Java使用Zxing生成、解析二维码工具类

Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2).二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的; package com.qlwb.business.util; //导入省略... /** * 二维码工具类 * */ public class MatrixToLogoImageWriter { priva

APS.NET MVC4生成解析二维码简单Demo

一.视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <script src="~/Scripts/jquery-1.8.2.min.js"></scri

iOS端使用二维码扫描(ZBarSDK)和生成(libqrencode)功能

如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.手机中二维码使用也很广泛,如微信等.正好最近收集总结了下二维码的使用方法 下面介绍一下如何在iOS设备上使用二维码 首先在github上下载ZBar SDK地址https://github.com/bmorton/ZBarSDK 然后将如下的相关类库添加进去 AVFoundation.framwork, CoreMedia.framework, CoreVideo.framework, libiconv.dylib 和libzb