Vue实现长按图片识别图中二维码
Vue实现长按图片识别图中二维码
思路:要想实现可以识别图片中的二维码,那必定是要将这张图进行上传操作,上传则需要file对象格式。不管是在H5还是APP中,展示的图片都是通过url的方式展示在img标签中的,所以大致的思路就是长按图片,获取图片url,并将url转换成可实现上传操作的file对象格式,再通过某个插件对上传的file进行是否存在QR码的识别判断操作,从而实现了长按识别二维码,思路成立,开始实现。
1. 首先我们需要实现长按某张图片,几百毫秒后执行下一步操作,这一步就包括了获取这张图片url,这一步可以通过@touchstart结合setTimeout实现。
// 标签中
<div class="image-preview" @touchstart="holdDown"></div>
// js中
holdDown (e) {
setTimeout(() => {
// 这是通过长按获取到了html标签,下面这个if语句就是为了识别是否是img标签,通过e.target.nodeName获取
if(e.target.nodeName === 'IMG'){
// 这里可以做很多事,比如vant组件的动作面板,或是对话框等等,方便识别二维码成功后的后续操作,例如点击识别二维码,这个是你自己定的。
this.showSheet = true
// 提前通过e.target.currentSrc获取到图片的src,也就是图片的url地址,并把它存起来。
this.imgUrl = e.target.currentSrc
// 拿到url后,我们就需要将图片的url地址转化成file对象格式,也就是俗称的文件格式。这里我们最好封装一个方法,传入url,通过返回值获取到它的值。
this.urlToFile(url)
// 未完 继续往下看
}
},500)
}
2. 我们需要封装一个可以将url的图片地址转换成可上传的file对象格式,这里就是整个实现代码的核心。
urlToFile (url, callback) { // 建议封装,全局使用
const image = new Image() // 初始化一个image图像
image.crossOrigin = '*' // 这个是为了解决图片的跨域问题,有些时候不生效,则需要后端配置
image.src = url
image.onload = function () { // 当然在图片加载完成后去执行以下代码
const canvas = document.createElement('canvas') // 将image图像转化成canvas图像
canvas.width = image.width // canvas长宽与image保持一致
canvas.height = image.height
const ctx = canvas.getContext('2d')
ctx.drawImage(image, 0, 0, image.width, image.height)
const ext = image.src.substring(image.src.lastIndexOf('.') + 1).toLowerCase()
const dataURL = canvas.toDataURL('image/' + ext) // 如果你的图片格式是固定的,如jpg、png,则可以直接替换这里的ext,直接写成例如image/png。
const type = 'image/' + ext
const bytes = window.atob(dataURL.split(',')[1]) // 去掉url的头,并转换为byte
const ab = new ArrayBuffer(bytes.length) //初始化一个bytes的二进制数组ArrayBuffer
const ia = new Uint8Array(ab) // 初始化,ab转为Uint8Array数组类型
for (let i = 0; i < bytes.length; i++) {
ia[i] = bytes.charCodeAt(i)
}
const tempBlob = new Blob([ia], { type: type }) // 关键,初始化一个blob对象,blob支持文件操作
const blob = tempBlob
var file = new File([blob], 'filename', { type: type, lastModified: Date.now() })// 通过blob创建一个file文件
callback(file) // 为何用callback 而不是return?因为上面的onload中是闭包,我们无法直接return这个file
}
}
3. 还记得之前传入url的那个方法吗?我们回到长按方法holdDown方法中,再获取callback的file值。
holdDown (e) {
setTimeout(() => {
.
. // 省略部分代码
.
this.urlToFile(url, (file) => { // 通过箭头函数拿到callback返回的值
console.log(file) //至此 你已经成功拿到url转file的图片文件,下一步就是上传,并扫描二维码
})
}
},500)
}
4. 市面上扫描图片文件二维码的插件并不多,甚至有大神手写了一个reqrcode.js,但不适用于vue。这里我推荐qrcode-decoder插件,他可以通过传入的file实现对图片文件的扫描,识别是否存在二维码,并获取到二维码的内容。
下载方式:
// npm 安装
npm install qrcode-decoder
// 太慢了?淘宝镜像安装
npm install qrcode-decoder --registry=https://registry.npm.taobao.org
5. qrcode-decoder的使用方法
import QrCode from 'qrcode-decoder'
// 引入后,创建一个方法,用于识别图片二维码,当然你可以将这个方法封装起来,全局注册,便于使用。
identifyQR (file) {
// 获取临时路径 chrome有效,其他浏览器的方法请自行查找
const url = window.webkitURL.createObjectURL(file)
console.log(url)
// 初始化
const qr = new QrCode()
// 解析二维码,返回promise
return qr.decodeFromImage(url) //注意 这里返回的是一个promise对象
}
6. 再回到我们获取到file处,使用这个方法,并进行后续操作
holdDown (e) {
setTimeout(() => {
.
. // 省略部分代码
.
this.urlToFile(url, (file) => { // 通过箭头函数拿到callback返回的值
this.identifyQR(file).then(r => { // 返回值为promise对象,所以通过.then获取
if(r.data){// 其中写你的操作,若有值,则说明是存在二维码的,可以先存起来获取到的二维码的值,便于其他地方操作及使用
...
}else{
console.log('不是二维码')
}
})
})
}
},500)
}
至此,成功实现了长按识别二维码
总结:方法是自己摸索的,明明可以app解决的问题非要交给前端,不过解决思路还是很清晰的,如果有更好的方法,不妨交流交流。
感谢阅读~
Vue实现长按图片识别图中二维码的更多相关文章
- iOS - 长按图片识别图中二维码
长按图片识别图中二维码: // 长按图片识别二维码 UILongPressGestureRecognizer *QrCodeTap = [[UILongPressGestureRecognizer a ...
- C#识别图中二维码
1.在NuGet中添加 ZXing.Net 2.实例代码 /// <summary> /// 识别图中二维码 /// </summary> /// <param name ...
- android选取系统相册图片后,识别图中二维码
项目中添加设备操作需要扫描二维码,考虑到多种扫码方式,也添加直接识别二维码图片的操作. 首先跳转系统相册选取图片 Intent intent = new Intent(Intent.ACTION_PI ...
- Android 长按识别图中二维码 zxing
#基于 Zxing, 初学Android 代码质量不高 //长按,通过zxing读取图片,判断是否有二维码 bigImage.setOnLongClickListener(new View.OnLon ...
- 【转】Delphi+Halcon实战一:两行代码识别QR二维码
Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...
- zxing 如何识别反转二维码
说起二维码扫描,估计很多人用的是 zxing 吧. 然而 zxing 虽然好用,但是却有一些坑. 这边分析一下自己实际项目遇到的一个坑. 什么坑呢? 下面举个栗子你就懂了. 这边生成二维码使用的是网络 ...
- php 合并图片 (将活动背景图片和动态二维码图片合成一张图片)
<?php //案例一:将活动背景图片和动态二维码图片合成一张图片 //图片一 $path_1 = './background.png'; //图片二 $path_2 = './FU0851_2 ...
- Halcon中二维码解析函数解码率和时长的优化方法
Halcon中条码解析函数包容多种条码类型且简单强大.现有的‘Data Matrix ECC 200’.‘QR Code’和‘PDF417’等广泛使用的条码均能解析.简单是通过默认参数即可对多种条码进 ...
- qrcode.js的识别解析二维码图片和生成二维码图片
qrcode只通过前端就能生成二维码和解析二维码图片, 首先要引入文件qrcode.js,下载地址为:http://static.runoob.com/download/qrcodejs-04f46c ...
随机推荐
- 微信公众号授权登录后报redirect_uri参数错误的问题
在进行微信公众号二次开发的时候,需要通过授权码模式来进行微信授权.比如,在进行登录的时候,用户点击了登录按钮,然后弹出一个授权框,用户点击同意后,就可以获取用户的OpenId等信息了.这篇文章主要 ...
- 霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_206 举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种"指南"和" ...
- Odoo14 收发邮件服务器设置
# 维护邮箱的七个地方 # 1.settings中Discuss栏将External Email Servers勾选(启用外部邮件服务),然后维护Alias Domain(域名) # 2.Techni ...
- HCIA-Datacom 3.4 实验四:实现VLAN间通信实验
实验介绍: 划分VLAN后,不同VLAN的用户间不能二层互访,这样能起到隔离广播的作用.但实际应用中,不同VLAN的用户又常有互访的需求,此时就需要实现不同VLAN的用户互访,简称VLAN间互访.华为 ...
- 2022-08-15 - 初识MySQL
MySQL数据库 数据库 数据库,又称为Database,简称DB.数据库就是一个文件集合. 顾名思义:是一个存储数据的仓库,实际上就是一堆文件,这些文件中存储了具有特定格式的数据,可以很方便的对里面 ...
- i40e网卡驱动遇到的一个问题
最近在排查一个crash文件的时候,遇到一个堆栈,即软中断收包的时候,skb的关联的dev是null,导致oops, 然后去crash分析的时候,发现skb的dev去不是null. 从oops到cra ...
- kafka报错 日志压缩报错直接退出
Resetting first dirty ofset to log start offset 2971862 since the checkpointed offset 12675089 is ...
- 【PostgreSQL】PostgreSQL 15移除了Stats Collector
试用即将发行的PostgreSQL 15的人会发现少了一个后台进程: postgres 1710 1 0 04:03 ? 00:00:00 /usr/pgsql-15/bin/postmaster ...
- VS Code 之KoroFileHeader插件
设置 在vscode左下角点击设置按钮,选择"设置",然后输入"fileheader", 文件头部注释:Fileheader:custom Made 函数注释: ...
- KingbaseES XA 分布式事务
在分布式系统中,各个节点(或者事务参与方)之间在物理上相互独立,各节点之间无法确切地知道其它节点中的事务执行情况,所以多节点之间很难保证ACID,尤其是原子性.如果是单节点的事务,由于存在事务机制,可 ...