HarmonyOS 使用fs压缩图片后,内存持续增长

//打开相册选择图片完成
let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = 'image/*';
        PhotoSelectOptions.maxSelectNumber = 9;
        let photoPicker = new photoAccessHelper.PhotoViewPicker();
        //打开相册
        photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
//处理返回结果,获取uri,转换为base64字符串
PhotoSelectResult.photoUris.forEach((uri,index)=>{
            this.packageImage(uri,80).then(()=>{})
          })
})

  //uri:相册图片uri, precent:压缩系数
  packageImage(uri: string, precent: number): Promise<BOBSelectImageModel> {
    return new Promise<BOBSelectImageModel>((resolve, reject) => {
      let selectModel = new BOBSelectImageModel()
      const imagePackerApi: image.ImagePacker = image.createImagePacker();
      let file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);
      const imageSourceApi: image.ImageSource = image.createImageSource(file.fd);
      let comNum = Math.trunc(precent)
      let packOpts: image.PackingOption = { format: "image/jpeg", quality: comNum }
      imagePackerApi.packing(imageSourceApi, packOpts).then((data: ArrayBuffer) => {
        if (data.byteLength > 0) {
          let base64Str = buffer.from(data).toString('base64')
          let resultBase64Str = base64Str ? base64Str : ''
          BoBLog.debug('', 'resultBase64Str长度-=======+++====' + resultBase64Str.length);
          selectModel.PhotoImg = resultBase64Str
          selectModel.precent = 0
          fileIo.close(file.fd,(err: BusinessError) => {
            if (err) {
              console.error("close file failed with error message: " + err.message + ", error code: " + err.code);
            } else {
              console.info("close file succeed");
            }
          })
          resolve(selectModel)
        } else {
          // fileIo.closeSync(file.fd);
          selectModel.precent = 1
          resolve(selectModel)
        }
      })
    })
  }

多次调用上述压缩方法packageImage,内存会持续增加,最后导致闪退。fileIo.close关闭打印日志为成功。该方法压缩图片方式是否存在问题。有无解决方法解决方案

该方法可以正常处理压缩图片,建议使用release方法释放当前实例对象。用法参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-image-V5#release7

如果想进一步提升查找性能,可以使用二分查找最接近指定图片压缩目标大小的图片质量quality来压缩图片,示例参考:

https://gitee.com/harmonyos-cases/cases/tree/master/CommonAppDevelopment/feature/imagecompression#%E9%AB%98%E6%80%A7%E8%83%BD%E7%9F%A5%E8%AF%86%E7%82%B9

HarmonyOS 文件下载保存到系统文件管理中 <a name="section495973514312"></a>

问题描述

next版本中需求:通过网络请求库进行下载文档文件,将文件下载完成后保存到本地。用户通过打开真机系统文件管理,可以查看到此文件。目前通过context存储到的是沙箱路径,真机通过打开文件管理无法直观查看到此文件?请问如何获取文件真实uri路径,进行直接保存?

打开测试机文件管理,里面只有Download、Documents两个文件夹。

HarmonyOS 使用fs压缩图片后,内存持续增长 -鸿蒙开发者社区

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

可以使用FilePicker来实现文件保存到本地系统管理,FilePicker对应的官网链接:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/save-user-file-V5

问题处理思路:可以先通过picker获取到要选择或者保存文件的公共路径,然后通过fs.copyFile进行文件复制,核心示例代码如下:

save(){
  const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器保存选项实例
  documentSaveOptions.newFileNames = ["icon.txt"]; // 保存文件名(可选)

  const documentViewPicker = new picker.DocumentViewPicker;
  documentViewPicker.save(documentSaveOptions)
    .then(async (documentSaveResult) => {
      // 获取到到图片或者视频文件的URI后进行文件读取等操作
      let uri = documentSaveResult[0];
      console.info('pub uri:' + uri)
      // 沙箱路径文件
      let sanFile = fs.openSync(sanPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
      let pubFile = fs.openSync(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
      // 将文件从沙箱路拷贝到公共路径
      fs.copyFileSync(sanFile.fd, pubFile.fd)
    })
    .catch((err:Error) => {
      console.error(`Invoke documentPicker.select failed, message is ${err.message}`); })
}
分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS 相册选择压缩图片大小
28浏览 • 1回复 待解决
HarmonyOS 如何压缩图片之后再上传?
65浏览 • 1回复 待解决
API 9 ETS如何进行压缩图片
397浏览 • 1回复 待解决
使用图片压缩API的参数影响
548浏览 • 1回复 待解决
HarmonyOS 图片压缩问题
79浏览 • 1回复 待解决
HarmonyOS 图片压缩失败
21浏览 • 1回复 待解决
HarmonyOS 图片压缩工具
59浏览 • 1回复 待解决
HarmonyOS图片压缩不到指定大小
657浏览 • 1回复 待解决
HarmonyOS 如何压缩本地图片
17浏览 • 1回复 待解决
HarmonyOS 图片压缩图片转base64
354浏览 • 1回复 待解决
flutter适配HarmonyOS图片压缩的库
229浏览 • 1回复 待解决
HarmonyOS 图片的加载与压缩服务?
247浏览 • 0回复 待解决
HarmonyOS 图片的加载与压缩服务
204浏览 • 1回复 待解决
HarmonyOS 怎么对图片进行压缩上传
100浏览 • 1回复 待解决