当前位置:首页 > 技术分析 > 正文内容

【JS 图片压缩】图片压缩至指定大小

ruisui883个月前 (02-03)技术分析13

在做图片上传的时候,为了节省带宽和减少上传时间,前端需要对图片进行压缩。前端图片压缩一般都是使用canvas绘图,然后导出图片。今天分享一下图片大小压缩至指定数值的方法。

场景描述

  1. 支持图片压缩指定数值
  2. 支持图片压缩至原文件的百分比大小
  3. 支持压缩之后的图片大小与指定数值误差在0-2%之间
  4. 支持输出特定质量的图片,默认质量参数0.85

示例图一

图片压缩至20kb左右

//压缩文件至20kb
compressImageWithFixedSize(file, 1024*20)



示例图二

图片压缩至20%左右

//压缩至原文件大小的20%
compressImageWithFixedSize(file, 0.2)


代码

  1. 计算压缩比,根据压缩比进行canvas绘图导出
  2. 计算误差范围
  3. 根据最大数值和误差,递归绘图导出
/**
 * 压缩图片并限制其文件大小
 * @param {File} file - 要压缩的图片文件
 * @param {number} maxSize - 大于1时,为图片的最大文件大小(字节)
 * @param {number} maxSize - 小于1大于0时,为图片最大文件大小百分比
 * @param {number} quality - 图片的压缩质量,默认为0.85
 * @returns {Promise<Blob>} - 压缩后的图片Blob对象
 */
function compressImageWithFixedSize(file, maxSize, quality = 0.85) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        if(maxSize<1&&maxSize>0) {
            maxSize = maxSize*file.size;
        }
      if (file.size <= maxSize) {
            resolve(file);
            return;
        }
        reader.onload = function (event) {
            const img = new Image();
            img.src = event.target.result;

            img.onload = function () {
                const canvas = document.createElement('canvas');
                let width = img.width;
                let height = img.height;

                // 计算初始压缩比例
                //   let ratio = Math.sqrt((maxSize * 1024) / (width * height));
                let ratio = (maxSize / file.size);
                console.log('ratio',ratio)
                if (ratio < 1) {
                    width *= ratio;
                    height *= ratio;
                }

                canvas.width = width;
                canvas.height = height;

                const ctx = canvas.getContext('2d');
                ctx.drawImage(img, 0, 0, width, height);

                const PERCENTAGE = 0.98;
                const minsize = maxSize * PERCENTAGE;
                const checkSize = (blob) => {
                    
                    if (blob?.size <= maxSize && blob?.size >= minsize) {
                        resolve(blob);
                    } else {
                        if(blob?.size<minsize) {
                            ratio += 0.005;
                        }

                        width = Math.ceil(img.width * ratio);
                        height = Math.ceil(img.height * ratio);
                        canvas.width = width;
                        canvas.height = height;
                        ctx.drawImage(img, 0, 0, width, height);
                        canvas.toBlob(checkSize, 'image/jpeg', quality);
                    }
                };

                canvas.toBlob(checkSize, 'image/jpeg', quality);
            };
        };

        reader.onerror = function (error) {
            reject(error);
        };

        reader.readAsDataURL(file);
    });
}

这种将图片压缩至指定大小的方法比较适合一些对图片质量要求不高,缩略图展示,预览图等场景,比如头像上传,商品缩略图,图片预览。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1457.html

标签: img 大小
分享给朋友:

“【JS 图片压缩】图片压缩至指定大小” 的相关文章

Linux发行版Nobara更新39版本,号称“专为游戏玩家定制”

IT之家 12 月 27 日消息,Linux 发行版 Nobara 今天推出了 39 版本,主要改进了“Gamescope 合成器”,并更新了 OBS Studio、部分驱动程序及 Nautilus 文件管理器,小伙伴们可以点此访问项目地址。IT之家经过查询得知,Nobara 是一款基于 Fedor...

vue中如何在自定义组件上使用v-model和.sync

自定义事件tips推荐始终使用 kebab-case 的事件名。(v-on会将事件名自动转换为小写,避免匹配不到)changeData ×change-data √自定义组件的v-model用法:父组件定义数据源(不需要定义修改数据的方法),在子组件标签上通过v-model="data...

GitLab-创建分支

描述分支是独立的生产线,是开发过程的一部分。分支的创建涉及以下步骤。创建一个分支步骤1-登录您的GitLab帐户,然后转到“ 项目”部分下的项目。步骤2-要创建分支,请单击“ 存储库”部分下的“ 分支”选项,然后单击“ 新建分支”按钮。步骤3-在“ 新建分支”屏幕中,输入分支的名称,然后单击“ 创建...

基于gitlab的PR操作教程

基于gitlab的PR操作教程注:该教程主要基于git命令行操作,其他图形化工具也可完成以下所有操作步骤,顺手即可。推荐工具:Source Tree ,TortoiseGit参考:gitflow一 . 基于分支的PR操作1. 本地切换到master分支1. 拉取最新代码2. 基于master创建ho...

「Git迁移」三行命令迁移Git包含提交历史,分支,tag标签等信息

问题描述:公司需要将一个git远程服务器的全部已有项目迁移到一台新服务器的Gitlab中,其中需要包含全部的提交纪录,已有的全部分支与全部打tag标签,目前此工作已全部迁移完毕,特此记录一下操作步骤环境描述:1. 要迁移的远程Git:Gitblit2. 迁移目的Git:Gitlab3. 暂存代码的P...

国产操作系统上Vim的详解03--安装和使用插件 | 统信 | 麒麟 | 中科方德

原文链接:国产操作系统上Vim的详解03--使用Vundle插件管理器来安装和使用插件 | 统信 | 麒麟 | 中科方德Hello,大家好啊!今天给大家带来一篇在国产操作系统上使用Vundle插件管理器来安装和使用Vim插件的详解文章。Vundle是Vim的一款强大的插件管理器,可以帮助我们轻松地安...