H5扫描条形码

该博客介绍了如何在H5中利用zbar.wasm库进行条形码扫描。首先,通过npm安装zbar.wasm和file-loader。接着,配置vue.config.js以解析wasm文件。然后,初始化并设置视频元素以适应屏幕尺寸,并使用zbar.wasm进行扫码。在扫描过程中,对视频流进行处理,识别条形码,并在画布上绘制识别结果。整个过程实现了实时的条形码扫描功能。
该文章已生成可运行项目,

H5扫描条形码

参考链接:https://www.npmjs.com/package/zbar.wasm

安装 zbar.wasm

npm i zbar.wasm

安装file-loader 解析 wasm文件

npm i file-loader

配置vue.config.js文件

  chainWebpack(config) {
   config.module
      .rule('wasm')
      .test(/\.bin$/)
      .type('javascript/auto')
      .use('file-loader')
      .loader('file-loader')
      .end()
  }

使用 zbar.wasm扫码条形码
引入zbar.wasm

const { scanImageData } = require('zbar.wasm');

设置扫码时间

const SCAN_PROID_MS = 800;

根据可视化页面高度重置video高度

	const handleResize = () => {
		const width = document.documentElement.clientWidth;
		const height = document.documentElement.clientHeight;
		const videos = document.querySelector('video');
		videos.style.width="100%"
		videos.style.height="100%"
		videos.style.objectFit="fill"
		const canvas = document.querySelector('canvas');
		canvas.width = video.videoWidth;
		canvas.height = video.videoHeight;
		if (width / video.videoWidth < height / video.videoHeight) {
			canvas.style.width = '100vw';
			canvas.style.height = 'auto';
		} else {
			canvas.style.width = 'auto';
			canvas.style.height = '100vh';
		}
	};

初始化

	const init = async () => {	
	window.onresize = handleResize;
		const mediaStream = await navigator.mediaDevices.getUserMedia({
			audio: false,
			video: {
				facingMode: 'environment', //强制使用后置摄像头
				//facingMode: "user" , //强制使用前置摄像头
				width: { ideal: 1280 },  // 建议1280*720分辨率,分辨率大小跟扫描结果快慢有关系
				height: { ideal: 720 }
			}
		});
		const video =  document.querySelector('video');
		video.srcObject = mediaStream;
		video.setAttribute('playsinline', '');
		video.play();
		await new Promise(r => {
			video.onloadedmetadata = r;
		});
		handleResize();
	};
	const render = (symbols) => {
		const canvas = document.querySelector('canvas');
		const ctx = canvas.getContext('2d');
		const width = canvas.width;
		const height = canvas.height;
		ctx.clearRect(0, 0, width, height);
		ctx.font = '20px serif';
		ctx.strokeStyle = '#00ff00';
		ctx.fillStyle = '#ff0000';
		ctx.lineWidth = 6;
		for (let i = 0; i < symbols.length; ++i) {
			const sym = symbols[i];
			const points = sym.points;
			ctx.beginPath();
			for (let j = 0; j < points.length; ++j) {
				const {
					x,
					y
				} = points[j];
				if (j === 0) {
					ctx.moveTo(x, y);
				} else {
					ctx.lineTo(x, y);
				}
			}
			ctx.closePath();
			ctx.stroke();
			ctx.fillText('#' + i, points[0].x, points[0].y - 10);
			const video = document.querySelector('video');
			video.load()
			this.$emit('scans', sym.decode())
		}
	};
const scan = async () => {
	const canvas = document.createElement('canvas');
	const video = document.querySelector('video');
	const width = video.videoWidth;
	const height = video.videoHeight;
	canvas.width = width;
	canvas.height = height;
	const ctx = canvas.getContext('2d');
	ctx.drawImage(video, 0, 0, width, height);
	const imgData = ctx.getImageData(0, 0, width, height);
	const res = await scanImageData(imgData);
	render(res);
};
	const sleep = ms => new Promise(r => {
		setTimeout(r, ms)
	});
	const main = async () => {
		try {
			await init();
			while (true) {
				await scan();
				await sleep(SCAN_PROID_MS);
			}
		} catch (err) {
		
		}
	};

调用

main()
本文章已经生成可运行项目
### 实现 Vue H5 页面条形码扫描功能 为了在 Vue H5 项目中集成条形码扫描功能,可以利用 `html5plus` 提供的 API 来访问设备摄像头并执行条形码或二维码扫描操作[^1]。 #### 安装依赖 如果使用的是基于 HTML5+ 的开发环境(如 DCloud),则无需额外安装任何 npm 包来支持原生能力调用。只需确保应用构建工具配置正确即可处理 html5plus 插件。 #### 初始化 Html5Plus 扫描器 当页面加载完成之后初始化 Html5Plus 对象,并准备调用其提供的方法来进行实际的操作: ```javascript import { onMounted } from 'vue'; export default { setup() { let barcode; const initBarcodeScanner = () => { plus.barcode.scan( function (result) { console.log('Scan result:', result); alert(`扫码结果:${result}`); }, function (error) { console.error('Failed to scan', error.message || error.code); } ); }; onMounted(() => { if (!window.plus) { document.addEventListener('plusready', initBarcodeScanner, false); } else { initBarcodeScanner(); } }); return {}; }, }; ``` 这段代码展示了如何监听 `plusready` 事件以确保仅在 Html5Plus SDK 加载完毕后再尝试启动扫描过程。 #### 自定义样式调整 对于希望自定义界面布局的情况,比如实现半屏显示而非全屏覆盖的效果,可以通过修改 CSS 或者通过特定属性控制视窗大小以及位置等特性来达成目的[^4]。然而具体实现细节取决于所使用的框架版本及其文档说明。 #### 使用 Dynamsoft Barcode Reader 进行高级定制 除了上述基础方案外,还可以考虑引入第三方如 Dynamsoft Barcode Reader (DBR),这允许开发者更灵活地调整性能参数,例如选择不同的模板 (`speed`, `balance`, `coverage`) 来平衡识别速度与准确性需求[^2]。 ```javascript await scanner.updateRuntimeSettings("balance"); // 开始扫描... scanner.startScanning(); ``` 以上介绍了几种方式可以在 Vue 构建的应用程序里加入条形码读取的能力,无论是简单的即开即扫还是带有更多选项配置的需求都能得到满足。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值