鸿蒙HarmonyOS应用开发:多码识别

2023-10-24 12:04

本文主要是介绍鸿蒙HarmonyOS应用开发:多码识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

华为HMS Core的扫码接口更适用于简单的个人使用。在商业环境,如货架、医用试管、图书馆书架等,常常遇到复杂的多码扫描需求,这时需要专业的扫码SDK。尽管当前市场上的主流商业SDK尚未支持鸿蒙HarmonyOS,但我们仍可以通过HTTP请求来调用扫码服务,满足在鸿蒙系统上的多码扫描需求。

准备工作

  1. 申请一个Dynamsoft Barcode Reader免费试用序列号。

  2. 安装Node.js依赖包。

    npm install barcode4nodejs express body-parser
    

使用Node.js搭建扫码服务

启动一个Express服务,监听3000端口,代码如下:

const express = require('express');
const path = require('path');
const fs = require('fs');
const app = express();
const http = require('http');
const server = http.createServer(app);
const bodyParser = require('body-parser');app.use(express.static('public'));
app.use('/node_modules', express.static(__dirname + '/node_modules'));
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));const port = process.env.PORT || 3000;server.listen(port, '0.0.0.0', () => {host = server.address().address;console.log(`Server running at http://0.0.0.0:${port}/`);
});

通过HTTP POST请求接收图片文件流:

app.post('/readbarcode', async (req, res) => {const data = req.body;let chunks = [];req.on('data', (chunk) => {chunks.push(chunk);});req.on('end', () => {let nodeBuffer = Buffer.concat(chunks);});
});

使用barcode4nodejs来实现服务端的扫码功能:

const dbr = require("barcode4nodejs")
dbr.initLicense("LICENSE-KEY")
dbr.decodeFileStreamAsync(nodeBuffer, nodeBuffer.length, dbr.formats.QRCode).then((results) => {let output = '';let index = 0;for (result of results) {output += index + ': ' + result['value'] + ' ';index += 1;}res.status(200).send(output);});

鸿蒙应用开发步骤

entry/src/main/module.json5文件中配置网络权限ohos.permission.INTERNET

{"module": {"name": "entry",..."abilities": [...],"requestPermissions": [{"name": "ohos.permission.INTERNET"}]}
}

在工程的rawfile目录中放入一张示例图片。

鸿蒙图片资源

程序启动的时候,我们把图片加载到内存中,用于显示以及后续的扫码请求。在entry/src/main/ets/pages/Index.ets中添加如下代码:

import http from '@ohos.net.http';
import image from '@ohos.multimedia.image';const context = getContext(this);
const resourceMgr = context.resourceManager;@Entry
@Component
struct Index {@State displayImage: any = undefined @State result: string = 'N/A'imageData: ArrayBuffer = undefinedhost: string = 'http://192.168.8.72:3000'text: string = 'https://devblogs.damingsoft.com/album/2023/10/multicode.jpg'onPageShow() {(async () => {const fileData = await resourceMgr.getRawFileContent('qrcode.jpg');this.imageData = fileData.buffer;const imageSource = image.createImageSource(this.imageData);imageSource.createPixelMap().then(pixelmap => {this.displayImage = pixelmap;});})();}build() {Scroll(this.scroller) {Column() {...Image(this.displayImage).width('100%').objectFit(ImageFit.Contain).margin({bottom: 5})Text(this.result).fontSize(16).textAlign(TextAlign.Start).fontWeight(FontWeight.Bold).backgroundColor(0xd2cab3)}.justifyContent(FlexAlign.Start).width('100%').height('100%').padding({left: 5, top: 5, right: 5, bottom: 5})}}
}

这里的host就是刚才启动的服务器地址。imageData是图片的二进制数据,displayImage是用于显示的PixelMap对象。result是扫码结果。

添加一个按钮来触发HTTP POST扫码请求:

Button('Read Multi QR Codes').backgroundColor('#007DFF').margin(15).onClick(() => {if (!this.imageData) return;let url = this.host + '/readbarcode'let httpRequest = http.createHttp();httpRequest.on('headersReceive', (header) => {console.info('header: ' + JSON.stringify(header));})httpRequest.request(url,{method: http.RequestMethod.POST,header: {'Content-Type': 'application/octet-stream'},extraData: this.imageData,}, (err, data) => {if (!err) {try {this.result = data.result.toString()} catch (error) {console.error("Error parsing JSON:", error);}} else {console.info('error:' + JSON.stringify(err));httpRequest.off('headersReceive');httpRequest.destroy();}});})

Content-Type设置成application/octet-streamextraData设置成图片的二进制数据。

鸿蒙二维码识别

为了方便在模拟器里测试不同的图片,我们再创建一个输入框用来输入图片URL,然后通过HTTP GET请求来获取图片数据:

TextArea({placeholder: 'https://devblogs.damingsoft.com/album/2023/10/multicode.jpg',
}).placeholderFont({ size: 16, weight: 400 }).width(336).height(56).margin(20).fontSize(16).fontColor('#182431').backgroundColor('#FFFFFF').onChange((value: string) => {this.text = value})Button('Get an image').backgroundColor('#007DFF').margin(15).onClick(() => {let httpRequest = http.createHttp();httpRequest.on('headersReceive', (header) => {console.info('header: ' + JSON.stringify(header));})httpRequest.request(this.text,{method: http.RequestMethod.GET,}, (err, data) => {if (!err) {if (data.result instanceof ArrayBuffer) {this.imageData = data.result as ArrayBufferconst imageSource = image.createImageSource(this.imageData);imageSource.createPixelMap().then(pixelmap => {this.displayImage = pixelmap;});}} else {console.info('error:' + JSON.stringify(err));httpRequest.off('headersReceive');httpRequest.destroy();}});})

最后我们测试一张包含多个二维码的图片:

鸿蒙多码识别程序

源代码

https://gitee.com/yushulx/harmonyos-multi-barcode-qrcode-scan

这篇关于鸿蒙HarmonyOS应用开发:多码识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275046

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”