JS和Canvas实现图片的预览压缩和上传功能


Posted in Javascript onMarch 30, 2018

先来一张效果图,压压惊

JS和Canvas实现图片的预览压缩和上传功能

第一步:用户选择需要上传的图片

<input type="file" accept="image/*" type="file"" name="imageFile" onchange="upload()">

在选定了图片后 upload 函数将被触发,我们需要在这个函数中,获取到图片的资源,将它压缩并利用canvas绘制出来,若需要上传到服务器,也可以利用ajax或者其他方式上传。

第二步:获取图片资源压缩预览上传

function upload() { 
  let file = document.querySelector('input[type=file]').files[0] // 获取选择的文件,这里是图片类型 
  let reader = new FileReader() 
    reader.readAsDataURL(file) //读取文件并将文件以URL的形式保存在resulr属性中 base64格式 
    reader.onload = function(e) { // 文件读取完成时触发  
      let result = e.target.result // base64格式图片地址  
      var image = new Image() image.src = result // 设置image的地址为base64的地址  
      image.onload = function(){  
        var canvas = document.querySelector("#canvas");  
        var context = canvas.getContext("2d");  
        canvas.width = image.width; // 设置canvas的画布宽度为图片宽度  
        canvas.height = image.height;  
        context.drawImage(image, 0, 0, image.width, image.height) // 在canvas上绘制图片  
        let dataUrl = canvas.toDataURL('image/jpeg', 0.92) // 0.92为压缩比,可根据需要设置,设置过小会影响图片质量  
                                  // dataUrl 为压缩后的图片资源,可将其上传到服务器  
      }  
    } 
 }

现在我们来比较一下图片是否成功压缩:

原图大小: 

JS和Canvas实现图片的预览压缩和上传功能  

压缩比设置为0.92:

JS和Canvas实现图片的预览压缩和上传功能

压缩比设置为0.52

JS和Canvas实现图片的预览压缩和上传功能

乍一看,你是不是觉得很奇怪,为什么设置了缩放比为0.92,图片居然比原图大?其实图片通过base64编码后都会变的比原图大,具体原因可以查阅base64的编码原理。如此看来,我们已经成功压缩了图片!

注意点:canvas在IE9以下不支持;大图片尽量不要使用base64,影响响应速度。

总结

以上所述是小编给大家介绍的JS和Canvas实现图片的预览压缩和上传功能 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
两个数组去重的JS代码
Dec 04 Javascript
将查询条件的input、select清空
Jan 14 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
Oct 29 Javascript
浅谈Angular的$q, defer, promise
Dec 20 Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 Javascript
深入理解JavaScript中的for循环
Feb 07 Javascript
详解从新建vue项目到引入组件Element的方法
Aug 29 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
Sep 20 jQuery
vue自定义filters过滤器
Apr 26 Javascript
基于jquery实现左右上下移动效果
May 02 jQuery
详解在React-Native中持久化redux数据
May 22 Javascript
使用js实现一个简单的滚动条过程解析
Sep 10 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 #Javascript
基于js中的存储键值对以及注意事项介绍
Mar 30 #Javascript
angular4 共享服务在多个组件中数据通信的示例
Mar 30 #Javascript
js将键值对字符串转为json字符串的方法
Mar 30 #Javascript
webpack4.0打包优化策略整理小结
Mar 30 #Javascript
Angular4学习笔记router的简单使用
Mar 30 #Javascript
vue.js中created方法作用
Mar 30 #Javascript
You might like
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
Cookie 小记
2010/04/01 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
简历里的自我评价
2014/01/31 职场文书
高中军训第一天感言
2014/03/06 职场文书
如何利用golang运用mysql数据库
2022/03/13 Golang
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android