【HarmonyOS】PixelMap转化为Uri
【HarmonyOS】PixelMap转化为Uri
问题背景
鸿蒙中的PixelMap类型,其实类似于Android和IOS中的bitmap,是对图片数据信息进行描述的一种逻辑运算使用的图片类型。
而鸿蒙中的Uri类型,本质其实是带file头的文件存储地址,是用来指向文件存储路径的一个字符串,例如:
'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg';
去掉file头,其实就是path类型了。
现在我们已经搞清楚两个类型都是什么,那如何转化呢?
解决方案:
首先这两种类型是无法直接转化的,经过刚才的类型介绍,我们知道Uri是文件的存储路径,如果已经有存储路径说明进行了file操作。那答案显而易见了,我们只需要将PixelMap进行图片存储到沙箱中,得到File之后再拿到Uri即可。
/**
* PixelMap转为图片Uri
* @param pixelMap
* @returns
*/
public async PixelMapToUri(pixelMap: PixelMap){
// 将图片保存到沙箱
// 先获取其应用沙箱路径
let fileDir = getContext().getApplicationContext().filesDir;
// 创建图片目录
let fileSavePath = fileDir + "image";
let res = fs.accessSync(fileSavePath);
if(res){
fs.mkdirSync(fileSavePath, true);
}
let packer = image.createImagePacker();
let packOpts: image.PackingOption = {
// 目标格式。当前只支持"image/jpeg"、"image/webp"、"image/png"和"image/heif"12+(不同硬件设备支持情况不同)。
// 因为jpeg不支持透明通道,若使用带透明通道的数据编码jpeg格式,透明色将变为黑色。
format: "image/png",
// JPEG编码中设定输出图片质量的参数,取值范围为0-100。0质量最低,100质量最高,质量越高生成图片所占空间越大。
quality: 100
}
// fileSavePath 打开文件的应用沙箱路径或URI,使用URI作为入参时,仅支持打开文件。
//开文件的选项,必须指定如下选项中的一个,默认以只读方式打开:
// - OpenMode.READ_ONLY(0o0):只读打开。
//
// - OpenMode.WRITE_ONLY(0o1):只写打开。
//
// - OpenMode.READ_WRITE(0o2):读写打开。
//
// 给定如下功能选项,以按位或的方式追加,默认不给定任何额外选项:
//
// - OpenMode.CREATE(0o100):若文件不存在,则创建文件。(path为URI时不支持创建文件)
//
// - OpenMode.TRUNC(0o1000):如果文件存在且文件具有写权限,则将其长度裁剪为零。
//
// - OpenMode.APPEND(0o2000):以追加方式打开,后续写将追加到文件末尾。
//
// - OpenMode.NONBLOCK(0o4000):如果path指向FIFO、块特殊文件或字符特殊文件,则本次打开及后续 IO 进行非阻塞操作。
//
// - OpenMode.DIR(0o200000):如果path不指向目录,则出错。不允许附加写权限。
//
// - OpenMode.NOFOLLOW(0o400000):如果path指向符号链接,则出错。
//
// - OpenMode.SYNC(0o4010000):以同步IO的方式打开文件。
let targetFile = fs.openSync(fileSavePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
let fd = targetFile.fd;
await packer.packToFile(pixelMap, fd, packOpts);
fs.closeSync(fd);
let targetUri = fileUri.getUriFromPath(targetFile.path);
return targetUri;
}