当前位置: 首页 > 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结构
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • angular组件开发
  • Docker: 容器互访的三种方式
  • Flannel解读
  • JAVA_NIO系列——Channel和Buffer详解
  • javascript面向对象之创建对象
  • JS函数式编程 数组部分风格 ES6版
  • Laravel Telescope:优雅的应用调试工具
  • Linux下的乱码问题
  • Vue ES6 Jade Scss Webpack Gulp
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 对超线程几个不同角度的解释
  • 关于List、List?、ListObject的区别
  • 爬虫模拟登陆 SegmentFault
  • 时间复杂度与空间复杂度分析
  • 使用putty远程连接linux
  • 我从编程教室毕业
  • 消息队列系列二(IOT中消息队列的应用)
  • 写代码的正确姿势
  • 一起参Ember.js讨论、问答社区。
  • PostgreSQL之连接数修改
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (四)Android布局类型(线性布局LinearLayout)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)shell调试方法
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ******之网络***——物理***
  • . Flume面试题
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ??myeclipse+tomcat
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @取消转义
  • [ NOI 2001 ] 食物链