Оптимизация качества уменьшенных изображений в Canvas на JS

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если перед вами стоит задача масштабирования изображения на HTML5 canvas, то с этим отлично справляется функция drawImage:

JS
Скопировать код
var ctx = document.getElementById('canvasID').getContext('2d'); // Получаем контекст для рисования
var img = new Image(); // Создаём новое изображение
img.onload = function() {
  ctx.canvas.width = 200; // Устанавливаем ширину холста
  ctx.canvas.height = 100; // Устанавливаем высоту холста
  // Рисуем изображение с учетом заданного размера
  ctx.drawImage(img, 0, 0, 200, 100);
};
img.src = 'image.jpg'; // Указываем адрес изображения

В этом коде замените canvasID, 200, 100 и image.jpg на те значения, которые вам необходимы. Результатом будет изображение, подогнанное под заданные размеры холста.

Изменение размера с высоким качеством и производительностью

Если для вас важны такие параметры как высокое качества и хорошая производительность, простого использования функции drawImage может быть недостаточно. В этом случае стоит обратиться к методам ресемплирования. Например, фильтр Ланцоша, при масштабировании учитывает каждый пиксель, чтобы изображение оставалось четким и не размывалось. В некоторых браузерах, как, например, в Firefox, для высокого качества масштабирования трубуется дополнительная настройка свойства image-rendering и оптимизация размеров холста.

Вы можете улучшить процесс масштабирования с помощью библиотек, таких как pica, или алгоритмов создания миниатюр изображений. Эти инструменты используют web-воркеры для неблокирующей обработки изображений, что позволяет одновременно достичь высокого качества масштабирования и производительности. Пример использования библиотеки pica:

JS
Скопировать код
var pica = require('pica')(); // Инициализируем pica

var img = new Image(); // Производим манипуляции с изображением
img.onload = function() {
  var offscreenCanvas = document.createElement('canvas'); // Создаём offscreen canvas
  offscreenCanvas.width = desiredWidth; // Задаём ширину
  offscreenCanvas.height = desiredHeight; // Задаём высоту

  pica.resize(img, offscreenCanvas)
    .then(result => pica.toBlob(result, 'image/jpeg', 0.90))
    .then(blob => {
      // Обрабатываем полученный blob
    });
};
img.src = 'image.jpg'; // Указываем адрес изображения

Попробуйте эксперементировать с числом лепестков в фильтре ресемплирования (обычно от 2 до 3), чтобы найти наиболее благоприятное соотношение качества с производительностью.

Интерполяция, ресемплирование и прочие технические аспекты

Загрузка изображения как у профессионалов

Перед тем как начать работать с изображением, удостоверьтесь, что оно полностью загружено. Воспользуйтесь событием img.onload, чтобы знать, когда можно приступать к манипуляциям с изображением. Если вы начнёте работу с незагруженным изображением, результаты могут быть непредсказуемыми.

Используйте аппаратные ресурсы клиента

Воспользуйтесь компьютерной мощностью клиента. Делегируйте ресемплирование изображений web-воркерам, например с помощью библиотеки pica. Это позволит избежать залипания пользовательского интерфейса.

Препятствия для быстродействия

Производительность JavaScript при многопоточной обработке данных ограничена, даже при использовании web-воркеров. Протестируйте обработку изображений в различных браузерах, чтобы выявить возможные проблемы со скоростью обработки.

Визуализация

Для наглядности представим, как происходит изменение размера изображения на HTML5 canvas, через простые визуальные аналогии:

Markdown
Скопировать код
Canvas = 📏 Сцена
Image  = 👕 Главный герой
Resize = ✂️ Поворот событий

Главный герой 👕 не умещается на 📏 сцене.

Поворот событий 📏✂️: Герой 👕 проделал большую работу и преобразился.

Markdown
Скопировать код
До поворота событий: 👕📏 (Изображение слишком большое)
После поворота событий:  [👕] помещается на 📏 (Изображение идеально вписывается)

И вот, под занавес, изображение 🖼️✨ идеально соответствует заданным размерам.

Соблюдение авторских прав

Не забывайте об важности соблюдения авторских прав при использовании готового кода и библиотек. Чётко укажите источник и лицензию использованного кода, чтобы избежать юридических проблем.

Полезные материалы

  1. CanvasRenderingContext2D: метод drawImage() – Веб API | MDN — Документация MDN о методе drawImage для масштабирования изображений.
  2. HTML Canvas – W3Schools — Подборка руководств от W3Schools по работе с HTML5 canvas.
  3. GitHub – konvajs/konva: HTML5 Canvas JavaScript framework — Репозиторий JavaScript-фреймворка Konva.js для разработчиков, ищущих продвинутые возможности, включая масштабирование изображений.
  4. javascript – HTML5 Canvas Resize (Downscale) Image High Quality? – Stack Overflow — Обсуждение на Stack Overflow о высококачественном масштабировании изображений.
  5. CreateJS | Набор JavaScript библиотек и инструментов для работы с HTML5 — EaselJS облегчает работу с HTML5 canvas.