vue2 实现解析二维码图片/二维码图片链接,区分企业微信二维码、个人微信二维码
企微和个微的区别:
企微二维码解析后会含有 work.weixin
解析二维码图片
-
首先安装、导入 jsqr 包
npm i jsqr
import jsqr from 'jsqr';
-
页面添加上传文件按钮,以及显示解析图片后的结果显示区域
<div class="image-box"> <h4>解析图片:</h4> <el-input type="file" @change="handleFileChange" size="mini" style="width: 200px;" /> </div> <canvas ref="canvas" style="display: none;"></canvas> <div v-if="decodedText"> <p>解析结果: {{ decodedText }}</p> </div>
-
处理上传的图片文件函数
// 处理文件上传事件 handleFileChange(event) { // 获取上传的第一个文件 const file = event.target.files[0]; // 如果文件存在,则进行处理 if (file) { // 创建一个 FileReader 对象,用于读取文件内容 const reader = new FileReader(); // 设置 FileReader 的 onload 事件处理函数 // 当 FileReader 读取完成时,会调用此函数 reader.onload = () => { // 创建一个 Image 对象,用于显示图片 const img = new Image(); // 设置 Image 的 onload 事件处理函数 // 当图片加载完成时,会调用此函数 img.onload = () => { // 调用 decodeQRCode 函数,解析二维码 this.decodeQRCode(img); }; // 设置 Image 的 src 属性为 FileReader 读取的结果 // 即将文件内容转换为 Data URL,作为图片的源 img.src = reader.result; }; // 调用 FileReader 的 readAsDataURL 方法,读取文件内容 // 并将其转换为 Data URL reader.readAsDataURL(file); } }
-
解析二维码图片函数
decodeQRCode(image) { // 获取 canvas 元素,该元素应该在模板中定义并使用 ref 绑定 const canvas = this.$refs.canvas; // 获取 canvas 的 2D 绘图上下文,用于在 canvas 上绘制图像 const context = canvas.getContext('2d'); // 设置 canvas 的宽度为图像的宽度 canvas.width = image.width; // 设置 canvas 的高度为图像的高度 canvas.height = image.height; // 将图像绘制到 canvas 上,从 (0, 0) 位置开始绘制 context.drawImage(image, 0, 0); // 获取 canvas 上指定区域的图像数据,这里获取整个 canvas 的图像数据 const imageData = context.getImageData(0, 0, canvas.width, canvas.height); // 使用 jsQR 库解码图像数据,获取二维码信息 const code = jsqr(imageData.data, canvas.width, canvas.height); // 判断是否成功解码二维码 if (code) { // 如果解码成功,将解码后的数据存储到 decodedText 属性中 this.decodedText = code.data; } else { // 如果解码失败,设置 decodedText 属性为错误信息 this.decodedText = '未能解析二维码'; } },
解析图片链接
-
页面添加填写图片链接的输入框和提交按钮
<div class="url-box"> <h4>解析图片链接:</h4> <el-input v-model="imageUrl" placeholder="输入图片链接" size="mini" style="width: 200px;margin-right: 20px;" /> <el-button type="success" @click="convertUrlToFile" size="mini" >转换为文件并处理</el-button > </div>
-
将图片链接转换为图片的函数
async convertUrlToFile() { // 如果 imageUrl 为空,则提示用户输入图片链接 if (!this.imageUrl) { this.decodedText = '请输入图片链接'; // 设置提示信息 return; // 结束函数执行 } try { // 使用 axios 发起 GET 请求以获取图片数据 const response = await axios({ url: this.imageUrl, // 请求的 URL method: 'GET', // 请求方法为 GET responseType: 'blob', // 指定响应数据类型为 Blob (二进制大对象) }); // 将获取到的 Blob 数据转换为 File 对象 const file = new File([response.data], 'image.jpg', { type: 'image/jpeg' }); // 模拟一个 input 的 change 事件,将生成的 File 对象传递给 handleFileChange 方法 this.handleFileChange({ target: { files: [file] } }); } catch (error) { // 处理请求失败或其他错误,并显示错误信息 this.decodedText = '图片处理失败: ' + error.message; } },
完整代码:
<template>
<div class="container">
<div class="url-box">
<h4>解析图片链接:</h4>
<el-input
v-model="imageUrl"
placeholder="输入图片链接"
size="mini"
style="width: 200px;margin-right: 20px;"
/>
<el-button type="success" @click="convertUrlToFile" size="mini"
>转换为文件并处理</el-button
>
</div>
<div class="image-box">
<h4>解析图片:</h4>
<el-input
type="file"
@change="handleFileChange"
size="mini"
style="width: 200px;"
/>
</div>
<canvas ref="canvas" style="display: none;"></canvas>
<div v-if="decodedText">
<p>解析结果: {{ decodedText }}</p>
</div>
</div>
</template>
<script>
import jsqr from "jsqr";
import axios from "axios";
export default {
data() {
return {
decodedText: null,
imageUrl: "", // 图片链接
downloadStatus: "", // 下载状态
};
},
methods: {
async convertUrlToFile() {
// 如果 imageUrl 为空,则提示用户输入图片链接
if (!this.imageUrl) {
this.decodedText = "请输入图片链接"; // 设置提示信息
return; // 结束函数执行
}
try {
// 使用 axios 发起 GET 请求以获取图片数据
const response = await axios({
url: this.imageUrl, // 请求的 URL
method: "GET", // 请求方法为 GET
responseType: "blob", // 指定响应数据类型为 Blob (二进制大对象)
});
// 将获取到的 Blob 数据转换为 File 对象
const file = new File([response.data], "image.jpg", {
type: "image/jpeg",
});
// 模拟一个 input 的 change 事件,将生成的 File 对象传递给 handleFileChange 方法
this.handleFileChange({ target: { files: [file] } });
} catch (error) {
// 处理请求失败或其他错误,并显示错误信息
this.decodedText = "图片处理失败: " + error.message;
}
},
// 处理文件上传事件
handleFileChange(event) {
// 获取上传的第一个文件
const file = event.target.files[0];
// 如果文件存在,则进行处理
if (file) {
// 创建一个 FileReader 对象,用于读取文件内容
const reader = new FileReader();
// 设置 FileReader 的 onload 事件处理函数
// 当 FileReader 读取完成时,会调用此函数
reader.onload = () => {
// 创建一个 Image 对象,用于显示图片
const img = new Image();
// 设置 Image 的 onload 事件处理函数
// 当图片加载完成时,会调用此函数
img.onload = () => {
// 调用 decodeQRCode 函数,解析二维码
this.decodeQRCode(img);
};
// 设置 Image 的 src 属性为 FileReader 读取的结果
// 即将文件内容转换为 Data URL,作为图片的源
img.src = reader.result;
};
// 调用 FileReader 的 readAsDataURL 方法,读取文件内容
// 并将其转换为 Data URL
reader.readAsDataURL(file);
}
},
decodeQRCode(image) {
// 获取 canvas 元素,该元素应该在模板中定义并使用 ref 绑定
const canvas = this.$refs.canvas;
// 获取 canvas 的 2D 绘图上下文,用于在 canvas 上绘制图像
const context = canvas.getContext("2d");
// 设置 canvas 的宽度为图像的宽度
canvas.width = image.width;
// 设置 canvas 的高度为图像的高度
canvas.height = image.height;
// 将图像绘制到 canvas 上,从 (0, 0) 位置开始绘制
context.drawImage(image, 0, 0);
// 获取 canvas 上指定区域的图像数据,这里获取整个 canvas 的图像数据
const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
// 使用 jsQR 库解码图像数据,获取二维码信息
const code = jsqr(imageData.data, canvas.width, canvas.height);
// 判断是否成功解码二维码
if (code) {
// 如果解码成功,将解码后的数据存储到 decodedText 属性中
this.decodedText = code.data;
} else {
// 如果解码失败,设置 decodedText 属性为错误信息
this.decodedText = "未能解析二维码";
}
},
},
};
</script>
<style>
.container {
width: 700px;
height: 300px;
margin: 0 auto;
border: 1px dashed #ddd;
border-radius: 10px;
}
.url-box {
margin-left: 200px;
margin-top: 50px;
text-align: left;
}
.image-box {
text-align: left;
margin-left: 200px;
}
</style>