当前位置:   article > 正文

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

harmonyos 二维码

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版本,配置如下:

  1. "dependencies": {
  2. "@ohos/zxing": "2.0.0"
  3. }

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

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

  1. import {
  2. BarcodeFormat,
  3. MultiFormatWriter,
  4. BitMatrix,
  5. EncodeHintType,
  6. MultiFormatReader,
  7. DecodeHintType,
  8. RGBLuminanceSource,
  9. BinaryBitmap,
  10. HybridBinarizer
  11. } from '@ohos/zxing';
  12. import image from '@ohos.multimedia.image';
  13. export default class QRCode {
  14. constructor() {
  15. }
  16. async encode(content: string, params: {
  17. width: number,
  18. height: number,
  19. format?: BarcodeFormat
  20. }): Promise<image.PixelMap> {
  21. const {width,height,format=BarcodeFormat.QR_CODE} = params
  22. const encodeHintTypeMap = new Map();
  23. // 设置二维码空白的宽度
  24. encodeHintTypeMap.set(EncodeHintType.MARGIN, 0);
  25. const writer: MultiFormatWriter = new MultiFormatWriter();
  26. let matrix: BitMatrix = writer.encode(content, format, width, height, encodeHintTypeMap);
  27. const PixelData = this.getMatrixPixelData(matrix, matrix.getWidth(), matrix.getHeight())
  28. return await image.createPixelMap(PixelData.buffer, {
  29. size: {
  30. width, height
  31. }
  32. })
  33. }
  34. async decode(image: image.PixelMap, params: {
  35. width: number,
  36. height: number,
  37. format?: BarcodeFormat
  38. }): Promise<string> {
  39. const {width,height,format=BarcodeFormat.QR_CODE} = params
  40. let num=image.getPixelBytesNumber()
  41. let arrayBuffer:ArrayBuffer=new ArrayBuffer(num);
  42. await image.readPixelsToBuffer(arrayBuffer)
  43. const int32Array=new Int32Array(arrayBuffer)
  44. const luminanceSource=new RGBLuminanceSource(int32Array,width,height)
  45. const binaryBitmap=new BinaryBitmap(new HybridBinarizer(luminanceSource))
  46. const reader=new MultiFormatReader()
  47. const hints=new Map();
  48. hints.set(DecodeHintType.POSSIBLE_FORMATS,[format]);
  49. reader.setHints(hints);
  50. let result=reader.decode(binaryBitmap);
  51. let text=result.getText();
  52. return text;
  53. }
  54. getMatrixPixelData(matrix, width, height) {
  55. const BLACK = 0xFF000000;
  56. const WHITE = 0xFFFFFFFF;
  57. const pixels = new Uint32Array(width * height);
  58. for (let y = 0; y < height; y++) {
  59. let offset = y * width;
  60. for (let x = 0; x < width; x++) {
  61. pixels[offset + x] = matrix.get(x, y) ? BLACK : WHITE;
  62. }
  63. }
  64. return pixels;
  65. }
  66. }

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

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

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

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

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

  1. import { BarcodeFormat } from '@ohos/zxing';
  2. import QRCode from '../util/QRCode'
  3. @Entry
  4. @Component
  5. struct Index {
  6. @State message: string = 'Hello World'
  7. @State pixelMap: PixelMap = undefined
  8. qrcode = new QRCode()
  9. async encode() {
  10. this.pixelMap = await this.qrcode.encode("this is barcode", {
  11. width: 260,
  12. height: 80,
  13. format: BarcodeFormat.CODE_128
  14. })
  15. }
  16. async decode() {
  17. try {
  18. this.message = await this.qrcode.decode(this.pixelMap, {
  19. width: 260,
  20. height: 80,
  21. format: BarcodeFormat.CODE_128
  22. })
  23. } catch (err) {
  24. console.log('[Demo] decode error:' + JSON.stringify(err));
  25. }
  26. }
  27. build() {
  28. Row() {
  29. Column() {
  30. Text(this.message)
  31. .fontSize(50)
  32. .fontWeight(FontWeight.Bold)
  33. Image(this.pixelMap).width(260).height(80).margin(30)
  34. Button('生成一维码').fontSize(25).width(300).margin(20).onClick(() => {
  35. this.encode();
  36. })
  37. Button('解析一维码').fontSize(25).width(300).margin(20).onClick(() => {
  38. this.decode();
  39. })
  40. }
  41. .width('100%')
  42. }
  43. .height('100%')
  44. }
  45. }

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

【最后】

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/242936
推荐阅读
相关标签
  

闽ICP备14008679号