> 技术文档 > 鸿蒙截图与保存到相册的实现步骤_鸿蒙 保存文件到相册

鸿蒙截图与保存到相册的实现步骤_鸿蒙 保存文件到相册

第一步:截图组件并打包二进制流
给目标组件设置唯一id,调用componentSnapshot.get()获取组件截图。该函数返回Promise,使用await获取截图数据对象。通过ImagePacker实例的packing()方法将截图转为二进制流,参数包括目标组件、文件格式(如pngjpg)和清晰度(quality值)。

 const res = await componentSnapshot.get(\'share\') const packer = image.createImagePacker() const arrayBuffer = await packer.packing(res, { format: \'image/jpeg\', quality: 70 })

第二步:写入本地文件
通过上下文获取缓存目录路径(context.cacheDir),拼接文件名生成完整路径。使用fileIo.openSync创建/打开文件,writeSync写入二进制流数据,最后调用closeSync关闭文件。

 const ctx = getContext() const imagePath = ctx.cacheDir + \'/\' + Date.now() + \'.jpeg\' const imgFile = fileIo.openSync(imagePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE) fileIo.writeSync(imgFile.fd, arrayBuffer) fileIo.closeSync(imgFile.fd) promptAction.showToast({ message: \'图片已存储到缓存\' + fileUri.getUriFromPath(imagePath) })

第三步:保存到系统相册
获取相册权限后,使用fileUri.getUriFromPath转换本地文件路径为URI。通过photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest创建图片变更请求,传入上下文和文件URI。调用photoAccessHelper.getPhotoAccessHelper获取助手实例,执行applyChanges提交变更请求。

 const imageUri = fileUri.getUriFromPath(imagePath) const request = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(ctx, imageUri) const helper = photoAccessHelper.getPhotoAccessHelper(ctx) await helper.applyChanges(request) promptAction.showToast({ message: \'已保存到本地相册\' }) this.controller.close() 

第四步:权限处理
若仅需临时权限,使用SaveButton组件触发保存操作,并在其回调中检查权限状态。权限授予成功后,执行截图和保存流程。

SaveButton({ text: SaveDescription.SAVE_IMAGE, buttonType: ButtonType.Normal, icon: SaveIconStyle.FULL_FILLED})

关键代码示例

// 截图与打包const snapshot = await componentSnapshot.get(\'componentId\');const packer = new image.ImagePacker();const binaryData = await packer.packing(snapshot, { format: \'image/jpeg\', quality: 100 });// 写入文件const filePath = context.cacheDir + \'/screenshot.jpg\';let file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);fileIo.writeSync(file.fd, binaryData);fileIo.closeSync(file);// 保存到相册const photoUri = fileUri.getUriFromPath(filePath);const request = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, photoUri);const helper = photoAccessHelper.getPhotoAccessHelper(context);await helper.applyChanges(request);

注意事项

  • 相册操作需在ohos.permission.READ_IMAGEVIDEOohos.permission.WRITE_IMAGEVIDEO权限授权后进行。
  • 文件路径需确保可访问,临时文件建议存储在cacheDirtempDir目录。