扫码采用类库:AVFoundation

1、相关权限

1)、需要在info.plist中添加以下权限:Privacy - Camera Usage Description(使用摄像机的权限说明)

2)、权限申请与判断:

查询权限:AVCaptureDevice.authorizationStatus(for: .video)

申请权限:AVCaptureDevice.requestAccess(for: .video)

2、初始化摄像头

// 查找广角摄像头
let deviceDiscovery = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera],
mediaType: .video,
position: .back)
guard let device = deviceDiscovery.devices.last else {
return
}
guard let deviceInput = try? AVCaptureDeviceInput(device: device) else {
return
}
if sesson.canAddInput(deviceInput) {
sesson.addInput(deviceInput)
}
// 初始化元数据输出管道,用于识别条码,二维码
let metaDataOutput = AVCaptureMetadataOutput()
metaDataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
if sesson.canAddOutput(metaDataOutput) {
sesson.addOutput(metaDataOutput)
} // 设置元数据识别类型 qr:二维码;其他:条形码
metaDataOutput.metadataObjectTypes = [.qr, .ean13, .ean8, .upce, .code39, .code39Mod43, .code93, .code128, .pdf417] // 初始化视频预览图层
let previewLayer = AVCaptureVideoPreviewLayer(session: sesson)
previewLayer.videoGravity = .resizeAspectFill
previewLayer.frame = view.bounds
view.layer.insertSublayer(previewLayer, at: 0)
// 设置元数据识别区域(只有在该区域内的内容才会被识别)
metaDataOutput.rectOfInterest = scanRect
sesson.startRunning()

3、添加二维码与条形码识别输出管道:

// 初始化元数据输出管道,用于识别条码,二维码
let metaDataOutput = AVCaptureMetadataOutput()
metaDataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
if sesson.canAddOutput(metaDataOutput) {
sesson.addOutput(metaDataOutput)
} // 设置元数据识别类型 qr:二维码;其他:条形码
metaDataOutput.metadataObjectTypes = [.qr, .ean13, .ean8, .upce, .code39, .code39Mod43, .code93, .code128, .pdf417] // 设置元数据识别区域(只有在该区域内的内容才会被识别)
metaDataOutput.rectOfInterest = scanRect

管道回调代理:

extension ScannerViewController: AVCaptureMetadataOutputObjectsDelegate {

    public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
guard metadataObjects.count > 0 else {
return
}
let texts = metadataObjects.compactMap { data -> String? in
guard let code = data as? AVMetadataMachineReadableCodeObject else {
return nil
}
return code.stringValue // 识别结果
}
}
}

以上就是一个完整的扫码功能。

接下来就是识别本地的条形码和二维码图片

系统提供两种方法识别二维码:其中用到了Vision库->VNDetectBarcodesRequest

/// 仅仅识别二维码图片
public static func parseQRCode(img: UIImage) -> String? {
guard let ciimg = CIImage(image: img) else {
return nil
}
let detector = CIDetector(ofType: CIDetectorTypeQRCode,
context: nil,
options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])
guard let features = detector?.features(in: ciimg) else {
return nil
}
guard let feature = features.first(where: { $0.type == CIFeatureTypeQRCode }) as? CIQRCodeFeature else {
return nil
}
return feature.messageString // 识别结果
} /// 识别二维码和条形码
public static func parseBarCode(img: UIImage) {
guard let cgimg = img.cgImage else {
return
}
let request = VNDetectBarcodesRequest { req, err in
if let error = err {
print("parseBarCode error: \(error)")
return
}
guard let results = req.results, results.count > 0 else {
return
}
for result in results {
if let barcode = result as? VNBarcodeObservation, let value = barcode.payloadStringValue { if barcode.symbology == .qr { // 二维码
print("qrcode: \(value)")
}else { // 条形码
print("barcode: \(value), \(barcode.symbology.rawValue)")
}
break
}
}
}
let handler = VNImageRequestHandler(cgImage: cgimg)
do {
try handler.perform([request])
} catch {
print("parseBarCode error: \(error)")
}
}

iOS系统自带的扫码功能(二维码+条形码+识别本地图片)的更多相关文章

  1. Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】

    作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ...

  2. 关于.NET HttpClient方式获取微信小程序码(二维码)

    随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来.近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数):看了下小程序官方文档文档,结合网上的例子,未看到 ...

  3. online QRcode generator , QRcode=== (Quick Response Code) , 二维条码,二维码,彩色二维码,图片二维码,

    online QRcode generator ,  QRcode=== (Quick Response Code)    , 二维条码,二维码,彩色二维码,图片二维码, 1 http://cli.i ...

  4. ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码

    我怎么有二维码没有联系,最近遇到一个问题,,如何推断条码扫描到一维代码或者二维代码,辛苦了一个下午下班后自己,加上网上跟踪信息. 总结出两种方式能够解决该问题(推荐採用另外一种方式): 1.改动源代码 ...

  5. Halcon一维码和二维码的解码步骤和技巧——第11讲

    针对Halcon中一维码和二维码的解码,我分别写了两篇文章,参见: <Halcon的一维条码解码步骤和解码技巧>:https://www.cnblogs.com/xh6300/p/1048 ...

  6. asp.net生成店铺推广二维码,二维码中间加logo(源码)

    二维条码比一维条码记载数据量更多,二维码条码是一种高密度.高信息含量的便携式数据文件,是实现证件及卡片等大容量.高可靠性信息自动存储.携带并可用机器自动识读的理想手段.而且可以记载更复杂的数据,比如图 ...

  7. iOS开发——iOS7(及以后版本) SDK自带二维码(含条形码)扫码、二维码生成

    本文转载至 http://www.cnblogs.com/leotangcn/p/4357907.html 现在很多APP都涉及了二维码扫码功能,这个功能简单实用,很多情况下用户乐于使用,现在本文带来 ...

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

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

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

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

  10. 分享一个可以把 iOS/Android 应用的下载链接合成一个二维码的工具

    芝麻二维码官网:https://www.hotapp.cn 1.在iOS系统设备扫描时 如果是微信扫描,因为第一步里使用了中间页面,此时无法直接跳转到App Store了,所以需要给出提示页面,提示用 ...

随机推荐

  1. centos7 在线或离线安装python3

    1.前言 本文会使用到yum和wget,如果两者都不能用,参考安装教程 https://www.cnblogs.com/dennisdong/p/17037248.html 2.查看是否安装wget和 ...

  2. SpringCloud Stream消息驱动

    简单搭建,没有技术含量,Demo可用 1.介绍 ①产生原因 RabbitMQ.RocketMQ.Kafka.ActiveMQ 在一个项目中,可能存在多种不同的MQ,在不同的MQ中,切换维护开发都很麻烦 ...

  3. Mat数据结构

    1.MAT类: OpenCV从2001年开始发展,在最初使用的是c语言,使用的是IplImage数据结构来存储图像,但是最大的问题需要手动申请释放内从( manual memory managemen ...

  4. k8s中使用prometheus operator监控外部服务器部署的windows exporter

    k8s中使用prometheus operator监控外部服务器部署的windows exporter 0.文档说明 (1)Prometheus Operator是一个流行的k8s集群监控套件,项目地 ...

  5. react中redux怎么使用

    一.redux是什么? redux 就是react 全局状态管理,作用是存放全局数据 二.核心 state:存放数据 reducer:修改仓库数据 是一个函数,参数一:仓库中的数据,参数2:行为 ac ...

  6. JZOJ 5033. 【NOI2017模拟3.28】A

    A 题面 思路 非常抽象地让你构造树,很容易想到 \(prufer\) 序列(如果你会的话) 说明一下:\(prufer\) 序列可以唯一确定一颗树的形态 若树的节点个数为 \(n\),那么 \(pr ...

  7. 基于电商直播SDK快速实现一个淘宝直播APP【内附源码】

    现在各大互联网APP都标配电商直播带货了,没有直播带货开发经验都感觉自己跟不上技术的进步.今天快速基于Java实现一个安卓端电商直播APP,深入理解整个电商直播开发流程.我们最终实现效果如下: 按照惯 ...

  8. CodeQL练习1

    CodeQL官方准备了一些无关编程语言的QL语言练习,我这里整理稍许来记录学习一下. QL是一种逻辑编程语言,所以它是由逻辑公式构成的.QL使用常见的逻辑连接词(如and.or.not).量词(如fo ...

  9. HTML+css图片轮播

    <div class="pst"> <div class="pin"> <div style="background-i ...

  10. 09 spark连接mysql数据库

    安装启动检查Mysql服务.netstat -tunlp (3306) spark 连接mysql驱动程序.–cp /usr/local/hive/lib/mysql-connector-java-5 ...