当前位置: 首页 > article >正文

【HarmonyOS】PixelMap转化为Uri

【HarmonyOS】PixelMap转化为Uri

问题背景

鸿蒙中的PixelMap类型,其实类似于Android和IOS中的bitmap,是对图片数据信息进行描述的一种逻辑运算使用的图片类型。

而鸿蒙中的Uri类型,本质其实是带file头的文件存储地址,是用来指向文件存储路径的一个字符串,例如:

'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg';

去掉file头,其实就是path类型了。

现在我们已经搞清楚两个类型都是什么,那如何转化呢?

解决方案:

首先这两种类型是无法直接转化的,经过刚才的类型介绍,我们知道Uri是文件的存储路径,如果已经有存储路径说明进行了file操作。那答案显而易见了,我们只需要将PixelMap进行图片存储到沙箱中,得到File之后再拿到Uri即可。

  /**
   * PixelMap转为图片Uri
   * @param pixelMap
   * @returns
   */
  public async PixelMapToUri(pixelMap: PixelMap){
    // 将图片保存到沙箱
    // 先获取其应用沙箱路径
    let fileDir = getContext().getApplicationContext().filesDir;
    // 创建图片目录
    let fileSavePath = fileDir + "image";
    let res = fs.accessSync(fileSavePath);
    if(res){
      fs.mkdirSync(fileSavePath, true);
    }
    let packer = image.createImagePacker();
    let packOpts: image.PackingOption = {
      // 目标格式。当前只支持"image/jpeg"、"image/webp"、"image/png"和"image/heif"12+(不同硬件设备支持情况不同)。
      // 因为jpeg不支持透明通道,若使用带透明通道的数据编码jpeg格式,透明色将变为黑色。
      format: "image/png",
      // JPEG编码中设定输出图片质量的参数,取值范围为0-100。0质量最低,100质量最高,质量越高生成图片所占空间越大。
      quality: 100
    }
    // fileSavePath 打开文件的应用沙箱路径或URI,使用URI作为入参时,仅支持打开文件。

    //开文件的选项,必须指定如下选项中的一个,默认以只读方式打开:
    // - OpenMode.READ_ONLY(0o0):只读打开。
    //
    // - OpenMode.WRITE_ONLY(0o1):只写打开。
    //
    // - OpenMode.READ_WRITE(0o2):读写打开。
    //
    // 给定如下功能选项,以按位或的方式追加,默认不给定任何额外选项:
    //
    // - OpenMode.CREATE(0o100):若文件不存在,则创建文件。(path为URI时不支持创建文件)
    //
    //   - OpenMode.TRUNC(0o1000):如果文件存在且文件具有写权限,则将其长度裁剪为零。
    //
    // - OpenMode.APPEND(0o2000):以追加方式打开,后续写将追加到文件末尾。
    //
    // - OpenMode.NONBLOCK(0o4000):如果path指向FIFO、块特殊文件或字符特殊文件,则本次打开及后续 IO 进行非阻塞操作。
    //
    // - OpenMode.DIR(0o200000):如果path不指向目录,则出错。不允许附加写权限。
    //
    // - OpenMode.NOFOLLOW(0o400000):如果path指向符号链接,则出错。
    //
    // - OpenMode.SYNC(0o4010000):以同步IO的方式打开文件。
    let targetFile = fs.openSync(fileSavePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
    let fd = targetFile.fd;
    await packer.packToFile(pixelMap, fd, packOpts);
    fs.closeSync(fd);
    let targetUri = fileUri.getUriFromPath(targetFile.path);
    return targetUri;
  }


http://www.kler.cn/a/384736.html

相关文章:

  • 单纯的查询而言,vector和map谁更快
  • NetCore使用Aop和内存缓存对接口、方法进行数据缓存
  • Latex中给公式加边框
  • 《Elasticsearch 实战应用》
  • 使用文心快码生成口算题,妈妈再也不用担心我的学习了
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十. 多线程控制帧率。循环播放,QT connect 细节,
  • 2024.11.4 STM32点灯和简单的数据收发
  • adb shell常用命令
  • LocalDate日期加减一天,mysql日期加减一天
  • K8s使用nfs
  • playground.tensorflow神经网络可视化工具
  • Python 5个数据容器
  • nodeJS程序如何引入依赖包
  • Fortran安装(vscode+gcc+Python)
  • github和Visual Studio
  • Python并发编程库:Asyncio的异步编程实战
  • 智慧城市智慧城市项目方案-大数据平台建设技术方案(原件Word)
  • 如何学习Java“高并发”,并在项目中实际应用?
  • uniapp(API-Promise 化)
  • 华为云前台网络是如何使用,功能有哪些?
  • 发现个免费建站免费体验模板使用的地方(腾讯云上)
  • DQN详解
  • 分享大模型发展进入新阶段,产业应用成为竞争焦点
  • 80后聊架构:架构设计中两个重要指标,延时与吞吐量(Latency vs Throughput) | 架构师之路...
  • Java链表及源码解析
  • 鸿蒙next选择 Flutter 开发跨平台应用的原因