当前位置:首页 > VUE

vue实现图片压缩

2026-01-17 14:44:40VUE

使用 canvas 实现图片压缩

在 Vue 项目中可以通过 canvas 的 drawImagetoDataURL 方法实现图片压缩。创建一个方法处理图片文件,将其绘制到 canvas 并输出压缩后的 base64 或 Blob 数据。

compressImage(file, quality = 0.7) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = (event) => {
      const img = new Image();
      img.src = event.target.result;
      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, img.width, img.height);
        const compressedDataUrl = canvas.toDataURL('image/jpeg', quality);
        resolve(compressedDataUrl);
      };
    };
  });
}

限制图片尺寸

在压缩过程中可以限制图片的最大宽度或高度,避免大图直接压缩导致质量损失过大。通过计算缩放比例调整 canvas 的绘制尺寸。

vue实现图片压缩

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);

转换为 Blob 对象

压缩后的 base64 数据可以通过以下方法转换为 Blob 对象,便于表单提交或上传处理。

vue实现图片压缩

function dataURLtoBlob(dataurl) {
  const arr = dataurl.split(',');
  const mime = arr[0].match(/:(.*?);/)[1];
  const bstr = atob(arr[1]);
  let n = bstr.length;
  const u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], { type: mime });
}

使用第三方库

对于更复杂的压缩需求,可以使用专门针对图片处理的库如 compressorjs。安装后直接在 Vue 组件中调用。

npm install compressorjs
import Compressor from 'compressorjs';

new Compressor(file, {
  quality: 0.6,
  success(result) {
    console.log(result);
  },
  error(err) {
    console.error(err.message);
  },
});

上传压缩后的图片

将压缩后的图片通过 FormData 上传到服务器,示例中使用 axios 发送 POST 请求。

const formData = new FormData();
formData.append('file', compressedBlob, 'compressed.jpg');

axios.post('/upload', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
}).then(response => {
  console.log('上传成功', response);
});

注意事项

图片压缩会损失部分画质,需根据实际需求调整 quality 参数。移动端拍摄的照片建议先限制尺寸再压缩。对于 PNG 格式图片,转换为 JPEG 格式通常能获得更好的压缩效果。

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

相关文章

vue中实现显示和隐藏

vue中实现显示和隐藏

控制显示与隐藏的方法 在Vue中实现元素的显示和隐藏可以通过多种方式完成,以下是常见的几种方法: 1. 使用v-if指令v-if根据条件动态添加或移除DOM元素,适合需要频繁切换的场景。当条件为fa…

vue compile 实现

vue compile 实现

Vue 编译实现原理 Vue 的编译过程将模板字符串转换为渲染函数,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)。Vue 使用正则表达式和有…

vue实现treeselect

vue实现treeselect

Vue TreeSelect 实现方法 使用 Vue 实现 TreeSelect 组件可以通过以下几种方式完成,包括使用现成的第三方库或自行封装组件。 使用第三方库 推荐使用成熟的第三方 TreeS…

vue app 实现

vue app 实现

Vue App 实现步骤 创建Vue项目 使用Vue CLI或Vite初始化项目。Vue CLI适合传统项目,Vite适合现代轻量级应用。 npm create vue@latest my-vu…

vue实现文章滚动

vue实现文章滚动

Vue 实现文章滚动效果 使用 CSS 实现基础滚动 通过 CSS 的 overflow 和 height 属性控制滚动区域,适用于静态内容滚动。在 Vue 模板中定义固定高度的容器,内容超出后自动滚…

vue实现单词逆转

vue实现单词逆转

实现单词逆转的方法 在Vue中实现单词逆转可以通过多种方式完成,以下是几种常见的方法: 使用计算属性逆转单词 计算属性是Vue中处理数据逻辑的理想选择。可以通过计算属性来实现单词逆转: <t…