当前位置:首页 > VUE

vue实现图片压缩

2026-02-18 07:18:32VUE

使用 canvas 实现图片压缩

在 Vue 中可以通过 canvas 的 drawImagetoDataURL 方法实现图片压缩。创建一个方法接收 File 对象和压缩比例参数,返回压缩后的 base64 或 Blob 对象。

function compressImage(file, quality = 0.8) {
  return new Promise((resolve) => {
    const reader = new FileReader()
    reader.onload = (e) => {
      const img = new Image()
      img.onload = () => {
        const canvas = document.createElement('canvas')
        const ctx = canvas.getContext('2d')
        canvas.width = img.width
        canvas.height = img.height
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
        canvas.toBlob(
          (blob) => resolve(blob),
          'image/jpeg',
          quality
        )
      }
      img.src = e.target.result
    }
    reader.readAsDataURL(file)
  })
}

集成到 Vue 组件

在组件中创建文件上传 input,调用压缩方法后显示预览或上传到服务器。

<template>
  <div>
    <input type="file" @change="handleUpload" accept="image/*">
    <img v-if="previewUrl" :src="previewUrl" style="max-width: 300px">
  </div>
</template>

<script>
export default {
  data() {
    return {
      previewUrl: ''
    }
  },
  methods: {
    async handleUpload(e) {
      const file = e.target.files[0]
      if (!file) return

      const compressedBlob = await compressImage(file)
      this.previewUrl = URL.createObjectURL(compressedBlob)

      // 上传逻辑
      const formData = new FormData()
      formData.append('image', compressedBlob, file.name)
      // axios.post('/upload', formData)
    }
  }
}
</script>

使用第三方库

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

vue实现图片压缩

  1. compressorjs - 提供更多压缩选项
    npm install compressorjs
import Compressor from 'compressorjs'

new Compressor(file, {
  quality: 0.6,
  success(result) {
    // 处理压缩结果
  }
})
  1. image-conversion - 支持多种输出格式
    npm install image-conversion
import * as imageConversion from 'image-conversion'

imageConversion.compress(file, 0.5).then(res => {
  // 处理压缩结果
})

注意事项

  • 大图片压缩时需要考虑内存问题,建议限制上传文件大小
  • 移动端拍摄的照片可能包含 EXIF 旋转信息,需要正确处理方向
  • 不同格式图片压缩效果不同,JPEG 适合照片,PNG 适合带透明度的图片
  • 压缩比例需要根据实际需求调整,过高的压缩会导致明显质量下降

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

相关文章

vue实现pie

vue实现pie

Vue 实现饼图 在 Vue 中实现饼图通常可以通过第三方图表库(如 ECharts、Chart.js 或 Highcharts)来完成。以下是使用 ECharts 和 Chart.js 的两种常见方…

vue实现答题

vue实现答题

Vue 实现答题功能 数据结构设计 使用 Vue 的响应式特性管理题目和答案数据。通常需要以下数据结构: data() { return { questions: [ {…

vue实现滚动监听

vue实现滚动监听

滚动监听的基本实现 在Vue中实现滚动监听可以通过原生JavaScript的window.addEventListener或结合Vue的生命周期钩子完成。以下是一个基础示例: export defa…

vue实现切换隐藏

vue实现切换隐藏

使用 v-show 指令实现切换隐藏 在 Vue 中,v-show 是最简单的切换元素显示/隐藏的方法。它通过 CSS 的 display 属性控制元素可见性。 <template>…

vue实现弹层

vue实现弹层

Vue 实现弹层的方法 使用 Vue 原生组件实现弹层 创建一个基础的弹层组件,利用 v-if 或 v-show 控制显示隐藏。 <template> <div class="…

vue点击实现动画

vue点击实现动画

Vue 中实现点击动画的方法 使用 Vue 过渡(Transition)组件 Vue 提供了内置的 <transition> 组件,可以轻松实现元素进入/离开的动画效果。结合 v-if 或…