【HarmonyOS】Stage模型二维码/条码生成与解析

HarmonyOS的官方API中提供了QRCode组件(QRCode-基础组件-组件参考(基于ArkTS的声明式开发范式)-ArkTS API参考-HarmonyOS应用开发),这个组件有个缺点只能用于显示二维码,无法显示条码与解析码内容,下面给大家介绍一个功能强大的三方库@ohos/zxing,效果如下。

cke_362.png

【开发步骤】

Gitee仓库中的示例代码很全,如果只是需要简单接入的话,可以精简一下代码。

一、引入三方库

首先,我们需要导入这个ohpm的组件库,可以参考demo中的命令行方式导入:

“ohpm install @ohos/zxing”

另一种方式是在oh-package.json5中配置,这边的版本选择的是2.0.0版本,配置如下:

 "dependencies": {"@ohos/zxing": "2.0.0"}

二、完成解析与生成相关代码

在src/main/ets目录下创建码解析与生成的工具类文件QRCode.ets

import {BarcodeFormat,MultiFormatWriter,BitMatrix,EncodeHintType,MultiFormatReader,DecodeHintType,RGBLuminanceSource,BinaryBitmap,HybridBinarizer
} from '@ohos/zxing';
import image from '@ohos.multimedia.image';export default class QRCode {constructor() {}async encode(content: string, params: {width: number,height: number,format?: BarcodeFormat}): Promise<image.PixelMap> {const {width,height,format=BarcodeFormat.QR_CODE} = paramsconst encodeHintTypeMap = new Map();// 设置二维码空白的宽度encodeHintTypeMap.set(EncodeHintType.MARGIN, 0);const writer: MultiFormatWriter = new MultiFormatWriter();let matrix: BitMatrix = writer.encode(content, format, width, height, encodeHintTypeMap);const PixelData = this.getMatrixPixelData(matrix, matrix.getWidth(), matrix.getHeight())return await image.createPixelMap(PixelData.buffer, {size: {width, height}})}async decode(image: image.PixelMap, params: {width: number,height: number,format?: BarcodeFormat}): Promise<string> {const {width,height,format=BarcodeFormat.QR_CODE} = paramslet num=image.getPixelBytesNumber()let arrayBuffer:ArrayBuffer=new ArrayBuffer(num);await image.readPixelsToBuffer(arrayBuffer)const int32Array=new Int32Array(arrayBuffer)const luminanceSource=new RGBLuminanceSource(int32Array,width,height)const binaryBitmap=new BinaryBitmap(new HybridBinarizer(luminanceSource))const reader=new MultiFormatReader()const hints=new Map();hints.set(DecodeHintType.POSSIBLE_FORMATS,[format]);reader.setHints(hints);let result=reader.decode(binaryBitmap);let text=result.getText();return text;}getMatrixPixelData(matrix, width, height) {const BLACK = 0xFF000000;const WHITE = 0xFFFFFFFF;const pixels = new Uint32Array(width * height);for (let y = 0; y < height; y++) {let offset = y * width;for (let x = 0; x < width; x++) {pixels[offset + x] = matrix.get(x, y) ? BLACK : WHITE;}}return pixels;}}

encode编码方法:根据输入的参数生成码的方法,可以通过传入不同的BarcodeFormat完成不同格式的码的生成。

decode解码方法:对image组件中图片的pixelMap,进行解码操作获取对应的码值

getMatrixPixelData:这个方法是将matrix转成PixelData,用于获取pixelMap的buffer,我们可以在这个方法中定义条码的颜色

三、使用工具类完成解析与生成

最后我们在page页中使用刚刚的方法就可以完成码的解析与生成功能。这边需要注意的是encode()和decode()方法都是耗时操作,我们使用async/await来进行异步处理操作

import { BarcodeFormat } from '@ohos/zxing';
import QRCode from '../util/QRCode'@Entry@Component
struct Index {@State message: string = 'Hello World'@State pixelMap: PixelMap = undefinedqrcode = new QRCode()async encode() {this.pixelMap = await this.qrcode.encode("this is barcode", {width: 260,height: 80,format: BarcodeFormat.CODE_128})}async decode() {try {this.message = await this.qrcode.decode(this.pixelMap, {width: 260,height: 80,format: BarcodeFormat.CODE_128})} catch (err) {console.log('[Demo] decode error:' + JSON.stringify(err));}}build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Image(this.pixelMap).width(260).height(80).margin(30)Button('生成一维码').fontSize(25).width(300).margin(20).onClick(() => {this.encode();})Button('解析一维码').fontSize(25).width(300).margin(20).onClick(() => {this.decode();})}.width('100%')}.height('100%')}}

上面代码中使用的码的格式是条码格式:BarcodeFormat.CODE_128,如果需要使用二维码也可以将这边的格式修改为:BarcodeFormat.QR_CODE

【最后】

至此我们就完成了Stage模型中条码生成与解析的基本操作,如果需要进一步自定义可以参考demo工程:OpenHarmony-TPC/zxing (gitee.com)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27314.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Distributed】分布式Ceph存储系统之相关应用

文章目录 一、创建 CephFS 文件系统 MDS 接口1. 服务端操作1.1 在管理节点创建 mds 服务1.2 查看各个节点的 mds 服务1.3 创建存储池&#xff0c;启用 ceph 文件系统1.4 查看mds状态1.5 创建用户 2. 客户端操作2.1 客户端要在 public 网络内2.2 在客户端创建工作目录2.3 在 cep…

xml.etree.ElementTree

python使用 xml.etree.ElementTree包的时候&#xff0c;对xml中的空标签进行了简写&#xff0c;想恢复成正常模式怎么弄

视频配音乐怎么制作?教你简单好用的配乐方法

在很多情况下&#xff0c;为视频配乐可以增强观众的情感体验&#xff0c;使观众更加投入到视频内容中。配乐可以增强视频的节奏和情感共鸣&#xff0c;使观众更容易理解和接受视频的信息。此外&#xff0c;配乐还可以为视频添加品味和风格&#xff0c;使其更具吸引力。教大家几…

基于Nginx的web集群项目

目录 nginx介绍代理集群 安装配置文件http 使用master和worker升级问题 基于域名的虚拟主机隐藏nginx的版本信息供别人下载的网站统计的信息的页面pv介绍 ngixn续nginx认证nginx的allow和denynginx限制并发数nginx限速限速的算法 nginx 限制请求数nginx 的 locationnginx 的 lo…

图片速览 Deep k-Means: Jointly clustering with k-Means and learning representations

本文探讨了联合聚类与学习的问题 交涉。正如之前的几项研究表明&#xff0c;学习 既忠实于要聚类和调整的数据的表示形式 到聚类算法可以导致更好的聚类性能&#xff0c;所有的 更重要的是&#xff0c;这两项任务是联合执行的。我们在这里提出这样一个 方法的k-基于连续重新参数…

阿里云使用SMC进行服务器迁移

操作文档 阿里云SMC适用于所有的可以公网访问的主机 1、资源准备 1、我们必须要要有相关AliyunSMCFullAccess的权限&#xff0c;如果操作RAM账号具有足够的权限可以自动授权 2、我们的源主机要可以公网访问&#xff0c;并且可以ssh且密码登录 2、在控制台点击迁移源 配置我们源…

机器学习 day28(模型评估)

为什么需要模型评估 我们可以借助图像来判断模型是否良好。但当我们用单一特征来绘制f(x)图像时&#xff0c;模型容易出现过拟合现象。但如果增加一些输入特征的种类&#xff0c;绘制图像又会变得很困难。而模型评估可以解决这一痛点。 模型评估 通常我们将数据集的一大半…

JavaWeb(6)——前端工程化(AJAX 和VUE入门)

一、AJAX快速入门 而原生的Ajax请求的代码编写起来还是比较繁琐的&#xff0c;所以接下来我们学习一门更加简单的发送Ajax 请求的技术Axios 。Axios是对原生的AJAX进行封装&#xff0c;简化书写。 Axios官网是&#xff1a;起步 | Axios 中文文档 | Axios 中文网 (axios-http.c…

[极客大挑战 2019]PHP(反序列化)

介绍说明&#xff0c;有备份的习惯&#xff0c;找常见的备份文件后缀名 使用dirsearch进行扫描 dirsearch -u http://f64378a5-a3e0-4dbb-83a3-990bb9e19901.node4.buuoj.cn:81/ -e php-e 指定网站语言 扫描出现&#xff0c;www.zip文件 查看index.php <?php include c…

力扣C++|一题多解之数学题专场(1)

目录 7. 整数反转 9. 回文数 12. 整数转罗马数字 13. 罗马数字转整数 29. 两数相除 7. 整数反转 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 -如果反转后整数超过 32 位的有符号整数的范围 [2^31, 2^31 -1] &#xff0c;就返回 0。…

智慧体育:冰壶比赛数字孪生

本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟。 Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎&#xff0c;它使用 JavaScript 语言编写&#xff0c;并且基于 OimoPhysics 引擎进行了改进和优化。Oimo.js 核心库只有 150K &#xff0c;专门用…

漏洞复现畅捷通CRM SQL注入

免责声明 术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用…