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 相关文章推荐
javascript 贪吃蛇实现代码
Nov 22 Javascript
js动态移动滚动条至底部示例代码
Apr 24 Javascript
详解jQuery插件开发方式
Nov 22 Javascript
bootstrap手风琴折叠示例代码分享
May 22 Javascript
Node.js开发第三方微信公众平台
Jun 05 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
Sep 05 Javascript
JQuery 选择器、DOM节点操作练习实例
Sep 28 jQuery
chorme 浏览器记住密码后input黄色背景处理方法(两种)
Nov 22 Javascript
angular2中使用第三方js库的实例
Feb 26 Javascript
vue页面切换到滚动页面显示顶部的实例
Mar 13 Javascript
webpack配置打包后图片路径出错的解决
Apr 26 Javascript
JS实现键值对遍历json数组功能示例
May 30 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
一个用于网络的工具函数库
2006/10/09 PHP
header导出Excel应用示例
2014/01/24 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
Yii框架安装简明教程
2020/05/15 PHP
javascript 全角转换实现代码
2009/07/17 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
一年级学生评语
2014/04/23 职场文书
Pandas搭配lambda组合使用详解
2022/01/22 Python
详解TypeScript的基础类型
2022/02/18 Javascript
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python