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

news2025/1/18 8:55:09

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} = params
   const 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} = params
   let 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 = undefined
 qrcode = 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.coloradmin.cn/o/755189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【hadoop】部署hadoop的伪分布模式

hadoop的伪分布模式 伪分布模式的特点部署伪分布模式hadoop-env.shhdfs-site.xmlcore-site.xmlmapred-site.xmlyarn-site.xml对NameNode进行格式化启动Hadoop 对部署是否完成进行测试免密码模式免密码模式的原理&#xff08;重要&#xff09;免密码模式的配置 伪分布模式的特点…

Linux离线环境Jenkins部署SpringBoot

Jenkins服务器 把Jar包上传到Linux服务器的/jenkins/目录下 Dashboard----》新建任务----》构建一个自由风格的软件项目----》test 修改jenkins工作空间 新建构建前执行命令stop.sh&#xff0c;停止SpringBoot并备份 &#xff08;这里是目标服务器&#xff0c;即部署项目的…

2.3 移动次数计算和静态链表

1. 元素移动次数计算问题 本问题针对顺序表, 因为链表不需要移动元素, 只需要重新连接指针即可. 题型一: 计算在某个位置上插入一个新元素会导致多少元素的移动. 题型二: 计算在每个位置上插入一个元素所导致的平均移动次数. 先计算每个位置上插入的概率, 一般是1/n, 平均移…

vue Router(v3.x) 路由传参的三种方式详解

文章目录 前言一&#xff0c;params 传参&#xff08;显示参数&#xff09;注意&#xff1a; 响应路由参数的变化 二&#xff0c;params 传参&#xff08;不显示参数&#xff09;注意&#xff1a;上述这种利用 params 不显示 url 传参的方式会导致在刷新页面的时候&#xff0c;…

【HCIA】10.VLAN间通信

VLAN间通信的解决方法 使用路由器的物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access。路由器的一个物理接口作为一个VLAN的网关&#xff0c;因此…

即视角|出海资本热土——印尼市场洞察(下)

即视角Insight 共享即构新洞察&#xff0c;共建行业新动能——ZEGO即构科技基于音视频技术领域的多年深耕&#xff0c;综合面向各行业的服务经验&#xff0c;在【即视角】栏目发布即构对行业的洞察。 在《即视角&#xff5c;出海资本热土——印尼市场洞察&#xff08;上&…

WIFI鉴权的过程

1.前言 当今手机连接WIFI热点普遍采用WPA2-PSK的方式。本文讨论这个方式的鉴权过程。 2. 鉴权过程 我们称需要连接的一方为station&#xff0c;简称STA。提供WIFI热点的一方为AP。 连接之前, station需要知道AP的名字&#xff08;ssid&#xff09;和密码(PSK)。 定义 &#x…

Openlayers实战:多地图底图切换

在实际的地图项目中,不管是我们看到的百度地图还是高德地图等,都会有地图切换这一项。 在Openlayers实战中,我们用三种地图做demo,分别是谷歌地图。Openstreetmap,stamen地图。 切换的主要原则是设置三个底图层,设定其显示状态,用到了visible这一个属性。 效果图 源代码…

更新补丁导致360随身wifi提示USB设备驱动异常

运行环境&#xff1a;Windows11 更新补丁版本&#xff1a;2023-适用于 Windows 11 的 07 累积更新&#xff0c;适合基于 x64 的系统 (KB5028182) 硬件版本&#xff1a;360随身wifi-3 错误提示&#xff1a;USB设备驱动异常&#xff0c;创建Wifi网络失败 采取措施&#xff1a;更新…

Openlayers实战:加载Bing地图

Bing地图在地图领域有一定的江湖地位,是微软公司的产品。 在Openlayers其内置了Bing地图的方法,可以研究其API。我们的实战中是要其成为一个底图,很简单的就可以加载出来。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版…

ELK 企业级日志分析系统(四)

ELK 一、部署Kafka集群二、Kafka的命令行操作三、Kafka架构深入四、FilebeatKafkaELK部署 一、部署Kafka集群 1.下载安装包 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html cd /opt wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.7.1/kafka_2…

Halcon会慢慢被淘汰吗?

作为一个语言模型&#xff0c;我不能提供预测未来的确凿答案。然而&#xff0c;我可以提供一些关于Halcon和机器视觉市场的观察和趋势。 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 Halcon是一款商业机器视觉软件&#xff0c;具有广泛的应用和用户群…

“AI in the Alps“:身体与精神的一场盛宴

作者&#xff1a;Christofer Dutz 得益于 Timecho 的组织和安排&#xff0c;我最近参加了一个精彩绝伦的活动 “AI in the Alps”&#xff0c;并从中收获颇丰。 这次活动是由德国工业界知名博客 “Industrial AI Podcast”&#xff08;http://aipod.de&#xff09;的组织者 Ro…

metersphere数据库SQL断言应用

在使用metersphere的时候&#xff0c;需要查询数据库数据来验证接口是否正常&#xff0c;在查看使用手册时&#xff0c;发现不是很明确&#xff0c;在研究一点时间后&#xff0c;终于明白&#xff0c;在此写下心得。 metersphere使用手册地址&#xff1a;接口测试 - 接口用例操…

【探索AI未来】人工智能技术在软件开发中的应用与革新

自我介绍⛵ &#x1f4e3;我是秋说&#xff0c;研究人工智能、大数据等前沿技术&#xff0c;传递Java、Python等语言知识。 &#x1f649;主页链接&#xff1a;秋说的博客 &#x1f4c6; 学习专栏推荐&#xff1a;人工智能&#xff1a;创新无限、MySQL进阶之路、C刷题集、网络安…

第一个Matplotlib绘图程序

本节学习第一个 Matplotlib 绘图程序&#xff0c;如何使用 Matplotlib 绘制一个简单的折线图。下面绘制一个简单正弦曲线图&#xff0c;它显示了角度与正弦函数值之间的关系。 第一个绘图程序 首先导入 Matplotlib 包中的 Pyplot 模块&#xff0c;并以 as 别名的形式简化引入…

【C#】并行编程实战:同步原语(4)

在第4章中讨论了并行编程的潜在问题&#xff0c;其中之一就是同步开销。当将工作分解为多个工作项并由任务处理时&#xff0c;就需要同步每个线程的结果。线程局部存储和分区局部存储&#xff0c;某种程度上可以解决同步问题。但是&#xff0c;当数据共享时&#xff0c;就需要用…

使用 EMQX 和 eKuiper 进行 MQTT 流处理:快速教程

引言 MQTT 协议是一种专为物联网应用而设计的轻量级消息传输协议。它具有简单、开放、易于实现的特点&#xff0c;是物联网应用的理想选择。MQTT 数据以连续实时的方式进行传输&#xff0c;非常适合由流处理引擎进行处理。 EMQX 是一款大规模分布式物联网 MQTT Broker&#x…

队列--C语言实现数据结构

本期带大家一起用C语言实现队列&#x1f308;&#x1f308;&#x1f308; 文章目录 1、队列的概念2、队列的操作流程3 、队列的结构4、队列的实现4.1 队列的结构设计4.2 队列的初始化4.3 入队4.4 判断队列是否为空4.5 出队4.6 获取队头数据4.7 获取队尾数据4.8 获取队列当中数据…

HTTP1和HTTP2和HTTP3的区别

超文本传输协议是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。 目录 HTTP1.1&#xff1a; HTTP2 HTTP3 参考文献 HTTP1.1&#xff1a; 特点&#xff1a; &#xff11;.一条链接只能一次请求一次返回这样子来回。一般的我们浏览器会帮我们一次次请求和收到。…