使用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不是输入的缓冲区大小吗,为什么会影响到结果输出。
目前对图片大小编码需要指定内存空间的大小,未指定时默认的内存空间为10MB,当指定的内存空间小于图片大小时,会报错out of max size,为避免报错,可以先获取图片大小,然后将内存空间设置得大于图片大小。