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实现的Div窗口震动特效
Jun 09 Javascript
jQuery的load()方法及其回调函数用法实例
Mar 25 Javascript
js生成随机数的方法实例
Oct 16 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
Apr 18 Javascript
简单解析JavaScript中的__proto__属性
May 10 Javascript
详解webpack异步加载业务模块
Jun 23 Javascript
详解如何使用webpack在vue项目中写jsx语法
Nov 08 Javascript
Vue项目分环境打包的实现步骤
Apr 02 Javascript
深入理解JavaScript的async/await
Aug 05 Javascript
Js中使用正则表达式验证输入是否有特殊字符
Sep 07 Javascript
浅谈Vue.js组件(二)
Apr 09 Javascript
Vue formData实现图片上传
Aug 20 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实现的数字验证码及数字运算验证码
2015/07/30 PHP
php格式文件打开的四种方法
2018/02/24 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
php7下的filesize函数
2019/09/30 PHP
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
Javascript的比较汇总
2016/07/25 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
Djang中静态文件配置方法
2015/07/30 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
python os用法总结
2018/06/08 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
详解重置Django migration的常见方式
2019/02/15 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
kali中python版本的切换方法
2019/07/11 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
python基于win32api实现键盘输入
2020/12/09 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
厨师长岗位职责
2014/03/02 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
公务员个人总结
2015/02/12 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书