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

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

var result = document.getElementById("/* 出错信息显示块 */");
var input = document.getElementById("/* 上传文件标签 */");if(typeof FileReader === 'undefined'){result.innerHTML = "<p class='warn'>抱歉,你的浏览器不支持 FileReader</p>";input.setAttribute('disabled','disabled');
}else{input.addEventListener('change',readFile,false);
}function readFile(){var file = this.files[0];if(!/image\/\w+/.test(file.type)){alert("请确保文件为图像类型");return false;}var reader = new FileReader();reader.readAsDataURL(file);reader.onload = function(e){//  this.result 编译后的图像编码,可直接用src显示}
}

二、图像在canvas中的处理

var c=document.getElementById("/* canvas标签的id */");
var cxt=c.getContext("2d");
var img=new Image();
img.src=/* 获取的图片编码地址 */;
var width = img.width;
var height = img.height;
dic = height / width;
c.width = 200;  //图片压缩的标准,这里是按照定款200px计算
c.height = 200 * dic;
cxt.clearRect(0,0,200,200*dic);
cxt.drawImage(img,0,0,200,200*dic);
var finalURL = c.toDataURL();
//  最终得到的 finalURL 即为压缩后的图片编码,可用来上传或者直接生成img标签

这里需要注意的几点是:

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

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

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

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

转载于:https://www.cnblogs.com/liaojh/p/5209433.html

CANVAS运用-对图片的压缩上传(仅针对移动浏览器)相关推荐

  1. ie js html 压缩,H5图片裁剪-压缩-上传-神奇的Croppie.js

    Croppie.js之图片裁剪压缩上传 h5图片裁剪, 压缩, 上传, 预览是常见功能, 幸运的是我们有cropp.js这款利器. 1. style .actions button, .actions ...

  2. uniapp小程序图片前端压缩上传

    目录 1,前言 2,实现代码 1,前言 这次项目中做了一个图片上传,要求是大于2MB的就压缩成2MB一下的再上传,我这边利用了uniapp的文件接口,使用canvas做了一个压缩上传的功能,目前已上线 ...

  3. jquery获取图片并压缩上传

    话不多说,直接上代码: <input id="input-file" type="file" multiple="multiple" ...

  4. 前端实现图片压缩上传功能

    以移动端为例,在H5上传图片时,由于机型 / 网速 / 流量等限制,在低版本机型上经常会出现上传的图片太大导致上传很慢甚至崩溃的情况,所以需要对在某些情况下需要对上传的图片进行压缩上传. 以下以移动端 ...

  5. JS—图片压缩上传(单张)

    *vue+webpack环境,这里的that指到vue实例 <input type="file" name="file" accept="ima ...

  6. [html] 如何使用html5进行图片压缩上传?

    [html] 如何使用html5进行图片压缩上传? 1.获取到图片的base64格式: 2.图片加载完成后,把图片转化为canvas: 3.使用canvas的toDataURL按照自己的需要进行压缩: ...

  7. js 图片压缩上传(base64位)以及上传类型分类

    一.input file上传类型 1.指明只需要图片 <input type="file" accept='image/*'> 2.指明需要多张图片 <input ...

  8. 前端图片压缩上传(纯js的质量压缩,非长宽压缩)

    前端图片压缩上传(纯js的质量压缩,非长宽压缩) 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> ...

  9. JS 图片压缩上传并在iOS中矫正方向

    JS 图片压缩上传并在iOS中矫正方向 最近在项目中,用到图片上传.如果不进行压缩再上传的话,动辄34兆的图片,上传起来会相当漫长.还有一点就是,在iOS中所拍摄的图片在本地显示是没有问题的,但是上传 ...

最新文章

  1. springboot读取linux文件_SpringBoot读取Resource下文件的几种方式
  2. 计算机一级b需要学哪些,希望通过江苏省计算机一级B考试的同学千万要看哦!江苏省计算机一级B理论复习资料(绝密资料)...
  3. Mono for android,Xamarin点击事件的多种写法
  4. djiango配置mysql_数据库MySQL相关环境配置以及数据库与Go的连接
  5. 查看so库中是否有某个定义_论Linux ELF中动态库符号重定义利用 属性/Linker 做隐藏的手法...
  6. VC++动态链接库(DLL)编程深入浅出(四)(转)
  7. 2021年下半年信息安全工程师上午真题及答案解析
  8. 计算机组成原理期末考试题库(超级多的那种)
  9. 用什么录屏软件能录制高清视频
  10. win10设置无盘服务器,win10系统无盘安装系统的操作方法
  11. HTML 密码加密方法
  12. 数据库篇--update触发器
  13. win10 系统无法远程桌面连接到服务器,Win10系统不能建立远程桌面连接总是连接不上如何解决...
  14. linux u盘 驱动怎么安装步骤,怎样利用U盘加载控制器驱动安装Linux系统?
  15. leetcode之Kth Largest Element in an Array
  16. 逆向破解——win7-vm逆向平台搭建
  17. Android 如何让你的App分享给别人
  18. JQuery 的添加元素
  19. Intel HAXM is required to run this AVD.HAXM is not installed.
  20. 米家电磁炉显示e10_米家电磁炉深度使用解析 这才是我想要的

热门文章

  1. 目标检测 dcn v2_使用Detectron2分6步进行目标检测
  2. opencv图像深度-1_OpenCV空间AI竞赛之旅(第1部分-初始设置+深度)
  3. pthread 线程退出时自动释放资源
  4. kaggle数据集_ArXiv170万篇论文数据集上线Kaggle!
  5. 入Java_初入Java的方法
  6. centos 卸载_CentOS「linux」学习笔记12:磁盘管理、分区挂载卸载操作
  7. body onload 控制窗口大小 html,HTML5 对各个标签的定义与规定:body的介绍
  8. java生成密码_java生成密码生成 | 学步园
  9. python中的print
  10. Servlet-三大域对象