当前位置: 首页 > news >正文

前端图片压缩方案及代码实现

1. 为什么要进行图片压缩?

随着互联网的发展,图片在各种网站和应用中铺天盖地,运营人员在后台管理系统中上传图片时常常忽略的图片的体积大小,随之产生的带宽和服务器容量也大大增加,图片压缩的需求随之产生。

常见的压缩图片的方案有:

1. 将图片压缩后再上传;

2. 利用图床(图片服务器)压缩图片;

虽然图片压缩过后体积会小一些,但是为了加载的更快,常常还会采用以下一些配套加载方案。

1. 图片懒加载,延迟加载甚至不加载,可以更快的渲染出页面轮廓,同时也可以减少并发请求数,有利于服务端;

2. 图片预加载,提前加载图片,当用户需要查看时可直接从本地缓存中渲染;

3. 图片流式加载,本质上来说这个也是属于预加载的一种,它是将大量的图片分页进行预加载,抖音的滑屏滚动就是这种方式;

2. 前端图片压缩方案

前端实现图片压缩的基本思路为:在上传图片时,将file转换成image对象, 然后再利用canvas及其 api 将图片压缩成指定体积。

 

3. 前端图片压缩方案代码实现

首先将file转换成image对象,这里我们用到了FileReader这个API。

// 压缩前将file转换成image对象
function readImg(file) {

    return new Promise((resolve, reject) => {

        const image = new Image();
        const reader = new FileReader();

        reader.onload = function (e) {
            image.src = e.target.result
        };

        reader.onerror = function (e) {
            reject(e)
        };
        reader.readAsDataURL(file);

        image.onload = function () {
            resolve(image)
        };

        image.onerror = function (e) {
            reject(e)
        };
    })
}

以下是图片压缩方法的代码实现:

/**
 * @param img      被压缩的img对象
 * @param type     压缩后转换的文件类型
 * @param mx       触发压缩的图片最大宽度限制
 * @param mh       触发压缩的图片最大高度限制
 * @param quality  图片质量
*/

function compressImg(img, type, mx, mh, quality) {
    
    return new Promise((resolve, reject) => {

        const canvas = document.createElement('canvas');
        const context = canvas.getContext('2d');
        const {originWidth, originHeight} = img;

        // 最大尺寸
        const maxWidth = mx;
        const maxHeight = mh;

        // 目标尺寸
        let targetWidth = originWidth;
        let targetHeight = originHeight;

        if (originWidth > maxWidth || originHeight > maxHeight){
            if (originWidth / originHeight > 1) {
                // 图片宽
                targetWidth = maxWidth
                targetHeight = Math.round(maxWidth * (originHeight / originWidth))
            } else {
                // 图片高
                targetHeight = maxHeight
                targetWidth = Math.round(maxHeight * (originWidth / originHeight))
            }
        };

        canvas.width = targetWidth;
        canvas.height = targetHeight;

        context?.clearRect(0, 0, targetWidth, targetHeight);
        // 图片绘制
        context?.drawImage(img, 0, 0, targetWidth, targetHeight);

        canvas.toBlob(function (blob) {
            resolve(blob)
        }, type || 'image/png', quality?quality:1);
    })
}

相关文章:

  • layui框架学习(1:布局)
  • ArrayList扩容机制~
  • 数据挖掘,计算机网络、操作系统刷题笔记36
  • 如何在IDEA中使用Maven构建Java项目?Maven的使用详细解读
  • 【stl -- 常用算法】
  • python图像处理(图像缩放)
  • 电商项目之同一笔单多次收款成功
  • OpenFeign总结
  • 【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…
  • 计算机网络01_---软考高级系统架构师010
  • 【Linux】冯诺依曼体系结构与操作系统概念理解
  • 【c语言进阶】枚举与联合体的基本知识大全
  • Python与Matlab混合编程案例
  • 排列的时候如何避免重复?
  • 芒果改进YOLOv5系列:原创结合Conv2Formers改进结构,Transformer 风格的卷积网络视觉基线模型,超越ConvNeXt结构
  • 【译】JS基础算法脚本:字符串结尾
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Angular6错误 Service: No provider for Renderer2
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • EOS是什么
  • Fabric架构演变之路
  • If…else
  • leetcode98. Validate Binary Search Tree
  • node-glob通配符
  • PHP CLI应用的调试原理
  • storm drpc实例
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 利用jquery编写加法运算验证码
  • 使用 Docker 部署 Spring Boot项目
  • 网络应用优化——时延与带宽
  • 我的zsh配置, 2019最新方案
  • 用Canvas画一棵二叉树
  • 用jQuery怎么做到前后端分离
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 阿里云服务器如何修改远程端口?
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 数据可视化之下发图实践
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • $jQuery 重写Alert样式方法
  • (4.10~4.16)
  • (待修改)PyG安装步骤
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .net中调用windows performance记录性能信息
  • .net中应用SQL缓存(实例使用)
  • @GlobalLock注解作用与原理解析
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [ARC066F]Contest with Drinks Hard
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [javaSE] 看知乎学习工厂模式
  • [jQuery]div滚动条回到最底部