鸿蒙Next开发之-保存base64图片到本地沙盒

前言

目前公司和华为达成了合作,计划在鸿蒙正式发布next版本之前,上架公司APP的鸿蒙版本。方便用户升级手机到鸿蒙next之后,能正常使用公司APP,保证用户的既得利益。

目前公司的项目大体架构如下:

在这里插入图片描述

整个APP使用的是跨平台解决方案:Flutter、Game(Unity&Cocos)、H5

跨平台通过Bridge SDK调用原生底座能力。

开发环境

  • Mac
  • DevEco Studio NEXT Developer Preview2
  • HarmonyOS next Developer Preview2

这篇文章浅谈一下,在鸿蒙next上,如何实现将base64字符串的图片保存到原生设备上。

Base64认知

什么是Base64

Base64 是一种基于64个 ASCII 字符来表示二进制数据的表示方法,这个64个不同的字符为:

  • 大、小写字母(AZaz)。52个
  • 数字。(09)10个
  • 两个特殊字符。(+/)2个

在这里插入图片描述

Base64原理

  1. 将图片转换成二进制数据。
  2. 8比特位为一个单元的字节数据拆分为以6个比特位为一个单元的字节数据。
  3. 6个比特位为一个单元高位补齐00,补足8个比特。
  4. 如果剩余的字节不足6位,则先低位补00凑齐6位之后,高位再补00,补足8位。
  5. 当未编码(1中的二进制数据)输入的长度不是三的倍数时,则编码输出(3)必须添加填充,使其长度为四的倍数。填充字符为=
  6. 将补齐8个比特的二进制数据,转化为10进制数据。然后到上面的base64码表中进行查询,并生成字符。
  7. 将所有的字符进行拼接组成base64字符串。

举例说明

比如字符串:“byhk”

  1. 将其转换为二进制数据:01100010、01111001、01101000、01101011
  2. 将8比特拆为6比特:011000,100111,100101,101000,011010,11
  3. 高位补齐00,补足8个比特:0011000,0100111,00100101,00101000,00011010,00110000,
  4. 最后的11不满6位,先低位补0000变为:110000,然后高位补00,变为:00110000
  5. 步骤3,最后的数量不是4的倍数,因此需要填充两个=
  6. 因此"byhk"的base64的结果为:“Ynloaw==”

鸿蒙base64图片保存到本地沙盒

认识图片base64格式

data:image/png;base64,iVBORw0KGg....

1、解析图片数据

private static dealBase64Str(base64Data: string): string {
  let imageData: string
  if (base64Data.startsWith("data")) {
    const base64Split: string[] = base64Data.split(",")
    if (base64Split.length !== 2) {
      throw new Error(`Illegal base64 data`)
    }
    imageData = base64Split[1].trim()
  } else {
    imageData = base64Data
  }
  return imageData
}

2、创建沙盒文件

private static createFile(context: Context) {
  let pathDir = context.filesDir
  let fileName = systemDateTime.getTime(true)
  let filePath = `${pathDir}/${fileName}.jpg`
  let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
  return file
}

3、将图片数据写入

let bufferImage = buffer.from(base64Result, 'base64')
await fs.write(file.fd, bufferImage.buffer)
fs.closeSync(file.fd)

完整代码

export class ImageUtils {
  static async saveBase64Image(base64ImageData: string, context: Context): Promise<Boolean> {
    try {
      let base64Result = ImageUtils.dealBase64Str(base64ImageData)
      let file = ImageUtils.createFile(context)
      let bufferImage = buffer.from(base64Result, 'base64')
      await fs.write(file.fd, bufferImage.buffer)
      fs.closeSync(file.fd)
      return Promise.resolve(true)
    } catch (e) {
      throw new Error(e)
    }
  }

  private static dealBase64Str(base64Data: string): string {
    let imageData: string
    if (base64Data.startsWith("data")) {
      const base64Split: string[] = base64Data.split(",")
      if (base64Split.length !== 2) {
        throw new Error(`ImageUtils: Illegal base64 data`)
      }
      imageData = base64Split[1].trim()
    } else {
      imageData = base64Data
    }
    return imageData
  }

  private static createFile(context: Context) {
    let pathDir = context.filesDir
    let fileName = systemDateTime.getTime(true)
    let filePath = `${pathDir}/${fileName}.jpg`
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
    return file
  }
}

怎样学习鸿蒙?

首先必学的是开发语言 ArkTS,这是重中之重,然后就是ArkUI声明式UI开发、Stage模型、网络/数据库管理、分布式应用开发、进程间通信与线程间通信技术、OpenHarmony多媒体技术……。中间还有许多的知识点,都整理成思维导图来分享给大家~
在这里插入图片描述
此外,小编精心准备了一份联合鸿蒙官方发布笔记整理收纳的《鸿蒙开发学习笔记》,内容包含ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

【有需要的小伙伴,可以扫描下方二维码免费领取!!!】

快速入门

  • 开发准备
  • 构建第一个ArkTS应用(Stage模型)
  • 构建第一个ArkTS应用(FA模型)
  • 构建第一个JS应用(FA模型)
    在这里插入图片描述

开发基础知识

  • 应用程序包基础知识
  • 应用配置文件(Stage模型)
  • 应用配置文件概述(FA模型)
    在这里插入图片描述

资源分类与访问

  • 资源分类与访问
  • 创建资源目录和资源文件
  • 资源访问
    在这里插入图片描述

学习ArkTs语言

  • 初识ArkTS语言
  • 基本语法
  • 状态管理
  • 其他状态管理
  • 渲染控制
    在这里插入图片描述

基于ArkTS声明式开发范式

  • UI开发(ArkTS声明式开发范式)概述
  • 开发布局
  • 添加组件
  • 显示图片
  • 使用动画
  • 支持交互事件
  • 性能提升的推荐方法

在这里插入图片描述

兼容JS的类Web开发范式

  • 概述
  • 框架说明
  • 构建用户界面
  • 常见组件开发指导
  • 动效开发指导
  • 自定义组件
    在这里插入图片描述

Web组件

  • 概述
  • 设置基本属性和事件
  • 并发
  • 窗口管理
  • WebGL
  • 媒体
  • 安全
  • 网络与连接
  • 电话服务
  • 数据管理

  • 在这里插入图片描述

应用模型

  • 概述
  • Stage模型开发指导
  • FA模型开发指导
    在这里插入图片描述
2024完整鸿蒙学习资料领取方式:扫描下方二维码即可
  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值