vue2 实现解析二维码图片/二维码图片链接,区分企业微信二维码、个人微信二维码

vue2 实现解析二维码图片/二维码图片链接,区分企业微信二维码、个人微信二维码

企微和个微的区别:
企微二维码解析后会含有 work.weixin

解析二维码图片

  1. 首先安装、导入 jsqr 包

    npm i jsqr

    import jsqr from 'jsqr';

  2. 页面添加上传文件按钮,以及显示解析图片后的结果显示区域

    <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>
    
  3. 处理上传的图片文件函数

    // 处理文件上传事件
    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);
    }
    }
    
  4. 解析二维码图片函数

    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 = '未能解析二维码';
    }
    },
    

解析图片链接

  1. 页面添加填写图片链接的输入框和提交按钮

    <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>
    
  2. 将图片链接转换为图片的函数

    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>
  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值