当前位置:首页 > JavaScript

js实现图片压缩

2026-01-30 14:04:12JavaScript

使用Canvas API压缩图片

Canvas的drawImage方法结合toDataURL可以调整图片尺寸和质量。创建一个新的Canvas元素,将图片绘制到指定尺寸后转换为Base64或Blob格式。

function compressImage(file, maxWidth, maxHeight, quality) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.onload = function(e) {
      const img = new Image();
      img.onload = function() {
        const canvas = document.createElement('canvas');
        let width = img.width;
        let height = img.height;

        if (width > maxWidth) {
          height *= maxWidth / width;
          width = maxWidth;
        }
        if (height > maxHeight) {
          width *= maxHeight / height;
          height = maxHeight;
        }

        canvas.width = width;
        canvas.height = height;
        const ctx = canvas.getContext('2d');
        ctx.drawImage(img, 0, 0, width, height);

        canvas.toBlob(
          (blob) => resolve(blob),
          'image/jpeg',
          quality
        );
      };
      img.src = e.target.result;
    };
    reader.readAsDataURL(file);
  });
}

使用第三方库实现压缩

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

  • compressorjs:提供丰富的压缩选项和回调处理
  • browser-image-compression:支持Web Worker多线程压缩

安装compressorjs示例:

js实现图片压缩

npm install compressorjs

使用示例:

import Compressor from 'compressorjs';

new Compressor(file, {
  quality: 0.6,
  maxWidth: 800,
  success(result) {
    const formData = new FormData();
    formData.append('file', result, result.name);
    // 上传处理后的文件
  },
  error(err) {
    console.error(err.message);
  },
});

调整输出格式优化压缩率

不同图片格式的压缩效果差异较大:

js实现图片压缩

  • JPEG:适合照片类图片,通过调整quality参数(0-1)控制质量
  • WebP:现代格式,比JPEG节省25-35%体积
  • PNG:适合需要透明度的图片,但体积较大

格式转换示例:

canvas.toBlob(
  (blob) => {},
  'image/webp',  // 指定输出格式
  0.7            // 质量参数
);

分片压缩大文件处理

对于超大图片文件,可采用分块读取处理的方式避免内存溢出:

const chunkSize = 1024 * 1024; // 1MB分块
let offset = 0;

while (offset < file.size) {
  const chunk = file.slice(offset, offset + chunkSize);
  // 对每个分块单独处理
  offset += chunkSize;
}

上传前压缩完整流程

典型的前端图片压缩上传流程:

  1. 用户通过input选择图片文件
  2. 读取文件并创建Image对象
  3. 计算目标尺寸保持宽高比
  4. 使用Canvas重绘并导出压缩后数据
  5. 将结果转换为Blob或FormData
  6. 通过AJAX或Fetch API上传
document.getElementById('upload').addEventListener('change', async (e) => {
  const file = e.target.files[0];
  if (!file) return;

  const compressedFile = await compressImage(file, 1024, 768, 0.7);

  const formData = new FormData();
  formData.append('image', compressedFile, 'compressed.jpg');

  fetch('/upload', {
    method: 'POST',
    body: formData
  }).then(response => {
    // 处理服务器响应
  });
});

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

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue…

网页设计制作css图片

网页设计制作css图片

CSS图片处理基础方法 在网页设计中,CSS可以控制图片的尺寸、位置、边框等样式属性。通过<img>标签或背景图方式引入图片后,使用CSS属性进行调整。 img { width: 1…

vue实现图片打点

vue实现图片打点

实现图片打点的基本思路 图片打点功能通常指在图片上添加可交互的标记点,点击或悬停时显示相关信息。Vue实现该功能需要结合DOM操作和事件监听。 核心步骤 准备图片和容器 在Vue组件中设置一个相对定…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…