1
头图

目录

  • 前言
  • 码图技术概述
  • 关于文本生成码图
  • 使用场景
  • 文本生成码图的约束与限制
  • 实现文本生成码图
  • 自定义码图
  • 结束语

    前言

    在当前的软件开发中,生成二维码和条形码(统称为码图)是一个非常常见的需求,尤其是在需要快速分享信息、数据验证和支付处理的应用中,再加上扫码支付和扫码认证等功能的越来越普及,码图的应用越来越多。而且在鸿蒙原生应用开发中,HarmonyOS提供了强大的API支持,使得开发者可以轻松实现通过文本生成码图的功能。那么本文就来详细介绍如何在HarmonyOS应用中实现文本到码图的转换,包括技术选型、实现步骤和代码示例。

码图技术概述

先来了解一下码图技术,它其实包括二维码和条形码,是一种将数据编码为图形的方式,便于扫描和自动识别。二维码因其高密度信息存储和易于生成的特点,比条形码更为流行。另外,码图生成能力支持将字符串转换为自定义格式的码图。

关于文本生成码图

在HarmonyOS中,通过文本生成码图通常涉及以下步骤:
1.集成码图生成库:选择一个合适的库来生成二维码或条形码。
2.配置码图参数:设置码图的类型、文本内容、尺寸等参数。
3.生成码图:使用库提供的API生成码图。
4.显示和使用码图:将生成的码图显示在界面上或用于其他用途。

使用场景

由于码图生成能力支持将字符串转换为自定义格式的码图,包含条形码、二维码生成,实际应用中可以将字符串转成联系人码图,手机克隆码图,比如将"HarmonyOS"字符串生成码图使用。

文本生成码图的约束与限制

根据鸿蒙官方的介绍,文本生成码图的功能支持十三种码图生成,每种码图对生成参数有不同的要求,关于码图的限制请参照下面的表格内容:
截屏2024-12-09 12.14.31.png
需要说明的是:

  • 码图颜色和背景:建议使用默认颜色和背景:黑色码图、白色背景。如果码图颜色和背景对比度较小会影响识别率。
  • 码图边距:建议使用默认边距1,单位:px,取值范围:[1, 10]。
  • 码图大小:生成QR Code、Data Matrix、Aztec类型的码图时,输入的width和height值相同且均大于等于200小于等于4096,否则生成的码图过小会影响识别;生成EAN-8、EAN-13、UPC-A、UPC-E、Codabar、Code 39、Code 93、Code 128、ITF-14、PDF417类型的码图时,建议输入的width和height值比例为2:1,并且width值需大于400,否则生成的码图会过小影响识别。

    实现文本生成码图

    关于实现文本生成码图的使用,码图生成根据传参内容直接生成所需码图,需要传入固定参数和可选参数,那么下面分享的示例就是以调用码图生成能力的createBarcode接口实现码图生成,具体操作如下步骤所示。

    步骤1:导入模块

    首先导入码图生成接口模块,该模块提供了码图生成的参数和方法,具体的导入方法如下所示:

// 导入码图生成需要的图片模块、错误码模块
import { scanCore, generateBarcode } from '@kit.ScanKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { image } from '@kit.ImageKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

步骤2:调用码图生成接口

接下来是调用码图生成能力的createBarcode接口实现码图生成,分为两种调用方式:通过Promise方式回调和通过Callback方式回调,具体操作步骤如下所示:
1、通过Promise方式回调,获取生成的码图,具体操作如下所示:

@Entry
@Component
struct Index {
  @State pixelMap: image.PixelMap | undefined = undefined

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Button('generateBarcode Promise').onClick(() => {
        // 以QR码为例,码图生成参数
        this.pixelMap = undefined;
        let content: string = 'huawei';
        let options: generateBarcode.CreateOptions = {
          scanType: scanCore.ScanType.QR_CODE,
          height: 400,
          width: 400
        }
        try {
          // 码图生成接口,成功返回PixelMap格式图片
          generateBarcode.createBarcode(content, options).then((pixelMap: image.PixelMap) => {
            this.pixelMap = pixelMap;
          }).catch((error: BusinessError) => {
          })
        } catch (error) {
        }

      })
      // 获取生成码后显示
      if (this.pixelMap) {
        Image(this.pixelMap).width(300).height(300).objectFit(ImageFit.Contain)
      }
    }
    .width('100%')
    .height('100%')
  }
}

2、通过Callback方式回调,获取生成的码图,具体操作如下所示:

@Entry
@Component
struct Index {
  @State pixelMap: image.PixelMap | undefined = undefined

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Button('generateBarcode Callback').onClick(() => {
        // 以QR码为例,码图生成参数
        let content = 'huawei';
        let options: generateBarcode.CreateOptions = {
          scanType: scanCore.ScanType.QR_CODE,
          height: 400,
          width: 400
        }
        try {
          // 码图生成接口,成功返回PixelMap格式图片
          generateBarcode.createBarcode(content, options, (error: BusinessError, pixelMap: image.PixelMap) => {
            if (error) {
              return;
            }
            this.pixelMap = pixelMap;
          })
        } catch (error) {
        }
      })
      // 获取生成码后显示
      if (this.pixelMap) {
        Image(this.pixelMap).width(300).height(300).objectFit(ImageFit.Contain)
      }
    }
    .width('100%')
    .height('100%')
  }
}

步骤4:特别说明:关于模拟器使用

据悉,目前暂不支持模拟器使用文本生成码图的功能,如果调用会返回错误信息“Emulator is not supported.”

自定义码图

除了上面基本的码图生成的功能,我们还可以根据应用的需求自定义码图行为,比如下面的操作:

  • 自定义码图样式:改变码图的颜色、边框等样式。
  • 码图尺寸调整:根据需要调整码图的尺寸。

    结束语

    通过文本详细介绍,不难看出生成码图是HarmonyOS开发中的一项实用功能,它为应用提供了便捷的信息分享和数据验证能力,想必大家都应该了解了如何在HarmonyOS应用中实现文本到码图的转换,也可以看到鸿蒙原生应用自带的文本生成码图的强大能力。随着技术的不断发展,码图的生成功能将在HarmonyOS生态中继续扮演重要的角色,给大家带来更加丰富和方便的体验。


nshen
2.2k 声望156 粉丝