async compressBase64Size(base64Str: string, targetWidth: number, targetHeight: number): Promise<string> {
  let base64Data: string = ''
  if (base64Str.includes(',')) {
    base64Data = base64Str.split(',')[1]
  } else {
    base64Data = base64Str
  }
  let arrayBuffer: ArrayBuffer = buffer.from(base64Data, 'base64').buffer;
  // 2. 创建 ImageSource
  let imageSource: image.ImageSource = image.createImageSource(arrayBuffer);
  // 3. 设置解码选项,指定期望的尺寸
  let decodingOptions: image.DecodingOptions = {
    desiredSize: {
      width: targetWidth,
      height: targetHeight
    }
  };
  try {
    // 4. 按指定尺寸解码创建 PixelMap
    let pixelMap: image.PixelMap = await imageSource.createPixelMap(decodingOptions);

    // 5. 如有需要,可对缩放后的 PixelMap 再次进行质量压缩
    let imagePacker: image.ImagePacker = image.createImagePacker();
    let packingOptions: image.PackingOption = { format: 'image/jpeg', quality: 80 }; // 这里质量设为80
    let compressedArrayBuffer: ArrayBuffer = await imagePacker.packing(pixelMap, packingOptions);

    // 6. 将压缩后的 ArrayBuffer 转回 Base64
    let compressedBase64: string = buffer.from(compressedArrayBuffer).toString('base64');
    return `${compressedBase64}`;

  } catch (error) {
    const err: BusinessError = error as BusinessError;
    console.error(`Compression failed. Code: ${err.code}, message: ${err.message}`);
    // throw error;
    return ''
  }
}

//调用

this.compressBase64Size(base64Str, 300, 300).then((compressedBase64) => {

//todo

})
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐