HarmonyOS 鸿蒙Next 保存图片到相册如何实现?
HarmonyOS 鸿蒙Next 保存图片到相册如何实现?
SaveButton这个组件可以实现,但是不能自定义样式!
论坛里的方法也都无效,请问有什么办法可以实现吗,存储的是image.PixelMap类型的图片!
修改了其他大佬的一个工具类,使用的时候需要把图片转为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 。