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实现unicode和字符的互相转换
Jul 18 Javascript
js取得url地址参数实例
Feb 22 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
Dec 12 Javascript
无刷新预览所选择的图片示例代码
Apr 02 Javascript
JS和JQ的event对象区别分析
Nov 24 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
Sep 01 Javascript
jquery树形菜单效果的简单实例
Jun 06 Javascript
JS实现鼠标移上去显示图片或微信二维码
Dec 14 Javascript
webpack入门必知必会
Jan 16 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
Mar 06 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
javaScript把其它类型转换为Number类型
Oct 13 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
mysql 性能的检查和优化方法
2009/06/21 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
js 判断 enter 事件
2009/02/12 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
python set集合使用方法解析
2019/11/05 Python
python内置模块collections知识点总结
2019/12/19 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
班组安全员工作职责
2014/02/01 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
北京奥运会主题口号
2014/06/13 职场文书
期末考试复习计划
2015/01/19 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
欠条范文
2015/07/03 职场文书
2019 入党申请书范文
2019/07/10 职场文书
nginx日志格式分析和修改
2022/04/28 Servers
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB