当前位置:首页 > 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示例:

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

调整输出格式优化压缩率

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

  • 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;
}

上传前压缩完整流程

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

js实现图片压缩

  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实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…