当前位置:首页 > 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 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

H5图片实现地图

H5图片实现地图

实现H5图片地图的方法 在H5中实现图片地图功能,可以通过以下方式完成。图片地图允许用户在图片的特定区域点击,触发不同的交互效果。 使用HTML的<map>和<area>标签…

react如何添加图片

react如何添加图片

在React中添加图片的方法 使用import导入本地图片 将图片文件放在项目目录中(如src/assets),通过import语句引入后作为src属性值: import logo from './…

js实现游标

js实现游标

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