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 相关文章推荐
Ext 表单布局实例代码
Apr 30 Javascript
JavaScript Event学习第九章 鼠标事件
Feb 08 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
Jan 24 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
Jan 04 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
Javascript闭包用法实例分析
Jan 23 Javascript
JS中获取函数调用链所有参数的方法
May 07 Javascript
JavaScript里 ==与===区别详解
Aug 16 Javascript
jQuery包裹节点用法完整示例
Sep 13 Javascript
详解微信小程序图片地扯转base64解决方案
Aug 18 Javascript
Vue混入mixins滚动触底的方法
Nov 22 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
Jun 05 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 similar text计算两个字符串相似度
2015/11/06 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
常用的javascript设计模式
2017/01/11 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
Python yield 使用方法浅析
2017/05/20 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
工程项目经理任命书
2014/06/05 职场文书
小学捐书活动总结
2014/07/05 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
企业务虚会发言材料
2014/10/20 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android