上传图片如何对图片进行压缩canvas
前言:哈喽,朋友们,最近一直在马不停蹄地赶项目,很久没有写博客了。今天我们来看一下前端上传图片地时候如何对图片进行压缩
1、图片上传
我近期写项目都是使用的VUE,这里上传图片使用了Element-ui这个组件库

具体代码如下:
<el-upload
class="avatar-uploader"
action="https://jsonplaceholder.typicode.com/posts/"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload">
<img v-if="imageUrl" :src="data:imageUrl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload> <style>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style> <script>
export default {
data() {
return {
imageUrl: ''
};
},
methods: {
handleAvatarSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw);
},
beforeAvatarUpload(file) {
const isJPG = file.type === 'image/jpeg';
const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG) {
this.$message.error('上传头像图片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!');
}
return isJPG && isLt2M;
}
}
}
</script>
2、选取合适的钩子
这个组件为我们提供了许多钩子
| on-preview | 点击文件列表中已上传的文件时的钩子 | function(file) | — | — | 
| on-remove | 文件列表移除文件时的钩子 | function(file, fileList) | — | — | 
| on-success | 文件上传成功时的钩子 | function(response, file, fileList) | — | — | 
| on-error | 文件上传失败时的钩子 | function(err, file, fileList) | — | — | 
| on-progress | 文件上传时的钩子 | function(event, file, fileList) | — | — | 
| on-change | 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用 | function(file, fileList) | — | — | 
| before-upload | 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。 | function(file) | — | — | 
| before-remove | 删除文件之前的钩子,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止删除。 | function(file, fileList) | — | — | 
我这里选择了before-upload这个钩子,在图片上传前对图片进行压缩
3、对图片进行压缩操作
beforeAvatarUpload(file) {
      const isJPG = file.type === "image/jpeg" || file.type === "image/png";
      const isLt2M = file.size / 1024 / 1024 < 100;
      if (!isJPG) {
        this.$message.error("上传头像图片只能是 jpg、png 格式!");
      }
      if (!isLt2M) {
        this.$message.error("上传头像图片大小不能超过 100MB!");
      }
      if (!isJPG || !isLt2M) {
        return false;
      }
      let me = this;
      let reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = function(e) {
        //图片大于100K压缩
        if (file.size > 1024 * 1024 * 0.1) {
          let img = new Image();
          img.src = this.result;
          img.onload = function() {
            let originWidth = img.width;
            let originHeight = img.height;
            let canvas = document.createElement("canvas");
            let context = canvas.getContext("2d");
            canvas.width = 512; //压缩后的宽度
            canvas.height = (originHeight * canvas.width) / originWidth;
            context.drawImage(img, 0, 0, canvas.width, canvas.height);
            me.form.image = canvas.toDataURL("image/jpeg");
          };
        } else {
          me.form.image = this.result;
        }
      };
      return false; //isJPG && isLt2M;
    },
这里使用的canvas对图片进行压缩,其原理是通过canvas结合js重新绘制一副 2d 图片,然后给canvas画布设置宽高来完成目标图片的压缩。
以上。
上传图片如何对图片进行压缩canvas的更多相关文章
- 前端JS利用canvas的drawImage()对图片进行压缩
		
对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 1.由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致 ...
 - 使用ajax上传图片,并且使用canvas实现出上传进度效果
		
前端代码: <%@ page contentType="text/html;charset=UTF-8" language="java" %> &l ...
 - 分享一个上传图片,图片压缩Unsupported Image Type解决方案
		
http://blog.csdn.net/frankcheng5143/article/details/53185201 *************************************** ...
 - js实现对上传图片的路径转成base64编码,并且对图片进行压缩,实现预览功能1
		
参考 https://blog.csdn.net/qq_31965515/article/details/82975381 https://www.cnblogs.com/zhangdiIT/p/78 ...
 - mac上使用imagealpha命令对图片进行压缩批处理
		
#! /bin/bash #BASE_DIR="/Users/jiading/Documents/basepng"; #OUTPUT_DIR="/Users/jiadin ...
 - 使用chooseImage上传图片,不压缩,使用原图
		
参考文章: https://help.aliyun.com/document_detail/92883.html
 - iOS图片压缩
		
项目中常会遇到,上传图片的操作,由于iPhone手机直接拍照的图片往往比较大,一般3-4M,如果直接上传不做处理会浪费用户很多流量,再者有很多场景并不需要高清图片,所以在上传图片前对图片进行压缩,是很 ...
 - 上传图片时压缩图片 - 前端(canvas)做法
		
HTML前端代码: <?php $this->layout('head'); ?> <?php $this->layout('sidebar'); ?> <m ...
 - js移动端/H5同时选择多张图片上传并使用canvas压缩图片
		
最近在做一个H5的项目,里边涉及到拍照上传图片的功能以及识别图片的功能,这里对识别图片的功能不做赘述,不属本文范畴.我在做完并上线项目后,同事跟我提了一个要求是可不可以同时选择多张图片上传,我做的时候 ...
 
随机推荐
- Web App开发注意事项
			
1.首先我们来看看webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用 <meta content=”width=device-width, ini ...
 - JavaScript中this的指向2(转载)
			
1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法. 2. 相同点:这两个方法的作用是一样的. 都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖 ...
 - svn清理以下路径失败
			
网上说是svn的数据库挂了 删除里免得数据就好了 用sqllite...嗯? 那我还得下载一个?超过五秒钟的工作我是不会去做的 打开navicat 清空表 再次尝试清理
 - GIT → 00:GIT学习大纲
			
1. 学习版本控制的原因 1.1 没有版本控制出现的问题 1.2 版本控制的简介 1.3 版本控制工具 2. Git 和 Svn 比较 2.1 SVN介绍 2.1.1 SVN简介 2.1.2 SVN基 ...
 - python基础--模块的查找顺序以及相对导入和绝对导入
			
模块:模块是一系列功能的结合体 模块的来源: 内置的模块(python解释器自带的) 第三方(开发者编写的模块) 自定义的模块(自己编写的模块) 模块的四种表现形式: 1.使用python编写的py文 ...
 - java.lang.ClassCastException: java.io.ByteArrayInputStream cannot be cast to java.io.FileInputStream
			
今天在做文件上传的时候遇到一个这样的问题 java.lang.ClassCastException: java.io.ByteArrayInputStream cannot be cast to ja ...
 - expect.js
			
前言 1> 借鉴里面的应用思想,使用断言提高代码的健壮性及维护性 2> 实现方式--不采用直接嵌入expect的方式,统一进行重写(提取常用断言方法,重新构造API) 官网介绍 https ...
 - SaaS launch Kit成回收宝和友盟云合作纽带,帮助提升3倍上云效率
			
导语:叶飞表示,全球二手手机市场未来几年将发生巨大变革, 回收宝正进行积极布局.与阿里云开展紧密技术合作,回收宝期待成为这一变革的引领者. 7月26日,在阿里云上海峰会上,阿里云了发布SaaS生态战略 ...
 - android rsa 示例
			
1.参考资料 1.1 android的Cipher官方文档 https://developer.android.com/reference/javax/crypto/Cipher 其中 构造Ciphe ...
 - 最短路 HDU - 2544 (dijkstra算法或Floyd算法)
			
Dijkstra解法: #include <stdio.h> #include <iostream> #include <cstring> #include < ...