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结合PHP+MySQL实现二级联动下拉列表[实例]
Nov 15 Javascript
javascript屏蔽右键代码
May 15 Javascript
javascript实现3D切换焦点图
Oct 16 Javascript
JS修改地址栏参数实例代码
Jun 14 Javascript
Bootstrap被封装的弹层
Jul 20 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
Oct 24 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
Dec 25 Javascript
jQuery实现表格冻结顶栏效果
Aug 20 jQuery
jQuery实现html双向绑定功能示例
Oct 09 jQuery
详解使用webpack打包编写一个vue-toast插件
Nov 08 Javascript
详解Vue2.5+迁移至Typescript指南
Aug 01 Javascript
vue的滚动条插件实现代码
Sep 07 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
德生PL550的电路分析
2021/03/02 无线电
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
JS防止用户多次提交的简单代码
2013/08/01 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
2015/08/05 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
python求pi的方法
2014/10/08 Python
如何将python中的List转化成dictionary
2016/08/15 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
python GUI计算器的实现
2020/10/09 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
中软Java笔试题
2012/11/11 面试题
四个太阳教学反思
2014/02/01 职场文书
岗位聘任书范文
2014/03/29 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
运动会表扬稿范文
2015/05/05 职场文书
务工证明怎么写
2015/06/18 职场文书
Python音乐爬虫完美绕过反爬
2021/08/30 Python