当前位置:首页 > JavaScript

js实现图片压缩

2026-03-01 05:08:29JavaScript

使用Canvas API压缩图片

通过Canvas的drawImagetoDataURL方法实现图片压缩。核心原理是将图片绘制到Canvas上,再转换为指定质量的Blob或Base64数据。

js实现图片压缩

function compressImage(file, quality = 0.7, maxWidth = 800) {
  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');

        // 计算缩放比例
        const scale = maxWidth / img.width;
        canvas.width = maxWidth;
        canvas.height = img.height * scale;

        // 绘制到Canvas
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

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

使用第三方库实现压缩

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

js实现图片压缩

  1. compressorjs - 提供更多压缩选项和更好的兼容性
    
    import Compressor from 'compressorjs';

new Compressor(file, { quality: 0.6, maxWidth: 1024, success(result) { // 压缩后的文件 }, error(err) { console.error(err.message); }, });


2. browser-image-compression - 支持Web Worker后台压缩
```javascript
import imageCompression from 'browser-image-compression';

const options = {
  maxSizeMB: 1,
  maxWidthOrHeight: 1920,
  useWebWorker: true
};

const compressedFile = await imageCompression(file, options);

压缩时注意事项

图片压缩需要考虑以下因素:

  • 目标格式选择:JPEG适合照片,PNG适合带透明度的图片
  • 质量参数平衡:通常0.6-0.8在质量和文件大小间取得较好平衡
  • 分辨率控制:根据实际显示需求限制最大宽度/高度
  • 异步处理:大文件压缩应使用Web Worker避免阻塞UI

完整示例代码

async function handleImageUpload(event) {
  const file = event.target.files[0];
  if (!file) return;

  try {
    const compressedBlob = await compressImage(file);

    // 使用压缩后的文件
    const formData = new FormData();
    formData.append('image', compressedBlob, file.name);

    // 上传或进一步处理...
  } catch (error) {
    console.error('压缩失败:', error);
  }
}

document.getElementById('file-input').addEventListener('change', handleImageUpload);

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

相关文章

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现继承

js实现继承

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

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClip…