当前位置:首页 > 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中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-for…

vue实现微博发布动态

vue实现微博发布动态

使用Vue实现微博发布动态功能 创建Vue组件结构 新建一个WeiboPost.vue组件,包含文本框、图片上传和发布按钮: <template> <div class="we…

vue实现画图

vue实现画图

Vue 实现画图功能 在 Vue 中实现画图功能通常需要结合 HTML5 的 <canvas> 元素或第三方库。以下是几种常见的方法: 使用原生 Canvas API 通过 Vue 直接…

vue实现录像

vue实现录像

Vue 实现录像功能 在 Vue 中实现录像功能通常需要借助浏览器的 MediaDevices API 和 MediaRecorder API。以下是实现步骤: 获取用户摄像头和麦克风权限 使用 n…

vue实现pc

vue实现pc

Vue 实现 PC 端应用开发 Vue.js 是一个流行的前端框架,适用于构建 PC 端 Web 应用。以下是关键步骤和最佳实践: 项目初始化 使用 Vue CLI 或 Vite 创建项目:…

vue实现fragment

vue实现fragment

Vue 实现 Fragment 的方法 在 Vue 中,Fragment 允许组件返回多个根节点而不需要包裹一个额外的 DOM 元素。以下是几种实现方式: 使用 Vue 3 的 <templa…