HarmonyOS 鸿蒙Next 保存图片到相册如何实现?

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 保存图片到相册如何实现?

SaveButton这个组件可以实现,但是不能自定义样式!

论坛里的方法也都无效,请问有什么办法可以实现吗,存储的是image.PixelMap类型的图片!

7 回复

修改了其他大佬的一个工具类,使用的时候需要把图片转为ArrayBuffer类型传进去

import { common } from "[@kit](/user/kit).AbilityKit"
import fs, { ReadOptions, WriteOptions } from '[@ohos](/user/ohos).file.fs';
import { photoAccessHelper } from "[@kit](/user/kit).MediaLibraryKit";
import { fileUri } from "[@kit](/user/kit).CoreFileKit";
import { promptAction } from "[@kit](/user/kit).ArkUI";


const TAG = 'PixelMapUtil'

export default class PixelMapUtil {
 //图片保存到相册
 static async savePicToAlbum(base64: ArrayBuffer, fileName: string) {
   PixelMapUtil.writeFileDataToSandBox(base64, fileName + '.jpg').then((path) => {
     PixelMapUtil.savePic(path, fileName)
   })
 }

 public static writeFileDataToSandBox(fileData: ArrayBuffer, fileName: string): Promise<string> {
   return new Promise((resolve, reject) => {
     let context = getContext(PixelMapUtil) as common.UIAbilityContext
     let cacheDir = context.filesDir
     let filePath = cacheDir + "/textDir";
     
     if (!fs.accessSync(filePath)) {
       fs.mkdirSync(filePath)
     }
     let cachePath = filePath + '/' + fileName
     let file = fs.openSync(cachePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
     console.info(TAG, "file fd: " + file.fd)
     let writeLen = fs.writeSync(file.fd, fileData)
     console.info(TAG, "write data to file succeed and size is:" + writeLen)
     fs.closeSync(file)
     resolve(cachePath)
   })
 }


 static async savePic(filePath: string, fileName: string) {
   console.info(TAG, 'ShowAssetsCreationDialogDemo.');
   let context = getContext(PixelMapUtil) as common.UIAbilityContext
   let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
   try {
     let srcFileUri: Array<string> = [fileUri.getUriFromPath(filePath)]
     console.debug(TAG, `图片 uri is : ${JSON.stringify(srcFileUri)}`)

     let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
       {
         title: fileName, // 可选
         fileNameExtension: 'jpg',
         photoType: photoAccessHelper.PhotoType.IMAGE,
         subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
       }
     ];
     console.log(TAG, "syncToSysAlarm fileUri:" + JSON.stringify(srcFileUri) + ",config:" +
     JSON.stringify(photoCreationConfigs))
     let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUri, photoCreationConfigs);
     console.debug(TAG, `目标图片 uri is : ${JSON.stringify(desFileUris)}`)


     if (desFileUris.length > 0) {
       for (let index = 0; index < desFileUris.length; index++) {
         PixelMapUtil.copyFileContentTo(srcFileUri[index], desFileUris[index])
       }
     }

   } catch (err) {
     console.error(TAG, 'showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
   }
 }


 /**
  * 复制文件内容到目标文件
  * [@param](/user/param) srcFilePath 源文件路径
  * [@param](/user/param) destFilePath 目标文件路径
  */
 static copyFileContentTo(srcFilePath: string, destFilePath: string) {
   let srcFile = fs.openSync(srcFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
   let destFile = fs.openSync(destFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)

   // 读取源文件内容并写入至目的文件
   let bufSize = 4096;
   let readSize = 0;
   let buf = new ArrayBuffer(bufSize);
   let readOptions: ReadOptions = {
     offset: readSize,
     length: bufSize
   };
   let readLen = fs.readSync(srcFile.fd, buf, readOptions);
   while (readLen > 0) {
     readSize += readLen;
     let writeOptions: WriteOptions = {
       length: readLen
     };
     fs.writeSync(destFile.fd, buf, writeOptions);
     readOptions.offset = readSize;
     readLen = fs.readSync(srcFile.fd, buf, readOptions);
   }
   // 关闭文件
   promptAction.showToast({
     message: '保存成功',
     duration: 1000
   });
   fs.closeSync(srcFile);
   fs.closeSync(destFile);
 }
}

可以参考下这篇博文:

HarmonyOS Next 屏幕截图 + 保存图片到系统相册 代码分享

https://developer.huawei.com/consumer/cn/blog/topic/03166979994620019

可以定义样式,只不过有限制

我想要上面图标下面文字的那种,而且按钮背景色要设置透明,这些都实现不了

纯透明不行的,可是设置白色

好的,效果不完美,再看看其他办法吧

在HarmonyOS鸿蒙Next中,保存图片到相册的操作涉及几个关键步骤。

首先,确保你已有图片的PixelMap对象或图片数据(如ArrayBuffer)。若图片数据为base64格式,需先将其转换为二进制数据(ArrayBuffer)。

其次,使用image.createImagePacker()将PixelMap对象压缩为特定格式的图像数据,如JPEG。接着,通过文件I/O操作(如fs.open和fs.write)将压缩后的图像数据保存到设备的临时或缓存目录中。

最后,利用photoAccessHelper.showAssetsCreationDialog() API将图片添加到系统相册,此API需传入源文件的URI和图片创建配置(如文件名、类型等)。

请确保每一步操作都正确执行,特别是文件路径、文件名和文件权限等配置。同时,注意检查应用是否已获得必要的存储权限。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部