js实现纯前端压缩图片


Posted in Javascript onNovember 16, 2020

本文实例为大家分享了js实现纯前端压缩图片的具体代码,供大家参考,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>压缩图片</title>
</head>
<body>
 <input id='file' type="file">
 <script>
  var eleFile = document.querySelector('#file')
  var file;
  var render = new FileReader(), img = new Image();
  render.onload = function(e) {
   img.src = e.target.result
  }
  // 获取图片文件
  eleFile.addEventListener('change', function(e) {
   file = e.target.files[0];
   if(file.type.indexOf('image') === 0) {
    //读取文件,并返回一个URL格式的Base64字符串
    render.readAsDataURL(file)
   }
  })
 
  //使用canvas把图片画出来
  var canvas = document.createElement('canvas');
  var context = canvas.getContext('2d');
 
  img.onload = function() {
 
   //原始尺寸
   var originWidth = this.width;
   var originHeight = this.height;
 
   //最大尺寸限制
   var maxWidth = 200, maxHeight = 200
 
   // 目标尺寸
   var targetWidth = originWidth, targetHeight = originHeight;
 
   //当原始尺寸大于200*200时候
   if(originWidth > maxWidth || originHeight > maxHeight) {
    if(originWidth / originHeight > maxWidth / maxHeight) {
     //更宽
     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 转为blob并上传
   canvas.toBlob(function(blob) {
    try {
     var xhr = new XMLHttpRequest();
     xhr.onreadystatechange = function() {{
      if(xhr.status == 200) {
 
      }
     }}
     //开始上传
     xhr.open('POST','upload.php', true);
     xhr.send(blob)
    } catch (error) {
     console.log(error)
    }
    
   }, file.type || 'image/png')
   //在页面预览原图片
   var div1 = document.createElement('div')
   div1.innerText = '原图:'
   document.body.appendChild(div1)
   document.body.appendChild(img)
   //canvas预览
   var div2 = document.createElement('div')
   div2.innerText = 'canvas图:'
   document.body.appendChild(div2)
   document.body.appendChild(canvas)
  }
  
 </script>
</body>
</html>

分析:原理是用canvas的生成的图片,控制其大小来进行图片的压缩,需要注意的是,如果图片的尺寸太小,会导致图片模糊,使用时候,注意设置其比例控制。

1、通过FileReader读取图片文件,用 Image来装图片url(可以用来预览)
2、转化成base64字符串模式
3、通过maxWidth,MaxHeight和比例来控制最终的canvas的宽高
4、用canvas画图
5、在把canvas输出blob文件,进行上传

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery动态添加的元素绑定事件处理函数代码
Aug 02 Javascript
JS按字节截取字符长度实例
Nov 20 Javascript
做好七件事帮你提升jQuery的性能
Feb 06 Javascript
JavaScript中奇葩的假值示例应用
Mar 11 Javascript
JS中闭包的经典用法小结(2则示例)
Dec 28 Javascript
js自定义Tab选项卡效果
Jun 05 Javascript
AngularJS实现单一页面内设置跳转路由的方法
Jun 28 Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
Nov 26 Javascript
ES6 Array常用扩展的应用实例分析
Jun 26 Javascript
Element Dialog对话框的使用示例
Jul 26 Javascript
Vue基于localStorage存储信息代码实例
Nov 16 #Javascript
微信小程序自定义底部弹出框动画
Nov 18 #Javascript
vue 封装面包屑组件教程
Nov 16 #Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
Nov 16 #Javascript
小程序实现密码输入框
Nov 16 #Javascript
vue 使用localstorage实现面包屑的操作
Nov 16 #Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
Nov 16 #Javascript
You might like
PHP读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
React优化子组件render的使用
2019/05/12 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python+mysql实现简单的web程序
2014/09/11 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
ubuntu上安装python的实例方法
2019/09/30 Python
浅谈python锁与死锁问题
2020/08/14 Python
如何使用Pytorch搭建模型
2020/10/26 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
高一家长会邀请函
2014/01/12 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
批评与自我批评总结
2014/10/17 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
React Fragment介绍与使用详解
2021/11/11 Javascript
Python安装使用Scrapy框架
2022/04/12 Python