HarmonyOS 鸿蒙Next图片高保真压缩处理方案
HarmonyOS 鸿蒙Next图片高保真压缩处理方案 我这边选择完图片需要上传,因此需要进行图片高保真压缩处理,鸿蒙有提供保真压缩的API吗?有没有什么示例demo呢?
可通过options来设置参数,参数越大,质量越好,参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-image-V5
下面demo为例,实现将一个1.9M大小的图片,压缩成宽500,高500,且大小保持在100kb以内。
// 初始化图片资源到沙箱
async aboutToAppear(): Promise<void> {
const resourceManager = this.resourceManager;
const imageArray = await resourceManager.getMediaContent($r('app.media.100'));
console.log("yuv_path is:" + path);
let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.write(file.fd, imageArray.buffer).then((writeLen) => {
console.info("write data to file succeed and size is:" + writeLen);
fs.closeSync(file);
}).catch((err: BusinessError) => {
console.info("write data to file failed with error message: " + err.message + ", error code: " + err.code);
});
}
// 创建pixelMap,并调用压缩方法
// path为已获得的沙箱路径
const imageSource: image.ImageSource = image.createImageSource(path);
//创建pixelMap
this.pixelMap = await imageSource.createPixelMap(decodingOptions);
console.log("6666661" + this.pixelMap.getPixelBytesNumber());
//指定压缩宽、高、大小
this.packingDetail(500, 500, 100)
// 根据压缩后目标图片宽高计算缩放比 并进行缩放,调用packing方法实现第一次压缩
if (this.pixelMap) {
Logger.info("zhaohao before scaling pixelmap." + this.pixelMap.getPixelBytesNumber());
let imageInfo = await this.pixelMap.getImageInfo();
let a = this.pixelMap
//计算压缩比
let scaleX: number = targetWidth / imageInfo.size.width;
let scaleY: number = targetHeight / imageInfo.size.height;
this.pixelMap.scale(scaleX, scaleY, (err: BusinessError) => {
if (err) {
console.error("zhaohao Failed to scale pixelmap.");
return;
} else {
console.log("zhaohao in scaling pixelmap." + a.getPixelBytesNumber());
}
});
}
let imagePackerApi = image.createImagePacker();
let packOpts: image.PackingOption = { format: "image/jpeg", quality: 100 };
imagePackerApi.packing(this.pixelMap, packOpts).then((data: ArrayBuffer) => {
Logger.info("zhaohao in 100 quality data" + data.byteLength)
this.compressPictures(data, targetPixelSize, 99);
});
// 调用递归算法,当压缩后的data ,小于等于压缩目标图片大小时将data写入本地沙箱并结束递归
compressPictures(data?: ArrayBuffer, size?: number, quality?: number): void {
if (data && size && quality) {
const currentSize = data.byteLength / 1024
if (currentSize <= size || quality === 0) {
console.log("finally quallity is:" + ++quality)
let file = fs.openSync(path9, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.write(file.fd, data).then(async (writeLen) => {
console.info("write data to file succeed2 and size is:" + writeLen);
fs.closeSync(file);
}).catch((err: BusinessError) => {
console.info("write data to file failed1 with error message: " + err.message + ", error code: " + err.code);
});
return;
}
}
if (quality) {
let packOpts: image.PackingOption = { format: "image/jpeg", quality: quality }
let imagePackerApi = image.createImagePacker();
imagePackerApi.packing(this.pixelMap, packOpts)
.then((ret: ArrayBuffer) => {
//递归算法,直到压缩到指定大小的data
if (quality) {
Logger.info("PACKING66666" + quality)
return this.compressPictures(ret, size, quality - 1)
}
}).catch((err: BusinessError) => {
console.log(`lbh`)
return false
})
}
}
更多关于HarmonyOS 鸿蒙Next图片高保真压缩处理方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
同求
针对“HarmonyOS 鸿蒙Next图片高保真压缩处理方案”的问题,以下是一个简洁明了的回答:
在HarmonyOS鸿蒙Next系统中,实现图片的高保真压缩处理,可以通过以下方案进行:
首先,利用鸿蒙系统内置的图像处理API,这些API专为高效且高质量的图像处理设计。开发者可以调用这些API,对图片进行压缩处理,同时保持图片的高保真度。
其次,考虑到图片压缩过程中可能产生的失真问题,鸿蒙系统提供了多种压缩算法供开发者选择。通过选择合适的压缩算法,可以在压缩率和图片质量之间找到一个平衡点,确保图片在压缩后仍能保持较高的保真度。
此外,鸿蒙系统还支持对图片进行预处理,如调整图片尺寸、色彩空间转换等,这些预处理步骤可以进一步优化压缩效果,提高图片的压缩效率和保真度。
综上所述,HarmonyOS鸿蒙Next系统为开发者提供了丰富的图像处理工具和API,通过合理利用这些工具和API,可以实现图片的高保真压缩处理。如果在实际开发中遇到具体问题或需求,建议参考鸿蒙系统的官方文档或相关开发指南。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,