HarmonyOS 关于ImagePacker报错Packing failed, packedSize outside size的问题?

使用ImagePacker压缩png图片时,如果PackingOption参数种format为"image/png",quality为100,bufferSize为传入文件大小时,执行packing会报错Packing failed, packedSize outside size.,但是如果bufferSize是传入文件大小+1的话,执行结果正常。

出现问题的示例代码如下:

async compressToTargetRange(inputImageBuffer: ArrayBuffer, //这个输入的图片是png格式
maxCompressedImageSize: number, minCompressedImageSize: number,
needResize: boolean = false): Promise<ArrayBuffer> {
  let inputImageByteLength = inputImageBuffer.byteLength
  // 创建图像编码ImagePacker对象
  const imagePackerApi = image.createImagePacker();
  const imageSource = image.createImageSource(inputImageBuffer);
  const MIN_IMAGE_QUALITY = 100;
  const packOpts: image.PackingOption = {
    format: "image/png", quality: MIN_IMAGE_QUALITY,
    bufferSize: inputImageByteLength //这里是和输入文件大小一致
  };
  // compressedImageData为打包获取到的图片文件流。
  //执行报错“Packing failed, packedSize outside size.”
  let compressedImageData: ArrayBuffer = await imagePackerApi.packing(imageSource, packOpts);
}

正常执行的代码:

async compressToTargetRange(inputImageBuffer: ArrayBuffer, //这个输入的图片是png格式
maxCompressedImageSize: number, minCompressedImageSize: number,
needResize: boolean = false): Promise<ArrayBuffer> {
  let inputImageByteLength = inputImageBuffer.byteLength
  // 创建图像编码ImagePacker对象
  const imagePackerApi = image.createImagePacker();
  const imageSource = image.createImageSource(inputImageBuffer);
  const MIN_IMAGE_QUALITY = 100;
  const packOpts: image.PackingOption = {
    format: "image/png", quality: MIN_IMAGE_QUALITY,
    bufferSize: inputImageByteLength + 1 //这里在输入文件大小的基础上+1
  };
  // compressedImageData为打包获取到的图片文件流。
  //执行结果正常
  let compressedImageData: ArrayBuffer = await imagePackerApi.packing(imageSource, packOpts);
}

1、为什么bufferSize+1后执行正常,这个是api的bug吗?

2、bufferSize不是输入的缓冲区大小吗,为什么会影响到结果输出。

阅读 460
1 个回答

目前对图片大小编码需要指定内存空间的大小,未指定时默认的内存空间为10MB,当指定的内存空间小于图片大小时,会报错out of max size,为避免报错,可以先获取图片大小,然后将内存空间设置得大于图片大小。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进