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

首先需要明确的是,针对 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日

相关文章

  • Vue集成three.js并加载glb、gltf、FBX、json模型的场景分析

    下面是针对”Vue集成three.js并加载glb、gltf、FBX、json模型的场景分析”的完整攻略,包括两个示例的说明。 Vue集成three.js并加载模型的场景分析 前言 Three.js是一个基于webgl开发的JavaScript 3D库,它能够让开发人员通过JS创建各种3D场景。同时,Vue则是一个较为流行的JavaScript开发框架,可以…

    Vue 2023年5月28日
    00
  • 详解Vue-Router的安装与使用

    下面就是“详解Vue-Router的安装与使用”的完整攻略。 1. 什么是Vue-Router Vue-Router是Vue.js官方推荐的路由管理库,它能够方便地管理Vue.js应用程序中的导航和路由。 路由(Routing)是指根据不同的URL地址展现不同的内容或页面。通过Vue-Router,我们能够实现在单页应用中切换不同的页面而不用刷新整个页面。 …

    Vue 2023年5月27日
    00
  • idea项目debug模式无法启动的解决

    针对“idea项目debug模式无法启动”的问题,我们可以尝试以下措施解决: 1. 检查项目依赖 在使用idea进行项目开发时,如果项目依赖有问题,可能会导致debug模式启动失败。这时我们可以尝试检查一下项目依赖的问题,具体步骤如下: 在idea中打开对应项目 点击菜单栏上的File -> Project Structure 在弹出的窗口中,点击左侧…

    Vue 2023年5月28日
    00
  • vue 组件基础知识总结

    Vue 组件基础知识总结 1. 什么是组件? 组件是 Vue.js 最核心的概念之一,它是将整个页面划分为一个个独立的、可复用的模块,每个模块都有自己的状态、行为以及样式。 组件能够使得我们的代码更加模块化,具备高可复用性,提高代码的可维护性,以及对页面进行灵活组合。 2. 组件定义方法 在 Vue 中,组件采用 “Vue.extend” 或者“Vue.co…

    Vue 2023年5月28日
    00
  • vue里使用create,mounted调用方法的正确姿势说明

    接下来我来详细讲解“Vue中使用created和mounted调用方法的正确方式”。 1. created 和 mounted Vue 组件的生命周期函数可以分为 beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed。今天我们主要来讲解其中的…

    Vue 2023年5月28日
    00
  • 详解vuex commit保存数据技巧

    下面是详解vuex commit保存数据技巧的完整攻略。 简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以预测的方式的改变应用状态。vuex 提供了 commit 方法用来操作 vuex 的 state 对象中的数据。 commit 方法 commit方法是vuex中的一个核心方法,它用来提…

    Vue 2023年5月27日
    00
  • Vue.js之render函数使用详解

    下面是关于Vue.js之render函数使用的详解攻略: 什么是render函数 Render函数是Vue.js中的一项核心特性,它允许您使用JavaScript编写模板,这意味着你可以获得更多的控制和更灵活的方式来编写您的组件。 render函数的写法 在Vue.js中,Render函数使用一个函数来定义组件的渲染输出。这个函数包含一个参数——h,它是Vu…

    Vue 2023年5月28日
    00
  • 3分钟迅速学会Vue中methods方法使用技巧

    3分钟迅速学会Vue中methods方法使用技巧 简介 在Vue组件里,methods方法是非常重要的一部分,它是用来存放组件内部方法的地方。在使用Vue的时候,熟练掌握methods的使用技巧,能够提高开发速度和代码可读性。 基本使用方法 在Vue组件中,我们可以定义多个methods方法,类似于下面的例子: <template> <di…

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