当前位置:首页 > VUE

vue实现图片压缩

2026-03-30 08:01:48VUE

Vue 图片压缩实现方法

使用 HTML5 Canvas 压缩

通过 Canvas API 可以调整图片质量和尺寸实现压缩。创建一个图片压缩组件:

<template>
  <div>
    <input type="file" @change="compressImage" accept="image/*">
    <img v-if="compressedImage" :src="compressedImage" alt="Compressed">
  </div>
</template>

<script>
export default {
  data() {
    return {
      compressedImage: null
    }
  },
  methods: {
    compressImage(e) {
      const file = e.target.files[0]
      if (!file) return

      const reader = new FileReader()
      reader.onload = event => {
        const img = new Image()
        img.onload = () => {
          const canvas = document.createElement('canvas')
          const ctx = canvas.getContext('2d')

          // 设置压缩尺寸
          const MAX_WIDTH = 800
          const MAX_HEIGHT = 800
          let width = img.width
          let height = img.height

          if (width > height) {
            if (width > MAX_WIDTH) {
              height *= MAX_WIDTH / width
              width = MAX_WIDTH
            }
          } else {
            if (height > MAX_HEIGHT) {
              width *= MAX_HEIGHT / height
              height = MAX_HEIGHT
            }
          }

          canvas.width = width
          canvas.height = height
          ctx.drawImage(img, 0, 0, width, height)

          // 质量参数 0.7 表示70%质量
          this.compressedImage = canvas.toDataURL('image/jpeg', 0.7)
        }
        img.src = event.target.result
      }
      reader.readAsDataURL(file)
    }
  }
}
</script>

使用第三方库

对于更复杂的压缩需求,可以使用专门的处理库:

vue实现图片压缩

npm install browser-image-compression

组件实现示例:

vue实现图片压缩

import imageCompression from 'browser-image-compression'

methods: {
  async compressWithLibrary(file) {
    const options = {
      maxSizeMB: 1,          // 最大文件大小
      maxWidthOrHeight: 1920, // 最大尺寸
      useWebWorker: true     // 使用多线程加速
    }
    try {
      return await imageCompression(file, options)
    } catch (error) {
      console.error(error)
      return file
    }
  }
}

后端配合压缩

前端可以先将图片上传到临时位置,由后端进行专业压缩处理:

async uploadCompressed(file) {
  const formData = new FormData()
  formData.append('image', file)

  try {
    const response = await axios.post('/api/compress', formData, {
      headers: { 'Content-Type': 'multipart/form-data' }
    })
    return response.data.url
  } catch (error) {
    console.error('Upload failed:', error)
  }
}

性能优化建议

压缩大图片时显示加载状态避免界面卡顿 通过 Web Worker 将压缩过程放到后台线程执行 对不同设备类型设置不同的压缩参数 提供压缩质量选项让用户自行选择

注意事项

注意保留原始图片的宽高比 处理压缩失败的情况提供备用方案 移动端需要考虑内存限制问题 EXIF 信息可能在压缩过程中丢失需要特殊处理

标签: 图片vue
分享给朋友:

相关文章

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templat…

vue实现计算

vue实现计算

Vue 实现计算的方法 在 Vue 中实现计算功能可以通过多种方式完成,主要包括计算属性(computed)、方法(methods)和侦听器(watch)。以下是具体的实现方法: 计算属性(Comp…

vue实现曲线

vue实现曲线

Vue 实现曲线的方法 在 Vue 中实现曲线可以通过多种方式,包括使用 SVG、Canvas 或第三方库如 D3.js、ECharts 等。以下是几种常见的方法: 使用 SVG 绘制曲线 SVG…

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue动画实现

vue动画实现

Vue动画实现方法 Vue提供了多种方式实现动画效果,主要通过内置组件和第三方库完成。 使用<transition>组件 Vue内置的<transition>组件可以为元素添…

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过drag…