实现思路

  • 获取input的file
  • 使用fileReader() 将图片转为base64
  • 使用canvas读取base64 并降低分辨率
  • 把canvas数据转成blob对象
  • 把blob对象转file对象
  • 完成压缩

相关代码:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<input type="file" id="file">
<script>
document.getElementById('file').addEventListener('change',function (e) {
let fileObj = e.target.files[0]
let that = this;
compressFile(fileObj,function (files) {
console.log(files) that.value = '' // 加不加都行,解决无法上传重复图片的问题。 }) }) /**
* 压缩图片
* @param file input获取到的文件
* @param callback 回调函数,压缩完要做的事,例如ajax请求等。
*/
function compressFile(file,callback) {
let fileObj = file;
let reader = new FileReader()
reader.readAsDataURL(fileObj) //转base64
reader.onload = function(e) {
let image = new Image() //新建一个img标签(还没嵌入DOM节点)
image.src = e.target.result
image.onload = function () {
let canvas = document.createElement('canvas'), // 新建canvas
context = canvas.getContext('2d'),
imageWidth = image.width / 2, //压缩后图片的大小
imageHeight = image.height / 2,
data = ''
canvas.width = imageWidth
canvas.height = imageHeight
context.drawImage(image, 0, 0, imageWidth, imageHeight)
data = canvas.toDataURL('image/jpeg') // 输出压缩后的base64
let arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1], // 转成blob
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
let files = new window.File([new Blob([u8arr], {type: mime})], 'test.jpeg', {type: 'image/jpeg'}) // 转成file
callback(files) // 回调
}
}
}
</script>
</body>
</html>

最后回调函数中的files可以直接当做正常的input file 使用,如果后续涉及到ajax,可以直接放到formData() 里。

本例除文中源码外,不另外提供源码。

参考地址1:https://blog.csdn.net/yasha97/article/details/83629057
参考地址2:https://blog.csdn.net/yasha97/article/details/83629510

在原文章基础上添加了blob => file的对象转化。

最新文章

  1. Topshelf 学习 跨平台
  2. Linear Algebra lecture6 note
  3. easyui combobox 中实现 checkbox
  4. 截获控制台程序关闭事件(SetConsoleCtrlHandler)
  5. Wing ide 6.0 注册 ,python 3.6环境
  6. Virtualization
  7. Reactor和Proactor
  8. IT十年经典书籍
  9. android设置透明度代码片段
  10. SAP Tax Service可以取代TAXBRA / RVABRA吗?(翻译) 跨国贸易云税务解决方案
  11. JDBC driver for MySQL连接提示&quot;The connection property &#39;zeroDateTimeBehavior&#39; acceptable values are: &#39;CONVERT_TO_NULL&#39;, &#39;EXCEPTION&#39; or &#39;ROUND&#39;. The value &#39;convertToNull&#39; is not acceptable.&quot;解决方案
  12. Flask学习【第11篇】:整合Flask中的一些知识点
  13. js如何调试,使用debug模式
  14. gdb入门
  15. vue 调用第三方接口配置
  16. 《Linux内核分析》第一周学习报告
  17. mavean导入本地仓库
  18. Android笔记:解决 Your project contains error(s),please fix them before running your application问题
  19. C#的Lambda 表达式都使用 Lambda 运算符 =&gt;,该运算符读为“goes to”。语法如下:
  20. Supervisor安装与配置

热门文章

  1. Spring Boot 项目 application.properties配置说明
  2. vue+elementui搭建后台管理界面(7 vuex和mockjs的使用)
  3. Netty回调与Channel执行流程分析
  4. web服务器请求代理方式
  5. Java算法 -- 桶排序
  6. [译]如何比较master分支上与git上任意的一个老版本的区别?
  7. 查询、下载GWAS目录数据的R包(gwasrapidd)
  8. 安防视频互联网化的EasyDSS流媒体服务器不但能Easy安防流媒体的开发而且能更加互联网化视频协议的输出
  9. babelrc笔记
  10. java打包小记