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实现在线预览office文件的示例代码

    下面是详细讲解“Vue实现在线预览Office文件的示例代码”的攻略。 问题背景 在很多场合下,我们需要在线预览Office文件,为方便用户,我们可以在网站上实现在线预览。如何实现呢?这里给出一种基于Vue的实现思路。 实现步骤 安装ViewerJS ViewerJS是一个支持在线观看PDF、ODT、ODS、ODP等文件格式的开源项目。我们可以使用它来实现在…

    Vue 2023年5月28日
    00
  • vue + Electron 制作桌面应用的示例代码

    下面是关于“vue + Electron 制作桌面应用的示例代码”的完整攻略,主要分为以下几个步骤: 1. 创建项目 首先,确保已安装最新版本的 nodejs 和 npm。然后,在命令行工具中输入以下命令创建一个基础的 Vue.js 项目。 vue create my-desktop-app 接下来,进入项目目录并安装 Electron 和 electron…

    Vue 2023年5月27日
    00
  • vue使用vue-video-player插件播放视频的步骤讲解

    好的!下面我将为你详细讲解如何使用vue-video-player插件在Vue项目中播放视频的步骤。 1. 安装vue-video-player插件 在终端输入以下命令安装vue-video-player插件: npm install vue-video-player –save 2. 引入vue-video-player组件 在Vue项目的main.js…

    Vue 2023年5月28日
    00
  • Vue3 之 Vue 事件处理指南

    针对“Vue3 之 Vue 事件处理指南”的完整攻略,我可以进行如下的讲解: Vue3 之 Vue 事件处理指南 1. 介绍 Vue3 中的事件处理相较于 Vue2 有了一些改进。在 Vue3 中,事件的使用更为简洁明了,事件的绑定方式也发生了不少变化。本文介绍如何使用 Vue3 来处理事件。 2. 事件绑定 2.1 使用 v-on 指令绑定事件 在 Vue…

    Vue 2023年5月28日
    00
  • 详解Vue的options

    当使用Vue框架来开发应用程序时,它使用了一个构造函数来创建Vue的实例。在创建Vue实例时,构造函数需要一个对象参数,这个参数包含了Vue的选项,其中包括了数据、计算属性、模板、组件等等。这里我们就来详细讲解Vue的options。 1. 数据选项 数据选项用于定义应用程序中的数据,这些数据可以在模板中进行显示和修改。通过使用响应式数据机制,在修改数据时,…

    Vue 2023年5月27日
    00
  • vue导出html、word和pdf的实现代码

    针对“vue导出html、word和pdf的实现代码”的完整攻略,我将结合Vue.js自身的特性及常用的第三方库,从以下几个方面进行讲解: Html导出 Vue.js的文本渲染是非常方便的,在页面上展示的数据,我们只需要利用Vue.js提供的模板语法即可。所以当我们需要导出html时,也可以利用这个特性来实现。 步骤如下: 创建一个带有数据的vue实例。 n…

    Vue 2023年5月27日
    00
  • vue实现固定位置显示功能

    下面是详细讲解“Vue实现固定位置显示功能”的完整攻略: 1. 前言 在使用 Vue.js 开发页面时,常常会遇到需要固定某个节点位置的需求,常见的应用场景有如下几种: 在滚动页面时,需要固定某个顶部导航栏或侧边栏; 实现类似于弹出框的固定弹窗,钉在页面的某个位置,不受滚动页面的影响; 在轮播图等场景下,需要固定某个位置的图标按钮。 本篇攻略将会介绍主流的 …

    Vue 2023年5月29日
    00
  • 对vue生命周期的深入理解

    针对“对vue生命周期的深入理解”的完整攻略,我会进行以下方面的详细讲解: vue生命周期的概述 vue生命周期各个阶段的实现细节 vue生命周期使用的场景和注意点 示例一:使用beforeCreate钩子实现用户登录状态判断 示例二:使用组件销毁前的beforeDestroy钩子解除事件监听 1. vue生命周期的概述 Vue.js是一款轻量级MVVM框架…

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