当前位置:首页 > JavaScript

js实现图片压缩

2026-04-04 05:45:36JavaScript

使用Canvas实现图片压缩

使用HTML5的Canvas元素可以对图片进行压缩处理。Canvas提供了绘制和操作图像的功能,通过调整画布大小和图像质量参数实现压缩。

function compressImage(file, quality, maxWidth, maxHeight, callback) {
  const reader = new FileReader();
  reader.onload = function(event) {
    const img = new Image();
    img.onload = function() {
      const canvas = document.createElement('canvas');
      let width = img.width;
      let height = img.height;

      if (width > maxWidth || height > maxHeight) {
        const ratio = Math.min(maxWidth / width, maxHeight / height);
        width = width * ratio;
        height = height * ratio;
      }

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

      canvas.toBlob(callback, 'image/jpeg', quality);
    };
    img.src = event.target.result;
  };
  reader.readAsDataURL(file);
}

使用第三方库实现压缩

对于更复杂的压缩需求,可以使用专门的图片处理库如Compressor.js。这个库提供了更多配置选项和更好的压缩效果。

import Compressor from 'compressorjs';

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

使用Web Worker处理大图片

对于大尺寸图片的压缩,为了避免阻塞主线程,可以使用Web Worker在后台线程中进行处理。

// worker.js
self.onmessage = function(e) {
  const { file, quality, maxWidth, maxHeight } = e.data;
  const reader = new FileReader();

  reader.onload = function(event) {
    const img = new Image();
    img.onload = function() {
      const canvas = new OffscreenCanvas(img.width, img.height);
      // 压缩逻辑...
      const blob = canvas.convertToBlob({ type: 'image/jpeg', quality });
      self.postMessage({ blob });
    };
    img.src = event.target.result;
  };
  reader.readAsDataURL(file);
};

优化压缩参数

调整压缩参数可以在文件大小和图像质量之间取得平衡。关键参数包括质量系数(0-1)、目标尺寸和输出格式。

// 推荐参数设置示例
const settings = {
  quality: 0.7,       // 中等质量
  maxWidth: 1024,     // 最大宽度
  maxHeight: 1024,    // 最大高度
  mimeType: 'image/jpeg' // 输出格式
};

处理不同图片格式

不同图片格式需要不同的压缩策略。JPEG适合照片类图像,PNG适合需要透明度的图像,WebP则提供更好的压缩率。

function getOutputFormat(file) {
  if (file.type === 'image/png') return 'image/png';
  if (file.type === 'image/webp') return 'image/webp';
  return 'image/jpeg'; // 默认使用JPEG
}

客户端批量压缩

对于需要批量处理多张图片的场景,可以使用Promise.all实现并行压缩。

async function batchCompress(files, options) {
  const promises = files.map(file => {
    return new Promise((resolve) => {
      compressImage(file, options, resolve);
    });
  });
  return await Promise.all(promises);
}

压缩结果预览

提供实时预览功能可以让用户看到压缩效果,便于调整参数。

js实现图片压缩

function showPreview(blob) {
  const preview = document.getElementById('preview');
  const url = URL.createObjectURL(blob);
  preview.src = url;
}

注意事项

  1. 压缩比例过高会导致明显质量损失
  2. 某些浏览器对Canvas有尺寸限制
  3. 透明背景的PNG转换为JPEG时会变成黑色背景
  4. iOS设备上需要注意内存管理问题

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

相关文章

vue实现组件循环图片

vue实现组件循环图片

Vue 实现组件循环图片的方法 在 Vue 中实现组件循环图片通常可以通过 v-for 指令结合动态数据绑定完成。以下是几种常见的实现方式: 使用静态图片路径数组 假设有一组本地图片路径,可以通过数…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

vue实现图片闪烁

vue实现图片闪烁

实现图片闪烁效果的方法 在Vue中实现图片闪烁效果可以通过CSS动画或JavaScript动态控制样式。以下是几种常见方法: CSS动画实现 通过@keyframes定义闪烁动画,并应用到图片元素上…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

vue 实现图片单选

vue 实现图片单选

Vue 实现图片单选功能 在 Vue 中实现图片单选功能,可以通过结合 v-model 和自定义事件来实现。以下是具体实现方法: 方法一:使用 v-model 和计算属性 创建一个 Vue 组件,包…

vue实现图片切换

vue实现图片切换

实现图片切换的方法 使用v-for和v-bind动态绑定图片 通过v-for循环渲染图片列表,结合v-bind动态绑定图片路径,实现切换效果。 <template> <div&…