uniapp压缩图片

上传图片前要进行压缩,因为图片过大,服务器会崩。
在uniapp中有uni.compressImage()压缩图片方法
但是用了这个方法报错:compressImage is not yet implemented
原因很简单,不支持h5,心态炸裂,只好换种方法了,试好好会把好用的方法发布出来的。

在这里插入图片描述

通过canvas可以压缩,和参考的不同的是只需要beforeImageUpload就行了。
代码如下:

 <el-upload list-type="picture-card" :action="action" :show-file-list="false"
	  :on-success="handleSucess"  :before-upload="beforeImageUpload">
	  <img v-if="imageUrl" :src="imageUrl" class="avatar"  width="148" height="148"/>
	  <i v-else class="el-icon-plus avatar-uploader-icon" />
  </el-upload>

js代码如下:

beforeImageUpload (file, fileList) {
   return new Promise(async (resolve, reject) => {
     if (!file.type.includes('image')) {
       this.$message.warning('请上传图片')
       reject(new Error('请上传图片'))
       return
     }
     this.isShowSpinning = true//上传之前弹框-或者成功函数中打开裁剪图片弹框
     const newFile = await this.compressImg(file)
     console.log(newFile.size,newFile,'压缩后图片大小---------------')
     resolve(newFile)
   })
 },
 // 图片压缩函数
 compressImg (file) {
   const that = this
   var files
   var fileSize = parseFloat(parseInt(file['size']) / 1024 / 1024).toFixed(2)
   var read = new FileReader()
   read.readAsDataURL(file)
   return new Promise(function (resolve, reject) {
     read.onload = function (e) {
       var img = new Image()
       img.src = e.target.result
       img.onload = function () {
         // 默认按比例压缩
         var w = this.width
         var h = this.height
         // 生成canvas
         var canvas = document.createElement('canvas')
         var ctx = canvas.getContext('2d')
         var base64
         // 创建属性节点
         canvas.setAttribute('width', w)
         canvas.setAttribute('height', h)
         ctx.drawImage(this, 0, 0, w, h)
         if (fileSize < 1) {
           // 如果图片小于一兆 那么压缩0.5
           base64 = canvas.toDataURL(file['type'], 0.5)
         } else if (fileSize > 1 && fileSize < 2) {
           // 如果图片大于1M并且小于2M 那么压缩0.5
           base64 = canvas.toDataURL(file['type'], 0.5)
         } else {
           // 如果图片超过2m 那么压缩0.2
           base64 = canvas.toDataURL(file['type'], 0.2)
         }
         // 回调函数返回file的值(将base64编码转成file)
         files = that.dataURLtoFile(base64, file.name) // 如果后台接收类型为base64的话这一步可以省略
         resolve(files)
       }
     }
   })
 },
  // base64转码(压缩完成后的图片为base64编码,这个方法可以将base64编码转回file文件)
  dataURLtoFile (dataurl, filename) {
    var arr = dataurl.split(',')
    var mime = arr[0].match(/:(.*?);/)[1]
    var bstr = atob(arr[1])
    var n = bstr.length
    var u8arr = new Uint8Array(n)
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], filename, { type: mime })
  },

 handleSucess(res, file) {//这里上传已是走完:beforeImageUpload函数压缩后的图片
     console.log(file.size,file,'这里打印还是压缩之前的大小----');
     this.$nextTick(() => {//取dom更新之后的值
       this.option.img = URL.createObjectURL(file.raw);
       // this.option.img = URL.createObjectURL(this.newFile);//取到的值已是压缩后的图片,不需要从beforeImageUpload重新赋值给一个字段
       console.log(this.option.img,'打印出来的地址在浏览器下载看大小:是压缩之前的图片,但是上传成功后---后台返回url浏览器下载看大小-已经是压缩后的了,证明成功了-----------------')
     })
 },
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
uniapp是一款基于Vue.js和小程序开发框架的跨平台应用开发工具,它可以帮助开发者快速构建同时在多个平台上运行的应用程序。在uniapp开发中,如果需要上传图片,可以选择使用图片压缩插件来减小图片的大小,提高上传效率。 目前,uniapp上使用的图片压缩插件主要有两种方式:基于canvas的压缩和使用第三方压缩库。 基于canvas的压缩方法是先将图片绘制到一个canvas上,然后通过调整canvas的尺寸和图片的质量来进行压缩。这种方法可以确保压缩图片的质量,但在处理大尺寸图片时可能会占用较多的内存,导致用户体验下降。 另一种方法是使用第三方压缩库,如compressorjs和image-compressor等。这些库使用了一些压缩算法来减小图片的大小,同时保持适当的质量。使用第三方压缩库通常需要在项目中引入相应的插件,并按照插件提供的API进行调用。 具体使用图片压缩插件的步骤如下: 1. 引入图片压缩插件的相关依赖库或插件。 2. 创建一个图片上传组件,并添加上传按钮。 3. 在图片上传事件中获取用户选择的图片文件。 4. 调用图片压缩插件的API图片进行压缩处理。 5. 将压缩后的图片上传到服务器。 值得注意的是,图片压缩并不是每个项目都必须使用的功能,需要根据具体需求和项目的实际情况来决定是否使用以及选择哪种压缩方法。另外,使用图片压缩插件时,需要考虑用户上传的图片大小和质量要求,以及对用户设备性能的影响。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值