vue+elementUI(el-upload)图片压缩,默认同比例压缩操作


Posted in Javascript onAugust 10, 2020

如下所示:

vue+elementUI(el-upload)图片压缩,默认同比例压缩操作

这个需求针对用户上传手机拍摄照片等不便修改图片大小的情况,我们允许上传10M以内的图片由前端对图片进行压缩再传给后台存储,结合elementUI的el-upload组件实现图片上传功能(简单来说就是用户是老大)

1、提取出压缩方法,放在公共方法.js文件里

/** 图片压缩,默认同比例压缩
 * @param {Object} fileObj
 * 图片对象
 * 回调函数有一个参数,base64的字符串数据
 */
export function compress(fileObj, callback) {
 try {
 const image = new Image()
 image.src = URL.createObjectURL(fileObj)
 image.onload = function() {
  const that = this
  // 默认按比例压缩
  let w = that.width
  let h = that.height
  const scale = w / h
  w = fileObj.width || w
  h = fileObj.height || (w / scale)
  let quality = 0.7 // 默认图片质量为0.7
  // 生成canvas
  const canvas = document.createElement('canvas')
  const ctx = canvas.getContext('2d')
  // 创建属性节点
  const anw = document.createAttribute('width')
  anw.nodeValue = w
  const anh = document.createAttribute('height')
  anh.nodeValue = h
  canvas.setAttributeNode(anw)
  canvas.setAttributeNode(anh)
  ctx.drawImage(that, 0, 0, w, h)
  // 图像质量
  if (fileObj.quality && fileObj.quality <= 1 && fileObj.quality > 0) {
  quality = fileObj.quality
  }
  // quality值越小,所绘制出的图像越模糊
  const data = canvas.toDataURL('image/jpeg', quality)
  // 压缩完成执行回调
  const newFile = convertBase64UrlToBlob(data)
  callback(newFile)
 }
 } catch (e) {
 console.log('压缩失败!')
 }
}
function convertBase64UrlToBlob(urlData) {
 const bytes = window.atob(urlData.split(',')[1]) // 去掉url的头,并转换为byte
 // 处理异常,将ascii码小于0的转换为大于0
 const ab = new ArrayBuffer(bytes.length)
 const ia = new Uint8Array(ab)
 for (let i = 0; i < bytes.length; i++) {
 ia[i] = bytes.charCodeAt(i)
 }
 return new Blob([ab], { type: 'image/png' })
}

2、el-upload上传组件

<el-form-item ref="uploadElement" prop="picUrl" class="upload-img-form" label-width="0">
 <el-upload
 ref="uploadxls"
 class="avatar-uploader upload-img"
 :disabled="disabled"
 :auto-upload="false"
 :style="{height:'66px', backgroundImage:'url(' + dialogImageUrl + ')', backgroundRepeat:'no-repeat', backgroundPosition:'center', backgroundSize: '100%,100%'}"
 action="aaa"
 ::limit="1"
 :show-file-list="false"
 :on-change="handlePictureCardPreview"
 :before-upload="beforeupload"
 accept="image/png,image/gif,image/jpg,image/jpeg"
 >
 <!--<img v-if="dialogImageUrl" :src="dialogImageUrl" class="avatar">-->
 <i v-if="!dialogImageUrl" class="el-icon-plus avatar-uploader-icon" />
 <!--<i v-show="!dialogImageUrl" class="upload-icon" />
 <div v-show="!dialogImageUrl" slot="tip" class="el-upload__text upload__tip">上传实景图</div>-->
 <div v-if="showDelete" class="remove-img"><i class="el-icon-delete" @click.stop="removeImg" /></div>
 <div slot="tip" class="el-upload__tip">
  <p><span style="color:#F5222D;">*</span>上传楼宇实景图</p>
  <p>支持:.jpg .png .gif格式 建议比例:16:9,小于10M</p>
 </div>
 </el-upload>
</el-form-item>

3、主要在handlePictureCardPreview方法里调用压缩方法

先在当前vue页面import公共js文件

import { compress } from '@/utils'

然后

// 图片预览
handlePictureCardPreview(file) {
 const _that = this
 const isLt10M = file.size / 1024 / 1024 < 10
 if (!isLt10M) {
 this.$message.error('上传图片大小不能超过 10M!')
 return false
 } else {
 this.dialogImageUrl = URL.createObjectURL(file.raw)
 compress(file.raw, function(val) {
  _that.theForm.picUrl = val
  _that.imgFile = val
  _that.showDelete = true
  _that.$refs['addBuildingForm'].validateField('picUrl')
 })
 }
}

compress传入file.raw作为fileObj

这样只要上传图片就进行图片压缩

补充知识:element upload限制上传图片尺寸、大小、比例

我就废话不多说了,大家还是直接看代码吧~

// 上传前判断
  public async beforeUpload(file: any) {
    const is1M = file.size / 1024 / 1024 < 3; // 限制小于3M
    if (!is1M) {
      this.$message.error('图片尺寸限制最小为270 x 270,大小不可超过3MB,比例为1:1');
      return false;
    } else {
      const isSize = new Promise((resolve, reject) => {
        const width = 270;
        const height = 270;
        const _URL = window.URL || window.webkitURL;
        const img = new Image();
        img.onload = () => {
          const valid = img.width >= width && img.height >= height && img.width === img.height;
          valid ? resolve() : reject();
        };
        img.src = _URL.createObjectURL(file);
      }).then(
        () => {
          return file;
        },
        () => {
          this.$message.error('图片尺寸限制最小为270 x 270,大小不可超过3MB,比例为1:1');
          return Promise.reject();
        },
      );
      return isSize;
    }
  }

看了很多还不如自己撸一个

以上这篇vue+elementUI(el-upload)图片压缩,默认同比例压缩操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用apply让javascript函数仅执行一次的代码
Jun 27 Javascript
通过百度地图获取公交线路的站点坐标的js代码
May 11 Javascript
node.js中的http.response.setHeader方法使用说明
Dec 14 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
Dec 22 Javascript
浅谈javascript中关于日期和时间的基础知识
Jul 13 Javascript
js实现表格筛选功能
Jan 18 Javascript
详解使用webpack构建多页面应用
Dec 21 Javascript
Vue组件的使用教程详解
Jan 05 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
May 08 Javascript
微信小程序实现的动态设置导航栏标题功能示例
Jan 31 Javascript
Element ui 下拉多选时新增一个选择所有的选项
Aug 21 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 Javascript
使用vue引入maptalks地图及聚合效果的实现
Aug 10 #Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
Aug 10 #Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 #Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
Aug 10 #Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
Aug 10 #Javascript
vue 实现锚点功能操作
Aug 10 #Javascript
vscode 使用Prettier插件格式化配置使用代码详解
Aug 10 #Javascript
You might like
php通过字符串调用函数示例
2014/03/02 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
php中的登陆login实例代码
2016/06/20 PHP
php时间戳转换代码详解
2019/08/04 PHP
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
jQuery 选择器详解
2015/01/19 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
pandas带有重复索引操作方法
2018/06/08 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
python 字符串常用方法汇总详解
2019/09/16 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
谢师宴邀请函
2015/02/02 职场文书
2015员工年度考核评语
2015/03/25 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
JavaScript实现简单的音乐播放器
2022/08/14 Javascript