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 相关文章推荐
jquery-easyui关闭tab自动切换到前一个tab
Jul 29 Javascript
使用jQuery的将桌面应用程序引入浏览器
Nov 19 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
Oct 24 Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 Javascript
JS实现向表格行添加新单元格的方法
Mar 30 Javascript
jQuery实现动态添加和删除一个div
Aug 12 Javascript
JavaScript遍历求解数独问题的主要思路小结
Jun 12 Javascript
微信小程序 数组中的push与concat的区别
Jan 05 Javascript
基于JQuery的Ajax方法使用详解
Aug 16 jQuery
vue2手机APP项目添加开屏广告或者闪屏广告
Nov 28 Javascript
angularJs select绑定的model取不到值的解决方法
Oct 08 Javascript
通过说明与示例了解js五种设计模式
Jun 17 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中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php开发文档 会员收费1期
2012/08/14 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
js如何验证密码强度
2020/03/18 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
python多线程扫描端口示例
2014/01/16 Python
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
python实现弹窗祝福效果
2019/04/07 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
宿舍违规检讨书
2014/01/12 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python