JS图片压缩

539 阅读2分钟

背景

用户在上传图片时,会因图片体积较大,导致上传较慢。前端需要将用户上传的照片压缩,用户无感知可以直接上传成功。

JS图片压缩插件

  • compressorjs: 一个轻量级的 JavaScript 图片压缩库,支持压缩 JPEG、PNG、GIF、SVG 等常见图片格式,可以在浏览器和 Node.js 中使用。

  • pica: 一个基于 Web worker 的 JavaScript 图片处理库,可以实现图片压缩、缩放、旋转等功能。该库支持多种压缩算法,并可以调整压缩质量和尺寸,以满足不同场景的需求。

  • image-compressor: 一个基于 HTML5 Canvas 和 File API 的 JavaScript 图片压缩库,可以压缩 JPEG、PNG 和 GIF 格式的图片,并支持调整压缩质量和尺寸。该库支持在浏览器和 Node.js 中使用。

  • jpeg-js: 一个基于 JavaScript 的 JPEG 图片编解码库,可以实现 JPEG 图片的压缩和解压缩功能。该库支持在浏览器和 Node.js 中使用,并提供了多种压缩算法和参数选项。

  • sharp: 一个基于 Node.js 的高性能图片处理库,可以实现图片压缩、缩放、裁剪等功能。该库支持多种图片格式和压缩算法,并可以调整压缩质量和尺寸,以满足不同场景的需求。

代码实例

本次开发采用js-image-compressor工具库

  <input type="file" accept="image/jpeg, image/png" onChange={this._fn} />

  _fn = (e) => {
    const files = e.target.files;
    if (files.length === 0) {
    、、、
    } else {
      this._uploadFn(files[0]);
    }
  };
  
  _uploadFn = async (file) => {
    const formData = new FormData();
    let newFile = file;
    // 超过200k压缩
    if (newFile?.type && newFile?.size > 200 * 1024) {
      try {
        newFile = await this.compressionImage(newFile);
      } catch (error) {
        console.log(error);
      }
    }
    const { name } = newFile;
    const names = name.split('.');
    const suffix = names[names.length - 1];
    const params = { suffix, ...};
    formData.append('file', newFile);
    const msg = 。。。;
    const sign =。。。;
    formData.append('msg', msg);
    formData.append('sign', sign);
    Fetch.post('url', formData)
      .then((resdata) => {
        // 图片解析成功
      })
      .catch((err) => {
      });
  };
  
    // 图片压缩
  compressionImage = (file) => new Promise((resolve, reject) => {
    // eslint-disable-next-line no-new
    new ImageCompressor({
      file,
      quality: 0.3,
      maxWidth: 750,
      maxHeight: 1334,
      redressOrientation: false,
      beforeCompress(result) {
        console.log('压缩之前图片尺寸大小: ', result.size);
        console.log('mime 类型: ', result.type);
      },
      success: (result) => {
        console.log('压缩之后图片尺寸大小: ', result.size);
        console.log('mime 类型: ', result.type);
        // eslint-disable-next-line no-mixed-operators
        console.log('压缩率: ', `${(result.size / file.size * 100).toFixed(2)}%`);
        resolve(result);
      },
      error: (e) => {
        reject(e);
      },
    });
  });

参考文章 juejin.cn/post/721069…