iOS系统自带的扫码功能(二维码+条形码+识别本地图片)
扫码采用类库: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系统自带的扫码功能(二维码+条形码+识别本地图片)的更多相关文章
- Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】
		作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ... 
- 关于.NET HttpClient方式获取微信小程序码(二维码)
		随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来.近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数):看了下小程序官方文档文档,结合网上的例子,未看到 ... 
- online QRcode generator ,  QRcode=== (Quick Response Code)    , 二维条码,二维码,彩色二维码,图片二维码,
		online QRcode generator , QRcode=== (Quick Response Code) , 二维条码,二维码,彩色二维码,图片二维码, 1 http://cli.i ... 
- ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码
		我怎么有二维码没有联系,最近遇到一个问题,,如何推断条码扫描到一维代码或者二维代码,辛苦了一个下午下班后自己,加上网上跟踪信息. 总结出两种方式能够解决该问题(推荐採用另外一种方式): 1.改动源代码 ... 
- Halcon一维码和二维码的解码步骤和技巧——第11讲
		针对Halcon中一维码和二维码的解码,我分别写了两篇文章,参见: <Halcon的一维条码解码步骤和解码技巧>:https://www.cnblogs.com/xh6300/p/1048 ... 
- asp.net生成店铺推广二维码,二维码中间加logo(源码)
		二维条码比一维条码记载数据量更多,二维码条码是一种高密度.高信息含量的便携式数据文件,是实现证件及卡片等大容量.高可靠性信息自动存储.携带并可用机器自动识读的理想手段.而且可以记载更复杂的数据,比如图 ... 
- iOS开发——iOS7(及以后版本) SDK自带二维码(含条形码)扫码、二维码生成
		本文转载至 http://www.cnblogs.com/leotangcn/p/4357907.html 现在很多APP都涉及了二维码扫码功能,这个功能简单实用,很多情况下用户乐于使用,现在本文带来 ... 
- iOS中 扫描二维码/生成二维码详解 韩俊强的博客
		最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang 新浪微博 指示根视图: se ... 
- iOS中 扫描二维码/生成二维码具体解释 韩俊强的博客
		近期大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang 新浪微博 指示根视图: se ... 
- 分享一个可以把 iOS/Android 应用的下载链接合成一个二维码的工具
		芝麻二维码官网:https://www.hotapp.cn 1.在iOS系统设备扫描时 如果是微信扫描,因为第一步里使用了中间页面,此时无法直接跳转到App Store了,所以需要给出提示页面,提示用 ... 
随机推荐
- centos7 在线或离线安装python3
			1.前言 本文会使用到yum和wget,如果两者都不能用,参考安装教程 https://www.cnblogs.com/dennisdong/p/17037248.html 2.查看是否安装wget和 ... 
- SpringCloud Stream消息驱动
			简单搭建,没有技术含量,Demo可用 1.介绍 ①产生原因 RabbitMQ.RocketMQ.Kafka.ActiveMQ 在一个项目中,可能存在多种不同的MQ,在不同的MQ中,切换维护开发都很麻烦 ... 
- Mat数据结构
			1.MAT类: OpenCV从2001年开始发展,在最初使用的是c语言,使用的是IplImage数据结构来存储图像,但是最大的问题需要手动申请释放内从( manual memory managemen ... 
- k8s中使用prometheus operator监控外部服务器部署的windows exporter
			k8s中使用prometheus operator监控外部服务器部署的windows exporter 0.文档说明 (1)Prometheus Operator是一个流行的k8s集群监控套件,项目地 ... 
- react中redux怎么使用
			一.redux是什么? redux 就是react 全局状态管理,作用是存放全局数据 二.核心 state:存放数据 reducer:修改仓库数据 是一个函数,参数一:仓库中的数据,参数2:行为 ac ... 
- JZOJ 5033. 【NOI2017模拟3.28】A
			A 题面 思路 非常抽象地让你构造树,很容易想到 \(prufer\) 序列(如果你会的话) 说明一下:\(prufer\) 序列可以唯一确定一颗树的形态 若树的节点个数为 \(n\),那么 \(pr ... 
- 基于电商直播SDK快速实现一个淘宝直播APP【内附源码】
			现在各大互联网APP都标配电商直播带货了,没有直播带货开发经验都感觉自己跟不上技术的进步.今天快速基于Java实现一个安卓端电商直播APP,深入理解整个电商直播开发流程.我们最终实现效果如下: 按照惯 ... 
- CodeQL练习1
			CodeQL官方准备了一些无关编程语言的QL语言练习,我这里整理稍许来记录学习一下. QL是一种逻辑编程语言,所以它是由逻辑公式构成的.QL使用常见的逻辑连接词(如and.or.not).量词(如fo ... 
- HTML+css图片轮播
			<div class="pst"> <div class="pin"> <div style="background-i ... 
- 09 spark连接mysql数据库
			安装启动检查Mysql服务.netstat -tunlp (3306) spark 连接mysql驱动程序.–cp /usr/local/hive/lib/mysql-connector-java-5 ... 
