vue实现输入网址生成二维码、解码、下载、更改功能
功能:
1.输入网址生成二维码
2.二维码可以下载
3.可以更改二维码中心的图片
4.可以通过本地相册的二维码进行解码
1.下载三个插件
下载vue-qr,用于生成二维码
npm install vue-qr
下载vue-jimp并指定版本号,最新版不行,实现不了 。Jimp 库读取图片数据。Jimp 是一个用于处理图像的 JavaScript 库,它可以从数据中创建图像对象。
npm install jimp@0.16.1
下载jsqr,用于将二维码进行解码
npm install jsqr
2.完整代码如下
不太好讲我直接做了注释,看注释应该能看懂吧
<template>
<div class="content-box">
<div class="container">
<h1>二维码输入网址生成、下载</h1>
<el-row>
<el-col :span="6">
<el-input v-model="text" placeholder="输入要生成二维码的网址"></el-input>
</el-col>
<el-col :span="4" :push="1">
<el-button><a :href="href" target="_blank" download="已下载二维码" rel="noopener noreferrer">下载二维码</a></el-button>
</el-col>
<el-col :span="4" :push="1">
<input
type="file"
@change="updateImg"
name="file"
class="element"
accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"
/>
</el-col>
</el-row>
<el-row style="margin-top: 20px;">
<el-col :span="6">
<vue-qr
qid="qrid"
:text="text"
:size="size"
:bgSrc="bgSrc"
:logoSrc="logoSrc"
:callback="callBack"
:logoScale="logoScale"
:colorDark="colorDark"
:colorLight="colorLight"
:backgroundColor="backgroundColor"
></vue-qr>
</el-col>
</el-row>
<hr />
<h2>解析二维码</h2>
<el-row style="margin-top: 20px;">
<el-col :span="6">
<input type="file" @change="upload($event)" />
</el-col>
</el-row>
<img :src="image" alt="" srcset="" />
{{ result }}
</div>
</div>
</template>
<script>
import VueQr from 'vue-qr';
import Jimp from 'jimp';
import jsQR from 'jsqr';
export default {
components: {
VueQr
},
data() {
return {
href: '',
text: 'https://element.eleme.cn/#/zh-CN/component/table', // 二维码内容
size: 150, // 二维码宽高尺寸, 长宽一致, 包含外边距
bgSrc: '', // 嵌入背景图地址,
logoSrc: 'https://tse2-mm.cn.bing.net/th/id/OIP-C.mH9YLFEL5YdVxJM82mjVJQAAAA?pid=ImgDet&rs=1', // 嵌入至二维码中心的 LOGO 地址
margin: 0, // 二维码图像的外边距, 默认20px
colorDark: '#484848', // 实点的颜色,必须设置深色,浅色会识别不出来
colorLight: '#42B983', // 空白区的颜色
backgroundColor: '#EEE', // 背景色
logoScale: 0.15, // 中间图的尺寸,不要设太大,太大会导致扫码失败的 默认0.2
dotScale: 0.35, // 数据区域点缩小比例,默认为0.35
imgUrl: '', //
result: '',
image: ''
};
},
mounted() {},
methods: {
callBack(base64, pid) {
this.href = base64;
console.log(base64, pid);
},
// 上传二维码
upload(event) {
const file = event.target.files[0];
this.result = '';
// 创建一个新的filereader对象,用于读取文件内容
const fReader = new FileReader();
// 将选定的文件读取为数据 URL。这将读取文件的内容,并将其转换为 Base64 编码的字符串。这个 Base64 字符串可以用于展示图片,或者上传到服务器。
fReader.readAsDataURL(file);
// 文件读取完后执行的回调函数
fReader.onload = e => {
console.log(e, '图片回调');
// 将读取的的文件内容base64编码字符串赋值给image变量,展示图片
this.image = e.target.result;
// 使用 Jimp 库读取图片数据。Jimp 是一个用于处理图像的 JavaScript 库,它可以从数据中创建图像对象。
Jimp.read(e.target.result)
.then(async res => {
console.log(res, 'jimp的图像对象');
const { data, width, height } = res.bitmap;
try {
// 使用 jsQR 库对图像中的二维码进行解码。得到图片原本的数据,data是地址
const resolve = await jsQR(data, width, height);
console.log(resolve, 'zabuzou1l1-------');
this.result = resolve.data;
console.log(this.result, '得到数据');
} catch (err) {
this.result = '识别失败,重新传二维码';
}
})
.catch(err => {
console.error('文件读取错误', err);
});
};
},
updateImg(event) {
// 声明了一个名为 createObjectURL 的变量,它是一个用于创建临时 URL 的函数。这里使用了多个浏览器前缀的不同实现,以兼容不同的浏览器。
const file = event.target.files[0];
const createObjectURL = window.createObjectURL || window.URL.createObjectURL || window.webkitURL.createObjectURL;
// 使用之前声明的 createObjectURL 函数创建一个临时 URL,将其赋值给 logoSrc 变量
this.logoSrc = createObjectURL(file);
}
}
};
</script>
<style lang="scss" scoped>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409eff;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
.canvas {
width: 200px;
height: 200px;
}
</style>
3.效果
4.解决引入报错问题
报错内容如下:
BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
原因:webpack5中移除了nodejs核心模块的polyfill自动引入,所以需要手动引入
安装如下插件
npm install node-polyfill-webpack-plugin
最后在vue.config.js中手动引入即可,如果项目没有vue.config.js可以自己创建一个,这样就算是最新版或者是旧版的jimp都可以运行了
const { defineConfig } = require('@vue/cli-service')
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')
module.exports = defineConfig({
configureWebpack: {
plugins: [new NodePolyfillPlugin()]
}
})
文章到此结束,希望对你有所帮助~