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使用手册之三 CSS操作
Mar 24 Javascript
jquery实现页面图片等比例放大缩小功能
Feb 12 Javascript
js设置控件的隐藏与显示的两种方法
Aug 21 Javascript
JavaScript实现广告的关闭与显示效果实例
Jul 02 Javascript
jquery性能优化高级技巧
Aug 24 Javascript
JavaScrip常见的一些算法总结
Dec 28 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
Dec 28 Javascript
JavaScript使用readAsDataURL读取图像文件
May 10 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
Oct 19 Javascript
微信小程序webview 脚手架使用详解
Jul 22 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 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/10/09 PHP
destoon各类调用汇总
2014/06/20 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
jQuery拖拽div实现思路
2014/02/19 Javascript
js style动态设置table高度
2014/10/21 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
Python列表list排列组合操作示例
2018/12/18 Python
python监控nginx端口和进程状态
2019/09/06 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
python线程信号量semaphore使用解析
2019/11/30 Python
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
cf战队收人口号
2014/06/21 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
先进事迹材料范文
2014/12/29 职场文书
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL