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 相关文章推荐
收藏一些不常用,但是有用的代码
Mar 12 Javascript
jQuery学习笔记之Helloworld
Dec 22 Javascript
Javascript实现重力弹跳拖拽运动效果示例
Jun 28 Javascript
一个JavaScript用逗号分割字符串实例
Sep 22 Javascript
JS长整型精度问题实例分析
Jan 13 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
Oct 30 Javascript
jquery操作select元素和option的实例代码
Feb 03 Javascript
微信小程序图片自适应支持多图实例详解
Jun 21 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
Mar 01 Javascript
webpack dll打包重复问题优化的解决
Oct 10 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
vue中 this.$set的使用详解
Nov 17 Vue.js
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 MSSQL 存储过程的方法
2008/12/24 PHP
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python OpenCV中的resize()函数的使用
2019/06/20 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
python算的上脚本语言吗
2020/06/22 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
鼋头渚导游词
2015/02/05 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书