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

时间:2022-06-21 22:10:19

利用一个小demo来对二维码进行学习,总共四个界面(主界面,生成二维码界面,识别二维码界面,扫描二维码界面)
 
一.二维码的介绍
 
1.什么是二维码?
 
     二维条码/二维码是用某种特定的几何图形按一定规律在平面分布的黑白相间的图形记录数据符号信息的
     总结: 用图形记录标记一些信息,方便通过图形识别来获取信息
 
2 应用场景
     信息获取(名片、地图、WIFI密码、资料)
     手机电商(用户扫码、手机直接购物下单)
     手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端通道完成支付)
     微信添加好友
 
二.二维码界面的搭建
 
1.总共四个界面,可以采用storyBoard来搭建
 
2.四个storyBoard放在一个界面,看起来不美观,还很容易搞混,有没有优化方案?
     可以把四个storyBoard分别开来,单独放到一个界面里面
 
3.怎么把storyBoard单独放在一个界面,而且还让这些界面有联系(连线)?
     可以用storyBoard reference 来解决  就是用一个引用来代替storyBoard,保持storyBoard间的联系(连线)
 
 
4.最终效果
 ios-深度解析二维码的生成与使用

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

三.二维码的生成
 
1.生成二维码的步骤
     1.1 创建滤镜 CIFilter
          滤镜属于CoreImage框架,要导入该框架   该框架将常用来处理图片(生成毛玻璃效果/二维码)
 
     1.2 给滤镜设置内容(用kvc方式赋值)
          内容必须为NSData类型
 
     1.3 获取生成的二维码图片
          获取的图片是CIImage类型的,使用的话要进行转换
 
ios-深度解析二维码的生成与使用 
 
2.运行程序发现生成的二维码图片很模糊,为什么?
     生成为二维码图片大小为 27 * 27 被拉伸的太大,所以不清晰
 
3.怎么显示清晰的二维码?
     苹果提供一个api(CIImage的方法)对图片放大,还不影响清晰度
  // 1.创建Transform    orginalImage的数据类型为CIImage
let scale = imageView.bounds.width / orginalImage.extent.width
let transform = CGAffineTransformMakeScale(scale, scale)
// 2.放大图片
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 =
// 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: ) // 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 设置扫描区域代码写到哪里?
     扫描区域属于 输出的一个属性,应该写到创建输出代码的后边
 
下载源代码点击这里: 源代码链接
 

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

  1. iOS系统原生 二维码的生成、扫描和读取(高清、彩色)

    由于近期工作中遇到了个需求:需要将一些固定的字段 在多个移动端进行相互传输,所以就想到了 二维码 这个神奇的东东! 现在的大街上.连个摊煎饼的大妈 都有自己的二维码来让大家进行扫码支付.可见现在的二维 ...

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

    zxing 官方的代码很多,看起来很费劲,此demo只抽取了有用的部分,实现了相机预览解码,解析本地二维码,生成二维码三个功能. 简化后的结构如下: 废话少说直接上代码: BaseDecodeHand ...

  3. iOS笔记061 - 二维码的生成和扫描

    二维码 生成二维码 二维码可以存放纯文本.名片或者URL 生成二维码的步骤: 导入CoreImage框架 通过滤镜CIFilter生成二维码 1.创建过滤器 2.恢复滤镜的默认属性 3.设置内容 4. ...

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

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

  5. iOS中 扫描二维码/生成二维码具体解释 韩俊强的博客

    近期大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: se ...

  6. Java 条形码 二维码 的生成与解析

    Barcode简介 Barcode是由一组按一定编码规则排列的条,空符号,用以表示一定的字符,数字及符号组成的,一种机器可读的数据表示方式. Barcode的形式多种多样,按照它们的外观分类: Lin ...

  7. Android二维码的生成,解析以及扫描功能

    <1> 布局只有2个按钮,实现生成二维码和解析二维码 <Button android:layout_width="wrap_content" android:la ...

  8. Java生成与解析二维码

    1.下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar, 其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免 ...

  9. java 生成和解析二维码

    public class QRCode { /** * 解析二维码(QRCode) * @param imgPath * @return */ public static String decoder ...

随机推荐

  1. 20145330《Java程序设计》第二次实验报告

    20145330<Java程序设计>第二次实验报告 实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承多态 3.初步掌握UM ...

  2. VB的try语句,异常处理

    Try语句格式 Try 程式语句 Catch Throw ex Finally 释放一些连接等动作,不管有没有抛异常,都会执行到这里 End try 捕捉异常的语句是很好用的,在程式发生错误时,可以利 ...

  3. PAT 07-3 求素数

    求素数,这是一个“古老”的问题,每个学过编程的人都应该碰到过,这里是求第M+1到第N个素数,这么经典的问题,当然得给它写上一笔,下面是题设要求及代码实现 /* Name: Copyright: Aut ...

  4. hdu2018

    http://acm.hdu.edu.cn/showproblem.php?pid=2018 #include<iostream> #include<stdio.h> #inc ...

  5. XCODE6 提交至 App Store

    新到一个公司,以前的苹果开发人员离职,临时接手他的苹果代码,需要修改并上线到APP STORE.  xcode6.0升级到最新的6.1后, 发现各种坑 1. 路径配置不对, 这个是个人习惯问题,之前的 ...

  6. Android短信拦截和电话拦截

    MainActivity: package com.wyl.bctest; import android.support.v7.app.ActionBarActivity; import androi ...

  7. Activity与DialogFragment交互的方法

    今天我们来讨论一下如何在Activity与DialogFragment交互的方法,这里包括了DialogFragment的启动以及Activity方法的调用. DialogFragment与Dialo ...

  8. Java内存模型探秘

    1.Java内存模型概述 Java内存模型是一种抽象概念,不是真实存在的.主要定义了程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存取出变量这样的底层细节.注意:这里的变量仅包括实例字段 ...

  9. 再见:org&period;apache&period;catalina&period;connector&period;ClientAbortException&colon; java&period;io&period;IOException&colon; Connection reset by peer

    这个问题我之前遇见多次了,今天又遇见了 2019-03-22 16:33:27.555 WebMvcConfigurer.java:144 ERROR - 接口 [/appservice/7za.ex ...

  10. zTree的简单例子

    <%@ page language="java" pageEncoding="UTF-8" %> <%@ include file=&quot ...