Добавьте в закладки наш новый домен zippic.app — zippic.cn скоро будет закрыт.

Вернуться в блог
Оптимизация изображений

Решение для сжатия изображений на стороне frontend

В этом руководстве подробно рассматривается реализация сжатия изображений на стороне frontend с использованием HTML5 Canvas, сторонних библиотек и онлайн-инструментов для оптимизации производительности Web.

Автор: Kelen
2026/10/22
5 мин чтения
На этой странице
Обложка для Решение для сжатия изображений на стороне frontend

В веб-разработке сжатие изображений — распространённая и важная техническая задача. По мере роста популярности изображений высокого разрешения и мультимедийного контента уменьшение размера файлов при сохранении качества изображений становится критически важным для повышения скорости загрузки страниц и улучшения пользовательского опыта. В качестве промежуточного слоя между пользователем и сервером frontend может выполнять сжатие изображений, эффективно снижая нагрузку на сервер и ускоряя отображение страниц. В этой статье систематически рассматриваются различные технические методы и практические решения для реализации сжатия изображений на стороне frontend.

Сжатие изображений с помощью HTML5 Canvas

Элемент HTML5 <canvas предоставляет frontend мощные возможности для обработки изображений. С помощью JavaScript и <canvas> разработчики могут загружать данные изображений, выполнять такие операции, как масштабирование, обрезка и преобразование формата, а затем создавать сжатые изображения.

Этапы процесса

  • Загрузка изображения: загрузите изображение с помощью объекта FileReader или Image.
  • Отрисовка в <canvas>: отобразите изображение на <canvas>, управляя эффектом сжатия с помощью изменения размеров или параметров рисования.
  • Экспорт изображения: используйте canvas.toDataURL() для преобразования содержимого в изображение с кодировкой Base64 или canvas.toBlob() для получения объекта Blob, который можно дополнительно обработать или загрузить.

Ниже приведён простой пример сжатия изображения с помощью <canvas>:

/**
 * Compress an image using Canvas
 * @param {File|Blob} file - The original image file
 * @param {Object} options - Compression options
 * @param {number} [options.quality=0.7] - Image quality, range 0-1
 * @param {number} [options.maxWidth=1000] - Maximum width
 * @param {number} [options.maxHeight=1000] - Maximum height
 * @returns {Promise<Blob>} - The compressed image Blob
 */
function compressImage(file, options = {}) {
  return new Promise((resolve, reject) => {
    // Set default options
    const { 
      quality = 0.7, 
      maxWidth = 1000, 
      maxHeight = 1000 
    } = options;

    // Validate image file
    if (!file.type.startsWith('image/')) {
      reject(new Error('File is not a valid image'));
      return;
    }

    // Create image object
    const img = new Image();
    const reader = new FileReader();

    reader.onload = function(e) {
      img.src = e.target.result;
    };

    reader.onerror = () => reject(new Error('Failed to read file'));
    reader.readAsDataURL(file);

    img.onload = function() {
      // Calculate resized dimensions
      let width = img.width;
      let height = img.height;
      
      if (width > maxWidth) {
        height = height * (maxWidth / width);
        width = maxWidth;
      }
      
      if (height > maxHeight) {
        width = width * (maxHeight / height);
        height = maxHeight;
      }

      // Create canvas and draw image
      const canvas = document.createElement('canvas');
      const ctx = canvas.getContext('2d');
      canvas.width = width;
      canvas.height = height;
      
      // Draw image to canvas
      ctx.drawImage(img, 0, 0, width, height);

      // Determine image type
      const type = file.type === 'image/jpeg' ? 'image/jpeg' : 'image/png';

      // Convert canvas content to Blob
      canvas.toBlob(
        blob => resolve(blob), 
        type, 
        quality
      );
    };

    img.onerror = () => reject(new Error('Failed to load image'));
  });
}

Использование сторонних библиотек

Помимо нативных JavaScript и HTML5 Canvas, разработчики могут использовать сторонние библиотеки для упрощения процесса сжатия изображений и достижения лучших результатов. Адаптер ImageMagick для Node.js, CompressorJS, Pica и другие библиотеки предоставляют расширенные параметры конфигурации, например более сложные настройки обработки изображений, а также улучшенную кроссплатформенную совместимость, что позволяет использовать их в более сложных сценариях.

Онлайн-инструменты

Сегодня существует множество бесплатных онлайн-инструментов для сжатия изображений, например TinyPNG, Imgur и zippic. Эти инструменты предоставляют удобные сервисы сжатия: пользователю достаточно загрузить изображение, чтобы получить его сжатую версию.

Например, для онлайн-сжатия изображений с помощью zippic:

  1. Перейдите на сайт zippic.
  2. Нажмите на область выбора изображения или перетащите изображение в указанную область.
  3. Выберите формат сжатия и настройте необходимое качество сжатия.

Выбор изображения.webp zippic автоматически обработает изображение, сжав его до указанного формата и размера. После завершения обработки изображение можно скачать. Весь процесс выполняется очень эффективно.

Результат сжатия весьма заметен: изображение исходным размером 1.76MB можно сжать всего до 79KB, достигнув коэффициента сжатия 95.76% при минимальной потере качества.

Результат сравнения

Ключевые аспекты

  • Качество сжатия и размер файла: более высокое качество сжатия позволяет сохранить лучшее качество изображения, но приводит к увеличению размера файла, и наоборот. Настройки следует выбирать в зависимости от конкретных требований.
  • Производительность: сжатие больших изображений на стороне frontend или частое выполнение операций обработки изображений может потреблять значительные ресурсы CPU и негативно влиять на производительность страницы.
Нужно сжать изображения?
Попробуйте zippic — бесплатный онлайн-инструмент для сжатия изображений
  • Сжимайте изображения до 90% без потери качества
  • Обрабатывайте изображения локально в вашем браузере
  • Поддержка JPG, PNG, WebP, GIF и других форматов