当前位置:首页 > 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在后台线程中进行处理。

js实现图片压缩

// 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则提供更好的压缩率。

js实现图片压缩

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

压缩结果预览

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

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
分享给朋友:

相关文章

vue2实现图片懒加载

vue2实现图片懒加载

实现图片懒加载的方法 在Vue2中实现图片懒加载可以通过以下方法完成,核心原理是监听图片是否进入可视区域,再动态加载图片资源。 使用IntersectionObserver API Intersec…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现分页

js实现分页

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

jquery图片

jquery图片

jQuery 图片操作 jQuery 提供了多种方法来处理图片,包括加载、显示、隐藏、动画效果等。以下是一些常见的 jQuery 图片操作方法: 动态加载图片 使用 jQuery 的 attr()…

css制作图片

css制作图片

使用CSS创建图片效果 CSS可以通过多种方式实现图片的显示、处理和特效。以下是几种常见的方法: 使用background-image属性 在CSS中可以通过background-image属性将图…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…