前后端图片压缩

前后端图片压缩,第1张

近期在做图片相关的内容,将图片压缩的相关内容做个总结。以备后期使用
前端:

使用 js-image-compressor 第三方工具

安装:

npm i js-image-compressor
import ImageCompressor from 'js-image-compressor';

/**
 * 指定大小循环压缩图片,最多压缩5次
 * @param file 文件对象
 * @param maxSize 最大值
 * @returns {Promise<*>} Promise
 */
export async function imageCycleCompressor(file, maxSize) {
    if (file.size <= maxSize * 1024) {
        return file;
    }
    //选择压缩比10M:0.1 5M:0.2 1M:0.3 其他:0.4
    let quality;
    if (file.size >= 1024 * 1024 * 10) {
        quality = 0.1;
    } else if (file.size >= 1024 * 1024 * 1) {
        quality = 0.3;
    } else {
        quality = 0.4;
    }
    let i = 0;
    while (i < 6 && file.size > maxSize * 1024) {
        i++;
        file = await CompressorImage(file, quality);
    }
    return await transToFile(file, file.name, file.type);
}

/**
 * blob转file
 * @param blob blob
 * @param fileName 文件名
 * @param fileType 文件类型
 * @returns {Promise} Promise
 */
export async function transToFile(blob, fileName, fileType) {
    return new window.File([blob], fileName, {type: fileType});
}

/**
 * 指定压缩比单次压缩图片
 * @param file 文件对象
 * @param quality 压缩比
 * @returns {Promise} Promise
 * @constructor constructor
 */
export async function CompressorImage(file, quality) {
    return new Promise((reslove, reject) => {
        try {
            new ImageCompressor({
                file,
                quality: quality,
                success: (result) => {
                    reslove(result);
                },
            });
        } catch (error) {
            reject(error);
        }
    });
}
后端

使用 net.coobird:thumbnailator

public class ImageUtil {
    /**
     * 循环压缩,将指定的图片压缩到小于指定文件大小为止,最大压缩次数为10次
     *
     * @param file           源文件
     * @param thumbnailsFile 缩略图
     * @param maxSize        指定的大小
     * @return File
     * @throws IOException IOException
     */
    public static File cycleCompressionImage(File file, File thumbnailsFile, double maxSize) throws IOException {
        if (file.length() <= maxSize) {
            FileUtils.copyFile(file, thumbnailsFile);
            return thumbnailsFile;
        }
        if (!thumbnailsFile.getParentFile().exists()) {
            thumbnailsFile.getParentFile().mkdirs();
        }
        double scale = getScale(file);
        Thumbnails.of(file).scale(scale).toFile(thumbnailsFile);
        int i = 0;
        while (thumbnailsFile.length() > maxSize && i < Constant.SIX) {
            i++;
            scale = getScale(thumbnailsFile);
            Thumbnails.of(file).scale(scale).toFile(thumbnailsFile);
        }
        return thumbnailsFile;
    }

    private static double getScale(File file) {
        double scale;
        if (file.length() > Constant.RECONVERSION * Constant.RECONVERSION * Constant.TEN) {
            scale = 0.1;
        } else if (file.length() > Constant.RECONVERSION * Constant.RECONVERSION * Constant.ONE) {
            scale = 0.3;
        } else {
            scale = 0.4;
        }
        return scale;
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1297609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存