html5 canvas移动浏览器上实现图片压缩上传


Posted in HTML / CSS onMarch 11, 2016

最近在移动端设计头像上传功能时,原本是以<input type="file">直接通过formData上传,然而实际使用情况是:对于过大的图片(高像素手机所拍摄的照片等)上传时间过长会导致上传失败,而每次都上传原始大小的图片(后台处理压缩)十分影响用户体验,所以研究了一下通过canvas压缩图片并上传的方法,以下是整理的一些思路和心得:

一、<input type="file">获取本地图片,并将图片绘制到画布中。此处的难点在于:由于浏览器的保护机制,无法直接获取到本地文件的图片路径,所以需要将本地图片编译成base64格式再做上传,代码如下:

JavaScript Code复制内容到剪贴板
  1. var result = document.getElementById("/* 出错信息显示块 */");   
  2. var input = document.getElementById("/* 上传文件标签 */");   
  3.   
  4. if(typeof FileReader === 'undefined'){   
  5.   result.innerHTML = "<p class='warn'>抱歉,你的浏览器不支持 FileReader</p>";   
  6.   input.setAttribute('disabled','disabled');   
  7. }else{   
  8.   input.addEventListener('change',readFile,false);   
  9. }   
  10.   
  11. function readFile(){   
  12.   var file = this.files[0];   
  13.   if(!/image\/\w+/.test(file.type)){   
  14.     alert("请确保文件为图像类型");   
  15.     return false;   
  16.   }   
  17.   var reader = new FileReader();   
  18.   reader.readAsDataURL(file);   
  19.   reader.onload = function(e){   
  20.     //  this.result 编译后的图像编码,可直接用src显示   
  21.   }   
  22. }   

二、图像在canvas中的处理

JavaScript Code复制内容到剪贴板
  1. var c=document.getElementById("/* canvas标签的id */");   
  2. var cxt=c.getContext("2d");   
  3. var img=new Image();   
  4. img.src=/* 获取的图片编码地址 */;   
  5. var width = img.width;   
  6. var height = img.height;   
  7. dic = height / width;   
  8. c.width = 200;  //图片压缩的标准,这里是按照定款200px计算   
  9. c.height = 200 * dic;   
  10. cxt.clearRect(0,0,200,200*dic);   
  11. cxt.drawImage(img,0,0,200,200*dic);   
  12. var finalURL = c.toDataURL();     
  13. //  最终得到的 finalURL 即为压缩后的图片编码,可用来上传或者直接生成img标签   

这里需要注意的几点是:

1、本地调试时会有一个报错,原因为跨域问题,需要再服务端调试;

2、canvas中的drawImage()方法具备图像剪裁功能,但将图像拉伸和剪裁同时写入的话,会优先执行剪裁的方法;

3、使用AJAX上传图像编码时,编码内的加号会被转成空格上传导致后台编译失败;

4、关于对图片区域选择上传的方法尚在尝试阶段,后续会补上心得。

以上就是本文的全部内容,希望对大家的学习有所帮助。

原文:http://www.cnblogs.com/liaojh/p/5209433.html

HTML / CSS 相关文章推荐
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
Nov 05 HTML / CSS
利用CSS3实现圆角的outline效果的教程
Jun 05 HTML / CSS
css3实现可拖动的魔方3d效果
May 07 HTML / CSS
纯CSS3制作页面切换效果的实例代码
May 30 HTML / CSS
HTML5实现表单自动验证功能实例代码
Jan 11 HTML / CSS
canvas烟花特效锦集
Jan 17 HTML / CSS
html5指南-1.html5全局属性(html5 global attributes)深入理解
Jan 07 HTML / CSS
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
Jan 09 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
Jan 30 HTML / CSS
一个不错的HTML5 Canvas多层点击事件监听实例
Apr 29 HTML / CSS
html5 冒号分隔符对齐的实现
Jul 31 HTML / CSS
萌新的HTML5 入门指南
Nov 06 HTML / CSS
HTML5实现多张图片上传功能
Mar 11 #HTML / CSS
html5+css3进度条倒计时动画特效代码【推荐】
Mar 08 #HTML / CSS
多视角3D逼真HTML5水波动画
Mar 03 #HTML / CSS
HTML5的新特性(1)
Mar 03 #HTML / CSS
HTML5 Canvas实现烟花绽放特效
Mar 02 #HTML / CSS
多视角3D可旋转的HTML5 Logo动画
Mar 02 #HTML / CSS
探索HTML5本地存储功能运用技巧
Mar 02 #HTML / CSS
You might like
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
关于php中一些字符串总结
2016/05/05 PHP
QQ登录简单实现代码
2021/03/09 Javascript
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
python next()和iter()函数原理解析
2020/02/07 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
求职信格式范本
2013/11/15 职场文书
成绩单家长评语大全
2014/04/16 职场文书
2015年纪委工作总结
2015/05/13 职场文书
走近毛泽东观后感
2015/06/04 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
nginx搭建NFS网络文件系统
2022/04/14 Servers