前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS_从相机或相册里扫描二维码或条形码

iOS_从相机或相册里扫描二维码或条形码

作者头像
mikimo
发布于 2023-10-18 06:54:03
发布于 2023-10-18 06:54:03
60400
代码可运行
举报
文章被收录于专栏:iOS开发~iOS开发~
运行总次数:0
代码可运行

1. 从相机里扫描

1.1 申请相机权限
  • 导入: import AVFoundation
  • 在项目的 Info.plist 文件里添加 Privacy - Camera Usage Descriptio 描述申请使用相机权限。
  • 查询相机权限: AVCaptureDevice.authorizationStatus(for: .video)
  • 权限类型:AVAuthorizationStatus
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
notDetermined   未申请
restricted      受限制
denied          已拒绝
authorized      已授权
  • 请求相机权限,系统弹出授权申请提示:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AVCaptureDevice.requestAccess(for: .video) { (status) in
    // handle request result
}
1.2 创建Scanner
  • 获得设备:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 guard let device = AVCaptureDevice.default(for: .video) else {
    print("device error")
    return
}
  • 创建input:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 let input: AVCaptureDeviceInput
do {
  input = try AVCaptureDeviceInput(device: device)
} catch {
  print("input error")
  return
}
if self.captureSession.canAddInput(input) {
    self.captureSession.addInput(input)
} else {
    print("session can't add input")
    return
}
  • 创建 output:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let output = AVCaptureMetadataOutput()
if self.captureSession.canAddOutput(output) {
    // Tips: add output must before of set output
    self.captureSession.addOutput(output)
} else {
    print("session can't add output")
    return
}

// Set metadata identification type qr: QR code; Other: Barcode
// 设置扫描类型(qr:二维码,其他:条形码)
let hopeSupportTypes = [AVMetadataObject.ObjectType.qr,
                        AVMetadataObject.ObjectType.ean13,
                        AVMetadataObject.ObjectType.ean8,
                        AVMetadataObject.ObjectType.pdf417]
var types: [AVMetadataObject.ObjectType] = []
for type in hopeSupportTypes {
    if output.availableMetadataObjectTypes.contains(type) {
        types.append(type)
    }
}
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
output.metadataObjectTypes = types        
output.rectOfInterest = CGRect(x: 0, y: 0,
                               width: self.view.bounds.size.width,
                               height: self.view.bounds.size.height)
  • 设置预览视图:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
previewLayer.frame = scanView.layer.bounds
previewLayer.videoGravity = .resizeAspectFill
scanView.layer.addSublayer(previewLayer)
1.3 开始扫描

Tips: 不能在主线程中扫描,否则会无法响应用户操作,导致卡死现象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DispatchQueue.global(qos: .userInitiated).async {
    self.captureSession.startRunning()
}
1.4 处理扫描结果

遵循 AVCaptureMetadataOutputObjectsDelegate 协议,实现扫描回调方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 func metadataOutput(_ output: AVCaptureMetadataOutput,
                    didOutput metadataObjects: [AVMetadataObject],
                    from connection: AVCaptureConnection) {
    guard let metadataObject = metadataObjects.first else {
        captureSession.stopRunning()
        return
    }
    guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else {
        print("as? AVMetadataMachineReadableCodeObject faliue")
        return
    }
    guard let stringValue = readableObject.stringValue else {
        print("stringValue faliue")
        return
    }
    AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
    print("scan result: \(stringValue)")   // print result
    captureSession.stopRunning()
}

2. 从相册里扫描

2.1 获取相册权限
  • 导入: import Photos
  • 在项目的 Info.plist 文件里添加 Privacy - Photo Library Usage Description 描述申请访问相册权限。
  • 查询相机权限:PHPhotoLibrary.authorizationStatus()
  • 权限类型:PHAuthorizationStatus
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
notDetermined   未申请
restricted      受限制
denied          已拒绝
authorized      已授权
limited         已授权有限库访问
  • 请求相册权限,系统弹出授权申请提示:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PHPhotoLibrary.requestAuthorization { (status) in
    // handle request result
}
2.2 打开相册

Tips: 打开相册必须在主线程中执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /// have photos permission
DispatchQueue.main.async {
    self.openPhotoLabrary()
}

private func openPhotoLabrary() {
    let picker = UIImagePickerController()
    picker.title = "Photos"
    picker.delegate = self
    picker.allowsEditing = true
    picker.sourceType = .photoLibrary
    picker.navigationBar.barStyle = .default
    self.present(picker, animated: true, completion: nil)
}
2.3 获得选择结果

遵循 UIImagePickerControllerDelegateUINavigationControllerDelegate 协议,并实现选中相片后触发的协议方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func imagePickerController(_ picker: UIImagePickerController,
                           didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    dismiss(animated: true)
    
    guard let image = info[.originalImage] as? UIImage else {
        print("choose not image")
        return
    }
    parseBarCode(image: image)
}
2.4 解析相片中的二维码或条形码

导入:import Vision

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /// parse qrCode or barCode
private func parseBarCode(image: UIImage) {
    guard let cgimg = image.cgImage else {
        return
    }
    
    let request = VNDetectBarcodesRequest { req, err in
        if let error = err {
            print("parseBarCode error: \(error)")
            return
        }
        self.handleResults(req.results)
    }
    
    let handler = VNImageRequestHandler(cgImage: cgimg)
    do {
        try handler.perform([request])
    } catch {
        print("parseBarCode error: \(error)")
    }
}

private func handleResults(_ result: [VNObservation]?) {
    guard let results = result, results.count > 0 else {
        print("parseBarCode result is nil: \(String(describing: result))")
        return
    }
    for result in results {
        self.handleResult(result)
    }
}

private func handleResult(_ result: VNObservation) {
    guard let barcode = result as? VNBarcodeObservation,
          let value = barcode.payloadStringValue else {
        print("handleResult covert to string error: \(result)")
        return
    }
    
    if barcode.symbology == .qr {
        print("二维码: \(value)")
    } else {
        print("条形码: \(value), \(barcode.symbology.rawValue)")
    }
}

github demo

参考: iOS16 Swift二维码/条形码扫描+相册获取识别

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS7使用原生API进行二维码和条形码的扫描
IOS7之前,开发者进行扫码编程时,一般会借助第三方库。常用的是ZBarSDK,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析二维码的接口。经过测试,使用原生API扫描和处理的效率非常高,远远高于第三方库。
珲少
2018/08/15
7870
iOS二维码扫描
AVCaptureDevice提供了一个类方法,指定一种媒体类型(AVMediaTypeVideo or AVMediaTypeAudio)它便能返回对应的录制设备。其他媒体类型可以在AVMediaFormat.h中找到,不过它们不需要录制设备(如文本、字幕等)。
全栈程序员站长
2022/09/12
9280
Hbuilder-二维码或条形码扫描 原
使用cordova可以实现扫描二维码或者条形码的功能,但是环境配置比较复杂,需要额外安装插件。
tianyawhl
2019/04/04
2.5K0
Java生成读取条形码和二维码图片
生成条形码,二维码图片,解析条形码,二维码图片的工具类,需要用到的jar包:core.jar,zxing-javase.jar
用户8983410
2021/09/23
1.3K1
Android实现条形码与二维码扫描
有个二维码是目前移动端和webAPP 常用是一种和用户的交互方式,常用在社交,支付,电商app中,本文介绍实现条形码与二维码扫描。
开发者技术前线
2020/11/23
5.3K0
Android实现条形码与二维码扫描
微信小程序调用摄像头扫描识别二维码和条形码
给扫描按钮的图片绑定一个事件,点击调用摄像头扫码,扫描成功将数值赋给 input 输入框的 value 值。效果如下图:
德顺
2019/11/13
11.2K0
微信小程序调用摄像头扫描识别二维码和条形码
iOS7自带扫描二维码、条形码功能实现引1、准备工作2、实现扫描界面3、优化扫描界面
随着二维码的普及,扫码功能越来越重要,比起手动输入,扫码直接获取的方式会更加的便捷和快速,在iOS7之前,实现扫码一般是使用第三方的类库,如ZBar等,iOS7之后开始自行提供扫码的框架,在AVFoundation中包含有实现扫码的类,使用起来还是很方便的,本文通过一个例子讲述其用法。
Cloudox
2021/11/23
9890
iOS7自带扫描二维码、条形码功能实现引1、准备工作2、实现扫描界面3、优化扫描界面
iOS学习——iOS原生实现二维码扫描
  最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时后台会自动上传用户的当前地点,如何自动定位获取用户的当前地点在上一篇随笔iOS学习——自动定位中已经讲过了,本文就简单地说一下如何利用iOS原生的模块实现二维码的扫描。   二维码扫描是很多应用都会实现的功能,比较著名的第三方开源库是Google出品的ZXing,其的OC的移植版本是ZXingObjc。iOS系统原生的二维码扫描模块
mukekeheart
2018/03/26
2.5K0
pyzbar 二维码、条形码识别
利用python的第三方模块 pyzbar 可以很方便的进行二维码的识别(也能识别条形码,用法别无二致)。
用户6021899
2019/10/09
6K0
pyzbar 二维码、条形码识别
微信小程序调用相机或者图库实现扫描二维码或者条码的文档教程
最近在做一个产品项目,程序是需要扫描条形码然后跟后台某个接口返回值,其实微信小程序就有一个扫码识别的API,下面一起来看看:
李洋博客
2022/03/03
4.9K0
java——记录一次条形码、二维码、订单自动生成的制作
链接:https://pan.baidu.com/s/12mJTx7TkbK2HiWDgcT_jbQ 提取码:di1y
不愿意做鱼的小鲸鱼
2022/09/26
1.3K0
java——记录一次条形码、二维码、订单自动生成的制作
AVFoundation框架解析看这里(2)- 媒体捕捉与视频拍摄
上一章节主要从整体上全览AVFoundation框架,本章主要以一个小的需求(以媒体捕捉以起点,拍摄、保存视频),打开AVFoundation的大门,带领我们欣赏这个框架带来的强大功能。
sweet说好的幸福
2020/12/23
1.3K0
AVFoundation框架解析看这里(2)- 媒体捕捉与视频拍摄
IOS 扫二维码
注意:本篇文章采用了IOS7的新特性来扫二维码,所以系统支持要IOS7以上,如果要兼容IOS7之前的版本,自行找库来支持。
用户7718188
2021/09/22
4980
iOS开发之扫描二维码
自iOS7以后,iOS扫描二维码不需要借助于第三方框架了,苹果在AVFoundation中原生支持了扫描二维码的API,主要涉及到5个类,这5个类在自定义相机或者视频时也用得上,网上有很多介绍,这5个类分别为: AVCaptureSession:媒体捕获会话,负责把捕获的音视频数据输出到输出设备中。 AVCaptureDevice:输入设备,如麦克风、摄像头。 AVCaptureDeviceInput:设备输入数据管理对象,可以根据AVCaptureDevice创建对应的AVCaptureDeviceI
YungFan
2018/05/03
2K0
iOS开发之扫描二维码
iOS开发——系统原生的二维码扫描
对于现在的App应用来说,扫描二维码这个功能是再正常不过的一个功能了,在早期开发这些功能的时候,大家或多或少的都接触过ZXing和ZBar这类的第三方库,但从iOS7以后,苹果就给我们提供了系统原生的API来支持我们扫描获取二维码,ZXing和ZBar在使用中或多或少有不尽如人意的地方,再之停止更新很久了,所以今天我们就来聊聊如何用系统原生的方法扫描获取二维码。
Originalee
2018/08/30
8900
小程序的二维码与条形码技术
二维码与条形码技术是现代商业和科技中不可或缺的工具,广泛应用于零售、支付、物流、营销等多个领域。随着移动互联网的普及,二维码与条形码的应用也不断创新,尤其是在微信小程序中,通过集成二维码与条形码功能,可以实现商品的扫码支付、信息验证、用户认证等多种功能。本文将详细解析小程序中二维码与条形码的应用技术,介绍其实现方式,并通过具体案例帮助你更好地理解如何在小程序中实现二维码与条形码功能。
LucianaiB
2025/02/10
2870
基于zxing的二维码扫描
现在的应用中二维码扫描已经成为一个应用必不可少的功能,现在大部分Android二维码扫描都是基于zxing和Zbar,这文章就来介绍一下基于zxing的二维码扫描。先看下效果图
g小志
2018/09/11
4.2K0
基于zxing的二维码扫描
好用app推荐:扫描二维码、扫描条形码并查看历史
有些朋友日常生活中可能需要频繁扫描二维码,或者需要频繁扫描条形码,一般情况下我们可以直接用微信进行扫描。但是如果想记录扫描的历史,或者想对扫描的二维码、条形码进行美化、分享的话,用微信扫描就不是很方便。今天,小编给大家推荐一款我平时经常使用的手机app--二维码和条形码生成器,一款好用的、免费的扫码App,支持安卓、鸿蒙、苹果手机,快来看看怎么用吧。
好用app推荐官
2022/07/04
1.6K0
好用app推荐:扫描二维码、扫描条形码并查看历史
Flutter自制插件之r_scan二维码&条形码扫描(支持文件、url、内存、相机)
二维码作为信息的载体,广泛应用于我们生活的方方面面,例如:使用支付宝支付,二维码加好友,二维码推广等等,能举例的例子多不胜数,而如果你的应用支持二维码的扫描,用户和体验将会翻倍的增长,如果你是应用的开发者,欢迎来使用此二维码扫描插件!并希望能给予项目一个star,谢谢!项目地址:https://github.com/rhymelph/r_scan
rhyme_lph
2020/03/20
2.2K0
安卓chrome 扫描二维码_付款扫的是条形码还是二维码
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10163203
全栈程序员站长
2022/11/01
8830
推荐阅读
相关推荐
iOS7使用原生API进行二维码和条形码的扫描
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档