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 相关文章推荐
总结AJAX相关JS代码片段和浏览器模型
Aug 15 Javascript
10个实用的脚本代码工具
May 04 Javascript
jquery 查找iframe父级页面元素的实现代码
Aug 28 Javascript
javascript事件函数中获得事件源的两种不错方法
Mar 17 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
Oct 26 Javascript
Vue中使用webpack别名的方法实例详解
Jun 19 Javascript
三种Webpack打包方式(小结)
Sep 19 Javascript
node获取客户端ip功能简单示例
Aug 24 Javascript
微信小程序返回箭头跳转到指定页面实例解析
Oct 08 Javascript
jQuery三组基本动画与自定义动画操作实例总结
May 09 jQuery
JavaScript数组 几个常用方法总结
Nov 11 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调用mysql存储过程
2007/02/14 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
javascript验证身份证号
2015/03/03 Javascript
javascript数组排序汇总
2015/07/07 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
Angular 多模块项目构建过程
2020/02/13 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
python合并文本文件示例
2014/02/07 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
老干部工作先进集体事迹材料
2014/05/21 职场文书
培训通知书模板
2015/04/17 职场文书
薪资证明范本
2015/06/19 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
一文带你探究MySQL中的NULL
2021/11/11 MySQL