HarmonyOS 鸿蒙Next 截图保存到相册
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系统中,截图并保存到相册的步骤如下:
- 获取截图:通过系统API获取当前屏幕的截图,通常会得到一个PixelMap对象,表示截图内容。
- 转换格式:使用image.createImagePacker()方法将PixelMap对象转换为特定格式的图像数据,如JPEG,以便存储。
- 保存临时文件:利用文件I/O操作,将转换后的图像数据写入设备的临时或缓存目录中,得到一个文件路径。
- 调用相册API:使用photoAccessHelper.showAssetsCreationDialog()方法,传入源文件的URI和图片创建配置(如文件名、类型等),将图片添加到系统相册。
在此过程中,需要注意以下几点:
- 确保应用已获取必要的存储权限,否则无法将截图保存到相册。
- 文件名和路径需正确配置,以避免文件写入失败。
- 调用相册API时,用户可能需要确认保存操作,这是出于隐私保护的考虑。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。