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

yizhihongxing

首先需要明确的是,针对 vue+elementUI(el-upload) 图片压缩的操作,实际上是对于上传的图片进行处理,通过 JS 将图片进行压缩,最终实现 web 应用中图片大小的限制。

接下来,我们将分别从以下三个方面对此进行详细讲解:

  1. 图片选择与压缩
  2. 解决压缩后图片失去原有宽高比例的问题
  3. 示例说明

1. 图片选择与压缩

我们可以通过 elementUI 中的 el-upload 组件来实现图片上传的操作,代码示例如下:

<template>
  <el-upload
    class="upload-demo"
    ref="upload"
    action="/upload"
    :before-upload="beforeUpload"
    :on-success="handleSuccess"
    :dragable="draggable"
    :on-exceed="handleExceed"
    :limit="limit"
    :file-list="fileList">
    <el-button size="small" type="primary">点击上传</el-button>
    <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
  </el-upload>
</template>

<script>
export default {
  data() {
    return {
      fileList: [], // 上传文件列表
      limit: 6, // 最大文件数量
      draggable: true, // 是否可拖拽上传
    }
  },
  methods: {
    beforeUpload(file) {
      const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
      const isLt500k = file.size / 1024 < 500;
      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG/PNG 格式!');
      }
      if (!isLt500k) {
        this.$message.error('上传头像图片大小不能超过 500KB!');
      }
      return isJPG && isLt500k;
    },
    handleSuccess(response, file, fileList) {
      // 上传成功后的操作
    },
    handleExceed(files, fileList) {
      this.$message.warning(`当前限制选择 ${this.limit} 张图片`);
    },
  },
}
</script>

在 beforeUpload 方法中,我们限制了图片类型和大小,确保上传的文件都是符合要求的。

接下来,我们需要对文件进行压缩操作,通过 JS 来实现。我们可以使用 js-image-compressor 库,对应 CDN:(https://cdn.jsdelivr.net/npm/js-image-compressor@latest)。

可以使用以下命令进行安装:

npm install js-image-compressor -S

压缩图片的代码示例如下:

import ImageCompressor from 'js-image-compressor'

const imageCompressor = new ImageCompressor()

const file = this.$refs.upload.uploadFiles[0]; // 获取上传的文件

imageCompressor.compress(file, {
    maxSizeMB: 1, // 压缩后图片大小的最大值,这里为 1MB
    maxWidthOrHeight: 1920 // 压缩后图片的最大宽度或高度,这里为 1920px
}).then((result) => {
  // 处理压缩后的图片
}).catch((err) => {
  console.log(err)
})

2. 解决压缩后图片失去原有宽高比例的问题

在进行图片压缩后,我们会发现有些图片的宽高比例会失去原有比例,变得很奇怪。这是因为对于一些宽高比例大于 1:1 的图片,进行等比例缩放后,会出现黑边的情况,因此需要进行处理。

解决方法是通过使用 canvas 对压缩后的图片进行重新绘制,代码示例如下:

compressImg(file) {
  const imageCompressor = new ImageCompressor()

  imageCompressor.compress(file, {
    maxSizeMB: 1, // 压缩后图片大小的最大值,这里为 1MB
    maxWidthOrHeight: 1920 // 压缩后图片的最大宽度或高度,这里为 1920px
  }).then((result) => {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    const img = new Image();

    img.src = URL.createObjectURL(result);

    img.onload = function () {
      // 绘制图片到 canvas 中
      ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, 100, 100);

      // 将 canvas 转化为 base64 格式的图片
      const compressImgData = canvas.toDataURL('image/jpeg', 0.8);
    };
  }).catch((err) => {
    console.log(err)
  })
}

通过对图片进行重新绘制,便可以解决宽高比例失衡的问题。

3. 示例说明

以下是示例说明,展示如何将以上方法应用到 vue+elementUI(el-upload) 上传组件中,并进行图片压缩。

<template>
  <el-upload
    class="upload-demo"
    ref="upload"
    action="/upload"
    :before-upload="beforeUpload"
    :on-change="handleChange"
    :limit="limit"
    :file-list="fileList">
    <el-button size="small" type="primary">点击上传</el-button>
    <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
  </el-upload>
</template>

<script>
import ImageCompressor from 'js-image-compressor'

export default {
  data() {
    return {
      fileList: [],
      limit: 6,
    }
  },
  methods: {
    beforeUpload(file) {
      const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
      const isLt500k = file.size / 1024 < 500;
      if (!isJPG) {
        this.$message.error('上传图片只能是 JPG/PNG 格式!');
      }
      if (!isLt500k) {
        this.$message.error('上传图片大小不能超过 500KB!');
      }
      return isJPG && isLt500k;
    },
    handleChange(file, fileList) {
      const imageCompressor = new ImageCompressor()

      imageCompressor.compress(file, {
        maxSizeMB: 1,
        maxWidthOrHeight: 1920
      }).then((result) => {
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');
        const img = new Image();

        img.src = URL.createObjectURL(result);

        img.onload = function () {
          // 绘制图片到 canvas 中
          ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, 100, 100);

          // 将 canvas 转化为 base64 格式的图片
          const compressImgData = canvas.toDataURL('image/jpeg', 0.8);

          // 上传压缩后的图片
          const formData = new FormData();
          formData.append('file', convertBase64UrlToBlob(compressImgData), file.name);

          axios.post('/api/upload', formData).then((res) => {
            this.fileList.push({
              name: file.name,
              url: res.data.url
            })

            // 上传成功后的操作
          });
        };
      }).catch((err) => {
        console.log(err)
      })
    },
  },
}
</script>

我们使用 el-upload 组件作为文件上传的主体,以 beforeUpload 方法来过滤符合条件的图片,随后在 handleChange 方法中,使用 js-image-compressor 库对图片进行压缩处理,并利用 canvas 对图片进行重新绘制,解决宽高比例失衡的问题。最终将处理后的压缩图片通过 axios.post 方法传送给服务器,实现图片上传限制的操作。

以上是针对 vue+elementUI(el-upload) 图片压缩的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+elementUI(el-upload)图片压缩,默认同比例压缩操作 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue3使用时应避免的10个错误总结

    下面就是关于“Vue3使用时应避免的10个错误总结”的完整攻略。 1. 避免在setup函数之外使用响应式数据 setup函数之外的代码主要是为了定义变量或者引用组件。我们还需要明确的一点就是,setup函数是在组件实例被创建之前被调用的,所以setup函数外部的代码是在它之前执行的。如果你使用了响应式数据去创建变量或者引用组件,就会出现bug。 示例: c…

    Vue 2023年5月29日
    00
  • 详解vue-cli 构建Vue项目遇到的坑

    详解vue-cli 构建Vue项目遇到的坑 简介 vue-cli是Vue.js官方提供的一款构建工具,可以快速创建单页应用或组件库,提供webpack打包、ES6转译、热更新等功能,可以大大减轻开发者的工作量。然而,使用vue-cli创建项目时,也会遇到各种坑,这里将对一些常见的问题进行详解。 坑1:vue-cli3无法预览组件库 使用vue-cli3创建组…

    Vue 2023年5月28日
    00
  • vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)

    下面是实现分环境打包的步骤: 步骤一:配置不同环境的参数 在Vue项目中,我们可以通过创建不同的环境变量文件来配置不同环境中的参数。比如我们可以通过创建.env.development、.env.production、.env.test等文件分别配置开发环境、生产环境和测试环境的参数。其中以VUE_APP_前缀的变量可以在项目中通过process.env对象…

    Vue 2023年5月28日
    00
  • Android registerForActivityResult新用法实现两个Activity间数据传递

    我们来详细讲解一下如何使用Android registerForActivityResult新用法实现两个Activity间数据传递。 什么是registerForActivityResult registerForActivityResult是Android个10.0之后新增的 API,可以简化 startActivityForResult 的操作,并且更…

    Vue 2023年5月28日
    00
  • vue3中使用scss加上scoped导致样式失效问题

    在Vue3中,使用SCSS预处理器编写样式时,如果在<style>标签中添加scoped属性,会导致样式失效。 原因在于,scoped属性会对样式中的选择器加上一个data-v-前缀,使其只对当前组件生效。而SCSS预处理器生成的CSS选择器在编译时无法加上前缀,导致样式无法生效。 为了解决这个问题,可以使用以下两种方法之一。 方法一:使用Vue…

    Vue 2023年5月28日
    00
  • 关于Vue代码可读性的几点建议

    关于Vue代码可读性的几点建议会涉及到多个方面,我将详细讲解: 1. 格式规范 1.1 使用合适的缩进 在编写Vue代码时,应该合理地使用缩进来让代码更加易读。通常推荐使用4个空格作为缩进,而不是使用制表符。例如: <template> <div> <h1>{{ title }}</h1> <p>{…

    Vue 2023年5月29日
    00
  • vue使用echarts图表的详细方法

    当我们需要在Vue项目中使用Echarts图表时,需要进行以下步骤: 安装echarts和vue-echarts 使用npm或yarn安装: npm install echarts vue-echarts yarn add echarts vue-echarts 在Vue项目中引入echarts和vue-echarts 在需要使用Echarts图表的Vue组…

    Vue 2023年5月29日
    00
  • springboot+vue实现websocket配置过程解析

    下面我将详细讲解如何使用SpringBoot和Vue.js实现WebSocket的配置过程,整个过程需要分为以下几个步骤: 配置后端SpringBoot实现WebSocket 配置前端Vue.js实现WebSocket 前后端WebSocket通信示例 接下来我将详细讲解每个步骤的具体实现。 1. 配置后端SpringBoot实现WebSocket 首先,我…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部