【HarmonyOS NEXT】ArrayBuffer转Base64,Base64转ArrayBuffer,Uri转ArrayBuff,PixelMap转ArrayBuffer,图片Uri转为PixelMap


HarmonyOS NEXT

前言

ArrayBuff与Unint8Array是鸿蒙应用开发中,常用的二进制字节流处理对象,类比于安卓中的byte[]。

在鸿蒙系统的应用开发中,ArrayBuffer作为一种可转移对象,在线程间传递时不需要进行拷贝,从而避免了同一份数据在主线程和子线程中分别占用内存的问题。这种特性在处理大数据量时尤为重要,因为它能有效减少内存占用,提高应用性能

fd:资源描述符,以number形式存在,是鸿蒙系统中独有的,可以理解成文件在鸿蒙系统中的id序号。

uri:资源的路径,与path不同的是,路径字符串最前面带有file:头。例如 file://xxx.xxx.xx.png

pixelMap:类似于android中的bitmap,描述图片像素的信息对象。

工具函数:

最常用的转化存储函数

import { util } from "@kit.ArkTS";

  /**
   * ArrayBuffer转Base64
   * @param buffer
   * @returns
   */
  public arrayBuffer2Base64(buffer: ArrayBuffer){
    let temp = new Uint8Array(buffer);
    // 官方提供的base64编码转换工具
    let helper = new util.Base64Helper();
    let res = helper.encodeToStringSync(temp);
    return res;
  }

  /**
   * Base64转ArrayBuffer
   * @param base64Str
   * @returns 
   */
  public base642Buffer(str: string){
    let helper = new util.Base64Helper();
    let temp: Uint8Array = helper.decodeSync(str);
    let res: ArrayBuffer = temp.buffer as ArrayBuffer;
    return res;
  }

  /**
   * 图片Uri转ArrayBuff
   * @param uri
   * @returns 
   */
  public ImageUri2Buffer(uri: string){
    let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
    let buffer = new ArrayBuffer(4096);
    fs.readSync(file.fd, buffer);
    return buffer ;
  }

  /**
   * PixelMap转化为ArrayBuffer
   * @param pm
   * @returns
   */
  public pixelMapToArrayBuff(pm: image.PixelMap){
    // 创建ArrayBuffer对象
    let buffer = new ArrayBuffer(pm.getPixelBytesNumber());
    // 读取像素数据到ArrayBuffer
    pm.readPixelsToBufferSync(buffer);
    return buffer;
  }

  /**
   * 图片Uri转为PixelMap
   * @param uri
   * @returns
   */
  public ImageUriToPixelMap(uri: string): image.PixelMap {
    let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
    let imageSource: image.ImageSource = image.createImageSource(file.fd);
    let res: image.PixelMap = imageSource.createPixelMapSync({
      editable: true, // 是否可编辑。当取值为false时,图片不可二次编辑,如writepixels操作将失败。
      desiredPixelFormat: image.PixelMapFormat.RGBA_8888 // 解码的像素格式。仅支持设置:RGBA_8888、BGRA_8888和RGB_565。有透明通道图片格式不支持设置RGB_565,如PNG、GIF、ICO和WEBP。
    });
    return res;
  }