H5实现扫码读取二维码条形码功能(二维码+条形码)

这篇具有很好参考价值的文章主要介绍了H5实现扫码读取二维码条形码功能(二维码+条形码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要介绍二维码实现的原理

1、使用插件

npm install @zxing/library

2、主要用到 BrowserMultiFormatReader 这个构造函数,用于打开摄像头

import { BrowserMultiFormatReader } from "@zxing/library";
  1. 视图
<template>
  <div class="pageScan">
    <!-- <van-uploader :after-read="afterRead">
      <div class="item">相册</div>
    </van-uploader> -->
    <span class="fileinput-button">
      <span>相册</span>
      <input type="file" @change="fileChange" id="avatar" accept="image/*" />
    </span>
    <video ref="video" id="video" class="scanVideo" autoplay></video>
    <div class="scanner">
      <div class="box">
        <div class="line"></div>
        <div class="angle"></div>
      </div>
    </div>
  </div>
</template>
  1. 核心代码(以vue3写法举例)
<script setup>
import { defineComponent, reactive, onUnmounted, ref } from "vue";
import { useRouter } from "vue-router";
import { BrowserMultiFormatReader } from "@zxing/library";
import QrCode from "qrcode-decoder";
const form = reactive({
  loadingShow: false,
  scanText: "",
  vin: null,
  tipMsg: "尝试识别中...",
  tipShow: false,
});
const result = ref("");
const router = useRouter();

const codeReader = new BrowserMultiFormatReader();
const afterRead = (file) => {
  getUrl(file.file);
};
const fileChange = () => {
  // 获取dom 对象
  let file = document.getElementById("avatar");
  let resultFile = file?.files[0];
  console.log("resultFile", resultFile);
  getUrl(resultFile);
  // let reader = new FileReader();
  // reader.readAsText(resultFile, "UTF-8");
  // console.log("reader", reader);
};
const getUrl = (file) => {
  let qr = new QrCode();
  let url = getObjectURL(file);
  qr.decodeFromImage(url).then((res) => {
    //打印结果为 解析出来的 二维码地址
    // alert(`res.data ${res.data}`);
    if (res.data) {
      router.push({
        path: "/TransferAccout",
        query: { codeResult: res.data },
      });
    }
    // alert(`res.data====${res.data}`, res.data);
  });
};
const getObjectURL = (file) => {
  let url = null;
  if (window.createObjectURL !== undefined) {
    // basic
    url = window.createObjectURL(file);
  } else if (window.URL !== undefined) {
    // mozilla(firefox)
    url = window.URL.createObjectURL(file);
  } else if (window.webkitURL !== undefined) {
    // webkit or chrome
    url = window.webkitURL.createObjectURL(file);
  }
  return url;
};
const openScan = async () => {
  codeReader
    .getVideoInputDevices()
    .then((videoInputDevices) => {
      form.tipShow = true;
      form.tipMsg = "正在调用摄像头...";
      // console.log("videoInputDevices", videoInputDevices);
      // 默认获取第一个摄像头设备id
      let firstDeviceId = videoInputDevices[0].deviceId;
      // 获取第一个摄像头设备的名称
      const videoInputDeviceslablestr = JSON.stringify(
        videoInputDevices[0].label
      );
      if (videoInputDevices.length > 1) {
        // 判断是否后置摄像头
        if (videoInputDeviceslablestr.indexOf("back") > -1) {
          firstDeviceId = videoInputDevices[0].deviceId;
        } else {
          firstDeviceId = videoInputDevices[1].deviceId;
        }
      }
      decodeFromInputVideoFunc(firstDeviceId);
    })
    .catch((err) => {
      form.tipShow = false;
      // console.log(`失败出错: ${err}`);
    });
};
openScan();

const decodeFromInputVideoFunc = (firstDeviceId) => {
  codeReader.reset(); // 重置
  form.scanText = "";
  codeReader.decodeFromInputVideoDeviceContinuously(
    firstDeviceId,
    "video",
    (result, err) => {
      form.tipMsg = "正在尝试识别...";
      form.scanText = "";
      if (result) {
        console.log("扫描结果", result);
        result.value = result;
        // alert(`扫描结果${result.value}`);
        router.push({
          path: "/TransferAccout",
          query: { codeResult: result.value },
        });
        // form.scanText = result.text;
        form.scanText = result.getText();
        // alert(`form.scanText===${form.scanText}`);
        if (form.scanText) {
          form.tipShow = false;
        }
      }
      if (err && !err) {
        form.tipMsg = "识别失败";
        setTimeout(() => {
          form.tipShow = false;
        }, 2000);
        // console.error(err);
        // alert("err", err);
      }
    }
  );
};

//销毁组件
onUnmounted(() => {
  codeReader.reset();
  console.log("销毁组件");
});
</script>
  1. 二维码的样式
// 扫码组件
.scan-index-bar {
  background-image: linear-gradient(-45deg, #42a5ff, #59cfff);
}
.van-nav-bar__title {
  color: #fff !important;
}
.scanVideo {
  height: 80vh;
}
.scanTip {
  width: 100vw;
  text-align: center;
  margin-bottom: 10vh;
  color: white;
  font-size: 4vw;
}
.pageScan {
  overflow-y: hidden;
  background-color: #363636;
  width: 100vw;
  height: 100vh;
  position: relative;
  // :deep(.van-uploader) {
  //   z-index: 99;
  // }
  .item {
    display: inline-block;
    position: absolute;
    right: 10px;
    color: white;
    top: 10px;
    font-size: 16px;
    z-index: 99;
  }
}

.scanner {
  background-size: 3rem 3rem;
  background-position: -1rem -1rem;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 9;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
}
.scanner .box {
  width: 75vw;
  height: 75vw;
  max-height: 75vh;
  max-width: 75vh;
  position: relative;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  overflow: hidden;
  border: 0.1rem solid rgba(0, 255, 51, 0.2);
}
.scanner .line {
  height: calc(100% - 2px);
  width: 100%;
  background: linear-gradient(180deg, rgba(0, 255, 51, 0) 43%, #00ff33 211%);
  border-bottom: 3px solid #00ff33;
  transform: translateY(-100%);
  animation: radar-beam 2s infinite;
  animation-timing-function: cubic-bezier(0.53, 0, 0.43, 0.99);
  animation-delay: 1.4s;
}
.scanner .box:after,
.scanner .box:before,
.scanner .angle:after,
.scanner .angle:before {
  content: "";
  display: block;
  position: absolute;
  width: 3vw;
  height: 3vw;
  border: 0.2rem solid transparent;
}
.scanner .box:after,
.scanner .box:before {
  top: 0;
  border-top-color: #00ff33;
}
.scanner .angle:after,
.scanner .angle:before {
  bottom: 0;
  border-bottom-color: #00ff33;
}
.scanner .box:before,
.scanner .angle:before {
  left: 0;
  border-left-color: #00ff33;
}
.scanner .box:after,
.scanner .angle:after {
  right: 0;
  border-right-color: #00ff33;
}
@keyframes radar-beam {
  0% {
    transform: translateY(-100%);
  }
  100% {
    transform: translateY(0);
  }
}

.result {
  position: fixed;
  top: 20px;
  left: 20px;
  width: 50px;
  height: 50px;
  border-radius: 100%;
  background-color: rgba(0, 0, 0, 0.3);
  z-index: 999;
  display: flex;
  justify-content: center;
  align-items: center;
  color: #fff;
}
.fileinput-button {
  position: absolute;
  display: inline-block;
}

.fileinput-button input {
  position: absolute;
  right: 0px;
  top: 0px;
  opacity: 0;
}
.fileinput-button {
  span {
    font-size: 16px;
  }
  position: absolute;
  display: inline-block;
  overflow: hidden;
  z-index: 99;
  color: white;
  right: 8px;
  top: 8px;
  display: flex;
  align-items: center;
}

``文章来源地址https://www.toymoban.com/news/detail-514945.html

到了这里,关于H5实现扫码读取二维码条形码功能(二维码+条形码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C#中轻松实现二维码和条形码识别:OpenCvSharp和ZXing详细教程

    C#中轻松实现二维码和条形码识别:OpenCvSharp和ZXing详细教程

      概述: 本教程使用OpenCvSharp和ZXing库,详细介绍了在C#中识别二维码和条形码的步骤。通过导入必要的命名空间、加载图像,并使用ZXing库进行二维码和条形码的识别,提供了清晰的示例代码。这方便了开发人员在项目中集成二维码和条形码识别功能。 要使用OpenCvSharp来分别

    2024年03月09日
    浏览(18)
  • opencv检测二维码和条形码

    opencv检测二维码和条形码

    使用excel可以实现制作二维码,但只能实现做英文和数字类型的,步骤如下: 在任意单元格输入内容 选项卡里找到开发工具—插入—点击ActiveX控件的最右下角。 弹出的窗口内,往下滑动选择Microsoft BarCode Control 16.0后,点击确定。 在任意区域,摁住鼠标左键不放,拖动鼠标,

    2024年02月10日
    浏览(8)
  • 【MAUI】条形码,二维码扫描功能

    本系列文章面向移动开发小白,从零开始进行平台相关功能开发,演示如何参考平台的官方文档使用MAUI技术来开发相应功能。 移动端的扫描条形码、二维码的功能已经随处可见,已经很难找到一个不支持扫描的App了,但是微软的MAUI竟然没有提供,那么我们应该如何实现呢?

    2024年02月04日
    浏览(11)
  • java生成、识别条形码和二维码

    java生成、识别条形码和二维码

    使用 zxing 开源库 Zxing主要是Google出品的,用于识别一维码和二维码的第三方库 主要类: BitMatrix 位图矩阵 MultiFormatWriter 位图编写器 MatrixToImageWriter 写入图片 可以生成、识别条形码和二维码 内置三种尺寸: enum Size {SMALL, MIDDLE, BIG} 依赖 将宽度不等的多个黑条和白条,按照一定

    2024年02月08日
    浏览(11)
  • opencv实战--角度测量和二维码条形码识别

    opencv实战--角度测量和二维码条形码识别

    首先导入一个带有角度的照片 然后下面的代码注册了一个鼠标按下的回调函数, 还有一个点的数列,鼠标事件为按下的时候就记录点,并画出点,由于点是画在图像上面的,那么就要求了img是需要刷新的所以将他们放在while True里面 当有按键按下的的时候就把图片归为原来的

    2024年02月16日
    浏览(10)
  • Python Opencv实践 - 二维码和条形码识别

    Python Opencv实践 - 二维码和条形码识别

            使用pyzbar模块来识别二维码和条形码。ZBar是一个开源软件,用来从图像中读取条形码,支持多种编码,比如EAN-13/UPC-A、UPC-E、EAN-8、代码128、代码39、交错2/5以及二维码。         pyzbar是python封装ZBar的模块,我们用它来做条形码和二维码的识别。         安装方法:

    2024年02月04日
    浏览(9)
  • Python - OpenCV识别条形码、二维码(已封装,拿来即用)

    Python - OpenCV识别条形码、二维码(已封装,拿来即用)

    此代码可识别条形码和二维码,已封装好,拿来即用: 结果:

    2024年02月12日
    浏览(12)
  • 【C#】最全单据打印源码(打印模板、条形码&二维码、字体样式)

    【C#】最全单据打印源码(打印模板、条形码&二维码、字体样式)

    【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663 【C#】组件化开发,调用dll组件方法 本文链接

    2024年02月03日
    浏览(53)
  • openmv和STM32串口通信识别条形码、二维码(HAL库)

    openmv和STM32串口通信识别条形码、二维码(HAL库)

    因为自己的毕设用到了条形码识别,所以在这里写一篇关于使用openmv识别条形码和二维码并且与STM32实现串口通讯,希望能帮到以后用到这一模块的同学,STM32方面我使用的是STM32F103RCT6,并且使用HAL进行编写代码。 OpenMV端:由图知UART_RX—P5 ------ UART_TX—P4 2.STM32端:这里我使用

    2023年04月13日
    浏览(13)
  • 如何使用h5-scan-qrcode插件实现一个h5页面扫码识别二维码功能

    如何使用h5-scan-qrcode插件实现一个h5页面扫码识别二维码功能

    为了适应公司代码全程使用jquery构造 如需其他js或者vue 可根据此代码去改(因为好多地方会用到这个东西所以我封装成了一个js文件) https://dragonir.github.io/h5-scan-qrcode/#/ 这个是效果 可以提前看一下~ 我做的比这个效果多一个拿取本地图库的二维码扫码 scancode ---- html文件 如何

    2024年02月06日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包