HarmonyOS 鸿蒙Next 截图保存到相册

发布于 1周前 作者 yibo5220 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 截图保存到相册

基本信息

咨询描述:
如何将PixelMap保存到本地相册中
咨询场景描述:
第一步:使用componentSnapshot截图,componentSnapshot.get(‘root’, (err: BusinessError, pixelMap: image.PixelMap) => {

if (err) {
//截图失败
savePicToGalleryPlugin.onFailCall()
} else {
//截图成功
savePicToGalleryPlugin.onSuccessCall(pixelMap,params)
}
}), 


第二步:截图成功后在onSuccessCall里面对pixelMap处理保存到本地相册

3 回复

您可以参考以下demo:

import componentSnapshot from '[@ohos](/user/ohos).arkui.componentSnapshot';
import image from '[@ohos](/user/ohos).multimedia.image';
import { photoAccessHelper } from '[@kit](/user/kit).MediaLibraryKit';
import fs from '[@ohos](/user/ohos).file.fs';
import abilityAccessCtrl, { Permissions } from '[@ohos](/user/ohos).abilityAccessCtrl';
import { BusinessError } from '[@ohos](/user/ohos).base';
import { common } from '[@kit](/user/kit).AbilityKit';

const permissions: Array<Permissions> = ['ohos.permission.WRITE_IMAGEVIDEO'];

function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): void {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();

  // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  atManager.requestPermissionsFromUser(context, permissions).then((data) => {
    let grantStatus: Array<number> = data.authResults;
    let length: number = grantStatus.length;

    for (let i = 0; i < length; i++) {
      if (grantStatus[i] === 0) {
        // 用户授权,可以继续访问目标操作
      } else {
        // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
        return;
      }
    }

    // 授权成功
  }).catch((err: BusinessError) => {
    console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
  });
}

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
  [@State](/user/State) pixmap: image.PixelMap | undefined = undefined;

  aboutToAppear(): void {
    const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    reqPermissionsFromUser(permissions, context);
  }

  build() {
    Column() {
      Row() {
        Image(this.pixmap)
          .width(200)
          .height(200)
          .border({ color: Color.Black, width: 2 })
          .margin(5);

        Image($r('app.media.app_icon'))
          .autoResize(true)
          .width(200)
          .height(200)
          .margin(5)
          .id("root");
      }

      Button("click to generate UI snapshot")
        .onClick(() => {
          componentSnapshot.get("root")
            .then((pixmap: image.PixelMap) => {
              this.pixmap = pixmap;
              // 保存到相册
              let packOpts: image.PackingOption = { format: "image/jpeg", quality: 98 };
              const imagePackerApi = image.createImagePacker();

              imagePackerApi.packing(pixmap, packOpts).then(async (buffer: ArrayBuffer) => {
                try {
                  const context = getContext(this);
                  let helper = photoAccessHelper.getPhotoAccessHelper(context);
                  let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png');
                  let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
                  await fs.write(file.fd, buffer);
                  // 关闭文件
                  await fs.close(file.fd);
                } catch (error) {
                  console.error("error is " + JSON.stringify(error));
                }
              }).catch((error: BusinessError) => {
                console.error('Failed to pack the image. And the error is: ' + error);
              });
            }).catch((err: Error) => {
              console.log("error: " + err);
            });
        }).margin(10);
    }
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center);
  }
}

需要申请受限权限:

ohos.permission.WRITE_IMAGEVIDEO

在HarmonyOS 鸿蒙Next系统中,截图并保存到相册的步骤如下:

  1. 获取截图:通过系统API获取当前屏幕的截图,通常会得到一个PixelMap对象,表示截图内容。
  2. 转换格式:使用image.createImagePacker()方法将PixelMap对象转换为特定格式的图像数据,如JPEG,以便存储。
  3. 保存临时文件:利用文件I/O操作,将转换后的图像数据写入设备的临时或缓存目录中,得到一个文件路径。
  4. 调用相册API:使用photoAccessHelper.showAssetsCreationDialog()方法,传入源文件的URI和图片创建配置(如文件名、类型等),将图片添加到系统相册。

在此过程中,需要注意以下几点:

  • 确保应用已获取必要的存储权限,否则无法将截图保存到相册。
  • 文件名和路径需正确配置,以避免文件写入失败。
  • 调用相册API时,用户可能需要确认保存操作,这是出于隐私保护的考虑。

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

回到顶部