1. 尺码表
  2. 最大宽高等比
  3. 超过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
    }
}