HarmonyOS 鸿蒙Next图片高保真压缩处理方案

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

HarmonyOS 鸿蒙Next图片高保真压缩处理方案 我这边选择完图片需要上传,因此需要进行图片高保真压缩处理,鸿蒙有提供保真压缩的API吗?有没有什么示例demo呢?

3 回复

可通过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

回到顶部