- 尺码表
- 最大宽高等比
- 超过1M继续压缩
// 加载图片,获取图片宽高
const sizeMap = new Map([
['3024_4032', '768_1024'],
['4032_3024', '1024_768'],
['1024_768', '1024_768'],
['800_800', '800_800']
])
/**
* 图片压缩
* @param {File} image 图片
* @param {String} backType 需要返回的类型blob、file
* @param {Number} quality 图片压缩比,数字越小,图片压缩越小
* @return
*/
export const compressorImage = async (image: Buffer) => {
try {
let imageSharp = sharp(image);
const { width: originWidth, height: originHeight } = await imageSharp.metadata()
if(!originWidth || !originHeight){
return image;
}
const size = sizeMap.get(`${originWidth}_${originHeight}`);
if (size) {
const [width, height] = size.split('_');
imageSharp = imageSharp.resize( Number(width), Number(height), { fit: 'inside' });
} else {
// 宽高都低于800,800 跳过缩放
if (originWidth >= 800 && originHeight >= 800) {
imageSharp = originWidth >= originHeight ? imageSharp.resize({ width: 800 }) : imageSharp.resize({ height: 800 })
}
}
// 判断图片大小,如果大于1M继续压缩
const bufferImage= await imageSharp.toBuffer();
if(bufferImage.length > 1024 * 1024){
imageSharp = imageSharp.jpeg({ quality: 80 })
}
return imageSharp
}catch (e){
utilLogger.error(`【压缩图片异常】 ${e.message}`)
return image
}
}