Skip to content

图片压缩大小不超1M

有些情况服务器不想存储过大的图片,所以需要压缩图片,前端压缩图片通常会用Canvas或者一些现有的库。手动用Canvas处理可能比较麻烦,尤其是处理不同格式的图片(比如JPEG、PNG)时,压缩策略可能不同。使用compressorjs,这个库封装了图片压缩的功能,支持质量、尺寸调整,并且处理起来比较方便。

安装compressorjs库

sh
npm install compressorjs
# 或者cdn引入
<script src="https://cdn.jsdelivr.net/npm/compressorjs@1.2.1/dist/compressor.min.js"></script>
npm install compressorjs
# 或者cdn引入
<script src="https://cdn.jsdelivr.net/npm/compressorjs@1.2.1/dist/compressor.min.js"></script>

示例代码:

vue
<template>
  <input type="file" accept="image/*" @change="handleImageUpload" />
</template>

<script setup>
import { ref } from 'vue';
import Compressor from 'compressorjs';

const handleImageUpload = (e) => {
  const file = e.target.files[0];
  if (!file) return;

  new Compressor(file, {
    quality: 0.6,
    maxWidth: 1920,
    maxHeight: 1920,
    convertSize: 1024 * 1024, // 超过 1MB 自动转换为 JPEG
    success(result) {
      // 二次检查文件大小
      if (result.size > 1024 * 1024) {
        // 如果仍然超过 1MB,进行二次压缩
        compressFurther(result);
      } else {
        uploadImage(result);
      }
    },
    error(err) {
      console.error('压缩失败:', err);
    }
  });
};

const compressFurther = (file) => {
  new Compressor(file, {
    quality: 0.5,
    maxWidth: 1280,
    maxHeight: 1280,
    success(result) {
      uploadImage(result);
    }
  });
};

const uploadImage = (file) => {
  const formData = new FormData();
  formData.append('file', file, file.name);
  
  // 这里替换为你的上传接口
  fetch('/api/upload', {
    method: 'POST',
    body: formData
  });
};
</script>
<template>
  <input type="file" accept="image/*" @change="handleImageUpload" />
</template>

<script setup>
import { ref } from 'vue';
import Compressor from 'compressorjs';

const handleImageUpload = (e) => {
  const file = e.target.files[0];
  if (!file) return;

  new Compressor(file, {
    quality: 0.6,
    maxWidth: 1920,
    maxHeight: 1920,
    convertSize: 1024 * 1024, // 超过 1MB 自动转换为 JPEG
    success(result) {
      // 二次检查文件大小
      if (result.size > 1024 * 1024) {
        // 如果仍然超过 1MB,进行二次压缩
        compressFurther(result);
      } else {
        uploadImage(result);
      }
    },
    error(err) {
      console.error('压缩失败:', err);
    }
  });
};

const compressFurther = (file) => {
  new Compressor(file, {
    quality: 0.5,
    maxWidth: 1280,
    maxHeight: 1280,
    success(result) {
      uploadImage(result);
    }
  });
};

const uploadImage = (file) => {
  const formData = new FormData();
  formData.append('file', file, file.name);
  
  // 这里替换为你的上传接口
  fetch('/api/upload', {
    method: 'POST',
    body: formData
  });
};
</script>

程序员小洛文档