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 相关文章推荐
Javascript数组的排序 sort()方法和reverse()方法
Jun 04 Javascript
jQuery焦点图切换特效插件封装实例
Aug 18 Javascript
简单的jQuery banner图片轮播实例代码
Mar 04 Javascript
jQuery简单入门示例之用户校验demo示例
Jul 09 Javascript
Angularjs 制作购物车功能实例代码
Sep 14 Javascript
vue.js表格组件开发的实例详解
Oct 12 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
React-Native之定时器Timer的实现代码
Oct 04 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 Javascript
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
Aug 02 Javascript
JS数组求和的常用方法实例小结
Jan 07 Javascript
小程序api实现promise封装过程解析
Nov 21 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脚本
2006/11/26 PHP
php简单提示框alert封装函数
2010/08/08 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Django 请求Request的具体使用方法
2019/11/11 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
化工工艺专业求职信
2013/09/22 职场文书
中学生差生评语
2014/01/30 职场文书
工艺员岗位职责
2014/02/11 职场文书
罚站检讨书
2015/01/29 职场文书
2015年行政部工作总结
2015/04/28 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫