基于 ZXing 的 Vue 在线条形码扫描器实现

简介: 本文详解“在线条形码扫描器”的JavaScript实现:基于ZXing库,支持图片上传与实时摄像头扫描,统一管理状态、解码、结果归一化及一键复制,逻辑清晰、轻量易用。

这篇文章只讲本项目里“在线条形码扫描器”工具的功能 JavaScript 实现。它的目标很直接:让用户通过上传图片或调用摄像头,识别常见条形码内容,并把结果整理成可复制的文本。

在线工具网址:https://see-tool.com/barcode-scanner
工具截图:
工具截图.png

整个实现可以拆成 5 段:状态组织、扫描器初始化、图片识别、摄像头识别、结果整理与复制。

1)先围绕“扫描流程”组织状态

这个工具的前端状态不复杂,核心就是把一次扫描过程拆开管理:

  • activeTab:当前是图片上传还是摄像头扫描
  • fileInput:文件选择框引用
  • videoElement:摄像头视频元素引用
  • isCameraActive:摄像头是否已开启
  • results:扫描结果列表
  • copiedIndex:当前已复制的是哪一条结果
  • codeReader:条形码解码实例

这样做的好处是,上传、扫描、展示、复制这几段逻辑彼此独立,但都围绕同一份数据流运行。

2)扫描器实例只在浏览器端初始化

识别能力来自 @zxing/library 提供的 BrowserMultiFormatReader。页面挂载后再创建实例,页面卸载时顺手关闭摄像头。

let codeReader = null;

onMounted(() => {
   
  if (process.client) {
   
    codeReader = new BrowserMultiFormatReader();
  }
});

onUnmounted(() => {
   
  stopCamera();
});

这里的关键点不是“创建一个对象”,而是让识别器的生命周期和页面保持一致,避免用户离开页面后摄像头还占着。

3)图片识别是“文件 -> Base64 -> Image -> 解码结果”

上传和拖拽最终都会进入同一套处理逻辑。先判断文件是不是图片,再逐个读取。

const handleFiles = (files) => {
   
  if (!files || files.length === 0) return;

  Array.from(files).forEach((file) => {
   
    if (file.type.startsWith("image/")) {
   
      scanImageFile(file);
    }
  });
};

真正的识别过程分两步:

  1. FileReader 把本地图片读成 Data URL
  2. 创建 Image 对象,等图片加载完成后交给 ZXing 解码
const scanImageFile = (file) => {
   
  if (!codeReader) return;

  const reader = new FileReader();
  reader.onload = (e) => {
   
    const img = new Image();
    img.onload = () => {
   
      codeReader
        .decodeFromImageElement(img)
        .then((result) => {
   
          addResult(file.name, result.text, result.format);
        })
        .catch(() => {
   
          addResult(file.name, "未识别到条形码", "error");
        });
    };
    img.src = e.target.result;
  };
  reader.readAsDataURL(file);
};

这条链路的重点是:页面并不是直接“上传文件就扫”,而是先把文件转换成浏览器可处理的图像对象,再统一交给解码器。

4)摄像头识别是持续监听视频帧

和图片扫描一次不同,摄像头模式是持续从视频流中取帧,再不断尝试解码。

const startCamera = () => {
   
  if (!codeReader) return;
  isCameraActive.value = true;

  codeReader
    .decodeFromVideoDevice(null, videoElement.value, (result) => {
   
      if (result) {
   
        addResult("摄像头扫描", result.text, result.format);
      }
    })
    .catch(() => {
   
      isCameraActive.value = false;
    });
};

这里用了 decodeFromVideoDevice。它不是返回一次结果就结束,而是不断回调:

  • 当前帧识别到了条码,就立刻写入结果列表
  • 当前帧没识别到,就继续等下一帧

关闭摄像头时则统一调用重置方法:

const stopCamera = () => {
   
  if (codeReader) {
   
    codeReader.reset();
  }
  isCameraActive.value = false;
};

这样上传模式和摄像头模式可以随时切换,不会互相干扰。

5)结果要做一次归一化,方便展示和复制

解码器返回的原始结果里,最重要的是两部分:

  • text:条形码实际内容
  • format:条码格式

工具不会把原始对象直接丢给界面,而是先整理成统一结构:

const addResult = (source, content, format) => {
   
  const isError = format === "error";
  let formatName = format;

  if (!isError && typeof format === "number") {
   
    formatName = getFormatName(format);
  } else if (format && format.formatName) {
   
    formatName = format.formatName;
  }

  results.value.unshift({
   
    source,
    content,
    format: isError ? "" : String(formatName),
    isError,
  });
};

其中 getFormatName 的作用,是把数字格式码转换成更直观的名字,例如 CODE_128EAN_13UPC_A。这样用户看到结果时,不只是拿到内容,也能知道识别出的条码属于哪一类。

结果区还支持两个常用动作:

  • clearResults():清空历史结果
  • copyToClipboard():把指定结果复制到剪贴板
const copyToClipboard = async (text, index) => {
   
  await navigator.clipboard.writeText(text);
  copiedIndex.value = index;
  setTimeout(() => {
   
    copiedIndex.value = -1;
  }, 2000);
};

这段逻辑很轻,但很实用。对用户来说,识别完成不是终点,复制出去继续使用才是完整闭环。

6)这套功能 JS 的核心思路

这个工具的实现,本质上就是一条很清晰的数据链:

选择输入方式 -> 获取图片或视频帧 -> ZXing 解码 -> 统一整理结果 -> 复制或清空

从实现角度看,真正的重点不是界面,而是把“上传图片识别”和“摄像头实时识别”这两条路径收拢到同一套结果模型里。这样工具既容易维护,也能让普通用户用最少操作完成条形码识别。

相关文章
|
3月前
|
数据采集 人工智能 运维
AgentRun 实战:快速构建 AI 舆情实时分析专家
搭建“舆情分析专家”,函数计算 AgentRun 快速实现从数据采集到报告生成全自动化 Agent。
958 58
|
17天前
|
存储 JavaScript 前端开发
URL编码/解码 核心JS实现
这是一款基于Vue开发的轻量级URL编码/解码在线工具,纯前端实现,无需依赖外部库。利用`encodeURI`/`encodeURIComponent`及对应解码方法,支持一键编码、解码、清空与复制,并自动聚焦输入框,提升使用效率。
222 3
|
9小时前
|
Ubuntu 机器人 API
【保姆级教程】OpenClaw多Agent部署路由实战指南:全平台部署+飞书群绑定+阿里云百炼API配置指南
2026年,OpenClaw的多Agent协同能力已成为核心竞争力——通过创建不同角色的Agent(如办公助理、技术支持、数据分析师),可实现“专人专事”的高效协作。但多数用户在落地时遭遇两大痛点:一是“身份错位”,Agent在飞书群等渠道回复时身份混淆,消息未路由到对应Agent;二是“配置失效”,手动添加字段导致Gateway报错,整个路由规则瘫痪。
64 1
|
1天前
|
人工智能 Linux API
【养“龙虾”🦞教程】10分钟上手OpenClaw:全平台部署(阿里云/Win11/MacOS/Linux)+API配置+Skill安装+避坑指南
“听说OpenClaw能自动干活,兴冲冲部署完,却只会让它陪聊?”——这是2026年无数“龙虾养殖户”(OpenClaw用户昵称)的入门困境。其实OpenClaw的核心魅力不在基础对话,而在Skills(技能)生态——就像给“龙虾”装APP,装上之后就能自动查资料、整理文件、处理PDF、总结内容,真正实现“解放双手”。
134 24
|
1天前
|
人工智能 安全 Linux
【安全安心养“AI小龙虾🦞”手册】OpenClaw保姆级部署步骤、阿里云百炼API配置与安全Skill清单及避坑指南
2026年,OpenClaw(国内开发者昵称“AI小龙虾”,曾用名Clawdbot)作为开源AI智能体框架,凭借“本地可控+功能可扩展”的核心优势,成为越来越多用户的高效助手。其能通过自然语言指令自主完成文件处理、代码管理、信息采集等任务,但伴随ClawHub插件市场的快速扩张,恶意插件投毒、权限滥用、公网暴露等安全风险也随之凸显——2026年初的ClawHavoc安全事件中,341个恶意插件被植入木马,专门窃取用户凭证和加密货币钱包,工信部也已正式发布相关安全预警。
122 23
|
1天前
|
人工智能 数据挖掘 Linux
小龙虾 AI 🦞OpenClaw+Skills重构科研工作流,阿里云/本地零基础部署、科研 Skill 开发应用指南
在科研工作的全流程中,文献检索、数据整理、论文撰写等重复性工作往往占据了研究者80%的时间,真正用于创新思考的精力被大幅压缩。传统聊天式AI难以解决科研场景中的实际执行问题,而OpenClaw作为一款面向执行的智能体框架,搭配可自定义的Skills技能模块,构建起了科研全流程自动化的完整体系,实现了从“自然语言指令”到“实际任务执行”的闭环。不同于传统工具的单一功能,OpenClaw能够自主规划任务步骤、调度各类Skills,将研究者从繁琐的机械劳动中解放出来,聚焦于科研核心的创新与思考环节。本文将从OpenClaw与Skills的核心价值出发,详解2026年新手零基础下阿里云及本地多系统的部
133 22
|
4天前
|
人工智能 API 开发工具
【OpenClaw进阶保姆级教程】AI 编程效率翻倍!1分钟部署OpenClaw+集成Claude-Mem+Superpowers插件及避坑指南
AI编程助手的两大痛点始终困扰开发者:写代码时"转头就忘",跨会话重复踩坑;开发时缺乏工程思维,跳过设计、测试直接堆砌代码,最终产出一堆难以维护的"一次性代码"。2026年,Claude Code生态的两款神级插件——Claude-Mem(持久记忆插件)与Superpowers(工程化工作流插件),精准补上这两大短板,让AI编程助手从"好用"升级为"真正可靠的开发伙伴"。
494 5
|
1天前
|
缓存 负载均衡 Linux
Linux内核驱动开发的技术核心精要
本文精讲嵌入式Linux驱动开发五大核心:并发同步(自旋锁/mutex等)、中断分层(顶/底半部与亲和性)、DMA内存管理(一致性/流式映射与屏障)、设备树与驱动模型、调试移植技巧(ftrace/kgdb等),适配Linux 6.13新特性,助力开发者写出健壮高效驱动。(239字)
296 163
|
7天前
|
JavaScript 流计算
个人所得税计算器 在线工具分享
每月工资到手多少?个税怎么算?这款Vue开发的在线个税计算器,无需下载,输入税前工资、五险一金及专项附加扣除,秒算应纳税额与税后收入,助你谈薪、跳槽、预算更从容!
85 7
|
1天前
|
人工智能 Linux API
【养虾 AI 🦞指南】OpenClaw阿里云/本地零基础保姆级部署手册 +大模型api配置、Skills应用及常见问题解答
OpenClaw作为一款可执行型AI智能体框架,区别于传统对话式AI的核心优势在于能够通过挂载Skills技能模块实现各类实际任务的自动化执行,从网页数据爬取、文档编辑到工作流搭建、数据分析,覆盖办公与研究的多类场景。2026年最新版本的OpenClaw进一步降低了部署与使用门槛,同时ClawHub生态中的Skills数量与功能持续丰富,掌握其部署方法与核心Skills的应用逻辑,能够大幅提升工作效率。本文将从基础环境准备出发,详细讲解2026年新手零基础下阿里云云端部署、MacOS/Linux/Windows11本地部署OpenClaw的完整步骤,同步说明阿里云百炼免费大模型API的配置方法
140 20

热门文章

最新文章