Vue 实现 上传图片 二维码识别 + 条形码识别(qrcode-decoder插件)
需求
1.web端H5 实现 上传图片 自动识别二维码内容
2.具体业务 比如 上传电影票 自动识别取票码或者其他的二维码上传(主要是为增加用户体验)
二维码(插件):
1.使用Npm安装qrcode-decoder
npm i qrcode-decoder --registry=https://registry.npm.taobao.org
2.创建一个方法 qrcode.js
// 引入qrcode-decoder,
// import QrCode from 'qrcode-decoder'
// 部分网友反应上面的引入,这个引入的是一个空对象,不能使用,已经给开发者提issues了,希望能尽快修复不能使用或报错,可以试试下面这种
import QrCode from '../../../../../node_modules/qrcode-decoder/dist/index';
// 传入file对象,返回promise
export function getQrUrl(file) {
//使用这个方法或者下面被注释的方法设置浏览器读取文件方式,chrome和ie有效,其他浏览器没测试
const URi = window.webkitURL.createObjectURL(file) || window.URL.createObjectURL(file)
// if (window.webkitURL) {
// URi = window.webkitURL.createObjectURL(file);
// } else if (window.URL && window.URL.createObjectURL) {
// URi = window.URL.createObjectURL(file);
// } else {
// URi = null;
// }
const url = URi
// 初始化
const qr = new QrCode()
// 解析二维码,返回promise
return qr.decodeFromImage(url)
}
3.在页面上使用
const handleFileChange = (event, index) => {
console.log(event, index);
console.log(
event.target.childNodes[0].files[0],
"event.childNodes.childNodes.files"
);
// onFileChange(event.target.childNodes[0].files[0], index);
handleUpload(event.target.childNodes[0].files[0], index);
// onFileChange(event.target.childNodes[0].files[0]);
const result = getQrUrl(event.target.childNodes[0].files[0])
result.then(res => {
console.log(res);
if (res.data) {
console.log(res.data, '二维码内容')
if (res.data.length > 12) {
imageList[index].code = res.data
if (res.data.indexOf("|") != -1 && res.data.length > 12) {
var str = res.data.split("|")
imageList[index].code = str[0]
imageList[index].yanz = str[1]
}
} else if (res.data.indexOf("|") == -1 && res.data.length == 12) {
imageList[index].code = res.data.slice(0, 6)
imageList[index].yanz = res.data.slice(6)
} else if (res.data.indexOf("|") == -1 && res.data.length < 12) {
imageList[index].code = res.data
imageList[index].yanz = ""
}
// Toast('识别二维码成功!')
} else {
Taro.showToast({
title: "识别失败,请重新上传",
icon: "none",
duration: 2000,
})
}
})
};
我的这个方法是上传图片的 获取的参数是file 在你们的那里可能不一样 根据你们的实际需求去调整