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

前端 JS 压缩图片的思路(附源码)

前言

相信大家都做过图片上传相关的功能,在图片上传的过程中,不知道大家有没有考虑过文件体积的问题,如果我们直接将原图片上传,可以图片体积比较大,一是上传速度较慢,二是前端进行渲染时速度也比较慢,比较影响客户的体验感。所以在不影响清晰度的情况下,前端可以在上传前对图片的大小体积进行压缩,压缩到一个比较合适的大小进行上传,本文就带大家一起来看看前端 JS 如何实现图片压缩,有需要的小伙伴抓紧收藏一下吧!

原理(必看)

省流:主要使用 canvas的 drawImage 方法先绘制为 canvas 图像,再结合 toDataURL 转化为DataURl 进行存储图片链接。

drawImage简单介绍

Canvas 2D API 中的 CanvasRenderingContext2D.drawImage() 方法提供了多种在画布Canvas)上绘制图像的方式。

用法如下:

CanvasRenderingContext2D.drawImage() - Web API 接口参考 | MDN (mozilla.org)

语法如下:

drawImage(image, dx, dy);
drawImage(image, dx, dy, dWidth, dHeight);
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

 我们使用第二种进行绘制,参数含义如下:

image:绘制到上下文的元素。

dximage 的左上角在目标画布上 X 轴坐标。

dy:image 的左上角在目标画布上 Y 轴坐标。

dWidth:image 在目标画布上绘制的宽度。允许对绘制的 image 进行缩放。如果不说明,在绘制时 image 宽度不会缩放。

dHeight:image 在目标画布上绘制的高度。允许对绘制的 image 进行缩放。如果不说明,在绘制时 image 高度不会缩放。

简单示例

注意:如果随意的修改图像的尺寸,会导致图像失真,我们可以先获取到图像资源的原始尺寸,然后进行等比缩放,意思就是当我们确定设置宽度之后,高度要进行等比调整。公式就是交叉相乘积相等。

        // 如果宽度设置为 500, 那么高度也应该进行等比缩放
        // naturalWidth         =>  500
        // naturalHeight        =>  X
        // naturalWidth * X     =   naturalHeight * 500

       //  计算得出高度
        X =   naturalHeight * 500 / naturalWidth

相关文章:

  • Android-AR眼镜屏幕显示
  • 数字后端概念——FinFET/Nanosheet FET
  • 数据结构进阶篇 之 【二叉树链序存储】的整体实现讲解
  • 哈希表以及哈希表的底层结构 --- 万字解说【c++11】
  • 第十四届蓝桥杯JavaA组省赛真题 - 特殊日期
  • python函数参数中独立星号*的作用
  • 小狐狸JSON-RPC:钱包连接,断开连接,监听地址改变
  • es6的核心语法
  • OpenGL的MVP矩阵理解
  • 专业130+总分410+西南交通大学924信号与系统考研经验西南交大电子信息通信工程,真题,大纲,参考书。
  • 【概率基础】从概率角度去解释回归和分类的主要区别是什么?
  • 文本文件操作
  • 设计模式 —— 设计原则
  • 前端-包管理器
  • MR混合现实情景实训教学系统在军事演练课堂中的教学应用
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 2019年如何成为全栈工程师?
  • canvas 五子棋游戏
  • ES6 学习笔记(一)let,const和解构赋值
  • js作用域和this的理解
  • yii2中session跨域名的问题
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • - 概述 - 《设计模式(极简c++版)》
  • 力扣(LeetCode)357
  • 前端技术周刊 2019-02-11 Serverless
  • 王永庆:技术创新改变教育未来
  • 在Mac OS X上安装 Ruby运行环境
  • MyCAT水平分库
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Linux(权限管理)
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)丶RabbitMQ的六大核心
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (力扣)1314.矩阵区域和
  • (未解决)macOS matplotlib 中文是方框
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Linq学习笔记
  • (转)甲方乙方——赵民谈找工作
  • (转)树状数组
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • /bin/rm: 参数列表过长"的解决办法
  • @ConditionalOnProperty注解使用说明
  • @ConfigurationProperties注解对数据的自动封装
  • @EventListener注解使用说明