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宽度的实现思路与代码
Jan 13 Javascript
使用jquery自定义鼠标样式满足个性需求
Nov 05 Javascript
通过url查找a元素应用案例
Apr 29 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
Mar 25 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
Jun 16 Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
angular2+node.js express打包部署的实战
Jul 27 Javascript
详解vue中localStorage的使用方法
Nov 22 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 Javascript
原生js实现随机点名功能
Nov 05 Javascript
vue+canvas实现拼图小游戏
Sep 18 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
php加密解密字符串示例
2016/10/13 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
PDO实现学生管理系统
2020/03/21 PHP
读jQuery之十 事件模块概述
2011/06/27 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
python 多线程应用介绍
2012/12/19 Python
用python实现面向对像的ASP程序实例
2014/11/10 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Python实现网站表单提交和模板
2019/01/15 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
Linux如何为某个操作添加别名
2015/02/05 面试题
如何客观的进行自我评价
2013/12/17 职场文书
论文评语大全
2014/04/29 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
心灵点滴观后感
2015/06/02 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
Java 数组的使用
2022/05/11 Java/Android
JS函数式编程实现XDM一
2022/06/16 Javascript