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

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

ruisui885个月前 (02-03)技术分析23

在做图片上传的时候,为了节省带宽和减少上传时间,前端需要对图片进行压缩。前端图片压缩一般都是使用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 图片压缩】图片压缩至指定大小” 的相关文章

Beta版Linux Mint“Xia”发行版22.1发布

IT之家 12 月 13 日消息,Beta 版 Linux Mint“Xia” 22.1 昨日(12 月 12 日)发布,新版本基于 Ubuntu 24.04,内核版本为 Linux 6.8,长期支持将持续到 2029 年,为用户提供可靠稳定的使用体验。新版本在软件包管理方面,主要弃用了传统的 ap...

vue 3 学习笔记 (八)——provide 和 inject 用法及原理

在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传很多次,会很麻烦。像这种情况,可以使用 provide 和 inject 解决这种问题,不论组件嵌套...

使用cgroup限制进程资源

这里使用containerd项目中的cgroup包来实现进程资源限制。先写一个耗费一个CPU并且一秒增加10m内存的测试进程package mainimport ( "fmt" "math/rand" "time")func main() { go f...

摄影后期必看 | PS插件camera raw 16.4教程 | 范围蒙版

范围蒙版Camera Raw 【蒙版】模块中提供了三个范围蒙版工具,可以通过特定的范围来创建蒙版。此次新增的【范围蒙版】大大加强了acr插件对局部调整的能力。点击下拉小箭头可以看到【颜色范围】,可用于快速选择想要编辑的颜色。快捷键:Shift + C【明亮度范围】,可用于快速选择想要调整的明亮度。快...

再来一波黑科技工具,低调使用

静读天下静读天下是一个特别优秀的电子书阅读器。它上面有多个在线书库,像古登堡计划,很多种优秀的书杂志,都可以下载来阅读。它还能智能识别章节功能,还支持外置的语音阅读功能。它支持多种文本格式,比如说txt,pdf,epub,mobi等等。为了便于阅读它还有10 种配色方式,还有夜间模式。不过免费版有广...

原生微信小程序打包成安卓/IOS应用!#小程序开发

原生微信小程序打包成公。好消息,微信小程序可以直接打包成APP了你们知道吗?微信团队近日开发了一个多端开发平台。多端据文档描述,多端开发框架是支持使用小程序原生语法开发移动端应用的框架。开发者可以一次编码分别编译为小程序安卓以及iOS应用,实现多端开发。我们进入多端框架开发的文档,来看看怎么使用微信...