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 相关文章推荐
关于ExtJS4.1:快捷键支持的问题
Apr 24 Javascript
使用js操作css实现js改变背景图片示例
Mar 10 Javascript
js字符串完全替换函数分享
Dec 03 Javascript
javascript实现字符串反转的方法
Feb 05 Javascript
js实时获取窗口大小变化的实例代码
Nov 18 Javascript
JS实现拖拽的方法分析
Dec 20 Javascript
jQuery选择器之子元素选择器详解
Sep 18 jQuery
使用 Javascript 实现浏览器推送提醒功能的示例
Nov 03 Javascript
详解javascript 正则表达式之分组与前瞻匹配
May 30 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
Dec 06 Javascript
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 Vue.js
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
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
javascript 命名规则 变量命名规则
2010/02/25 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
Python list与NumPy array 区分详解
2019/11/06 Python
Python PIL库图片灰化处理
2020/04/07 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
python爬虫 requests-html的使用
2020/11/30 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
临床医师专业个人自我评价
2014/01/08 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
美丽的大脚观后感
2015/06/03 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python