// 标签中
<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)
}
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
}
}
holdDown (e) {
setTimeout(() => {
.
. // 省略部分代码
.
this.urlToFile(url, (file) => { // 通过箭头函数拿到callback返回的值
console.log(file) //至此 你已经成功拿到url转file的图片文件,下一步就是上传,并扫描二维码
})
}
},500)
}
// npm 安装
npm install qrcode-decoder
// 太慢了?淘宝镜像安装
npm install qrcode-decoder --registry=https://registry.npm.taobao.org
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对象
}
holdDown (e) {
setTimeout(() => {
.
. // 省略部分代码
.
this.urlToFile(url, (file) => { // 通过箭头函数拿到callback返回的值
this.identifyQR(file).then(r => { // 返回值为promise对象,所以通过.then获取
if(r.data){// 其中写你的操作,若有值,则说明是存在二维码的,可以先存起来获取到的二维码的值,便于其他地方操作及使用
...
}else{
console.log(‘不是二维码‘)
}
})
})
}
},500)
}
原文:https://www.cnblogs.com/Brid9e/p/15212746.html