HarmonyOS 鸿蒙Next image.PixelMap转成ArrayBuffer失败

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

HarmonyOS 鸿蒙Next image.PixelMap转成ArrayBuffer失败

需求: 截图 - 保存到相册

截图逻辑:

componentSnapshot.get(LIVE_ROOM_ID)
.then((pixmap: image.PixelMap) => {
this.screenshotPixmap = pixmap
reqPermissions(getContext(this) , ['ohos.permission.READ_IMAGEVIDEO', 'ohos.permission.WRITE_IMAGEVIDEO'])
.then(() => {
savePixelMapImage(getContext(this), pixmap)
})
}).catch((err:Error) => {
console.log(err.stack)
})

保存PixelMap
export async function savePixelMapImage(context: Context, pixelMap: image.PixelMap) {

let pixelBytesNumber : number = pixelMap.getPixelBytesNumber()
const readBuffer = new ArrayBuffer(pixelBytesNumber);
pixelMap.readPixelsToBuffer(readBuffer).then(() => {
saveImage(context, readBuffer)
}).catch((error : BusinessError) => {
showToast("保存失败")
})
}

保存到相册
export async function saveImage(context: Context, arrayBuffer: ArrayBuffer) {
try {
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
// Creating a Media File
let uri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
let file = await fileIo.open(uri, fileIo.OpenMode.READ_WRITE);
// Write the read ArrayBuffer to the new media file.
await fileIo.write(file.fd, arrayBuffer);
await fileIo.close(file);
} catch (err) {
showToast("保存失败")
}
}

最终 保存到相册的图片是空白的


更多关于HarmonyOS 鸿蒙Next image.PixelMap转成ArrayBuffer失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

参考一下此示例:

// 保存图片
import { image } from '@kit.ImageKit';
import fs from '@ohos.file.fs';

let fd: number | null = null

export async function saveToFile(pixelMap: image.PixelMap, imagePath: string): Promise<void> {
try {
const filePath = imagePath;
const imagePacker = image.createImagePacker();
const imageBuffer = await imagePacker.packing(pixelMap, {
format: 'image/png',
quality: 100
});
const mode = fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE;
fd = (await fs.open(filePath, mode)).fd;
await fs.truncate(fd);
await fs.write(fd, imageBuffer);
} catch (err) {
} finally {
if (fd) {
fs.close(fd);
}
}
}

更多关于HarmonyOS 鸿蒙Next image.PixelMap转成ArrayBuffer失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,将image.PixelMap转换成ArrayBuffer失败的问题可能源于几个关键因素。首先,PixelMap是HarmonyOS提供的一个用于图像处理的类,而ArrayBuffer则是用于处理通用二进制数据的接口。这两者在数据类型和结构上存在差异,直接转换可能不兼容。

一种可能的解决方案是,首先通过PixelMapgetPixels方法获取像素数据,这通常返回一个字节数组。然后,你可以创建一个ArrayBuffer,并将这个字节数组的内容复制到ArrayBuffer中。需要注意的是,这种复制过程可能涉及到数据类型转换和内存管理,确保在转换过程中正确处理这些问题。

示例代码(伪代码,具体实现需根据HarmonyOS API调整):

let pixelMap = // 获取PixelMap对象
let pixelData = pixelMap.getPixels(); // 获取像素数据,通常为Uint8Array
let arrayBuffer = new ArrayBuffer(pixelData.length);
let view = new Uint8Array(arrayBuffer);
view.set(pixelData); // 将像素数据复制到ArrayBuffer

如果上述方法仍然无法解决问题,可能是因为PixelMap对象的当前状态不允许访问像素数据,或者ArrayBuffer的使用方式有误。请检查PixelMap对象是否已正确加载并准备好访问,以及ArrayBuffer的使用是否符合HarmonyOS的规范。

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

回到顶部