Сжатие картинок с помощью Python

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

Часто после парсинга картинки не оптимизировованы: имеют большой вес и размер или неподходящий формат. Уменьшение веса и размера, переход на современный формат изображений (JPEG 2000, JPEGXR, WebP, AVIF) гарантируют более быструю загрузку для пользователей.

Например, изображения WebP без потерь на 26% меньше по размеру по сравнению с PNG, а с потерями на 25-34% меньше, чем сопоставимое изображение JPEG с эквивалентным индексом качества. Подробнее здесь.

Стоит оговориться, что современные форматы изображений поддерживают не все браузеры, поэтому обязательно оставляйте резерные изображения в старых форматах JPEG, PNG.

Для массовой обработки картинок нам понадобится скрипт, который будет менять размеры изображения, сжимать и сохранять в нужном формате. Напишем его на Python.

Алгоритм работы скрипта

Напишем скрипт на python, который будет:
  1. загружать имена исходных файлов в память;
  2. создавать новую директорию для преобразованных файлов;
  3. обрежем изображение, если оно больше необходимого;
  4. сожмем в требуемом формате и сохраним.
Установим библиотеку изображений Python, которая обеспечивает обширную поддержку форматов файлов и широкие возможности обработки изображений:
pip install Pillow
Исходный код скрипта сжатия и изменения формата изображений находится на Github.

Выбор формата при конвертации изображений

Библиотека Pillow поддерживает множество форматов. Самыми распространенными среди них являются GIF, ICO, JPEG, PNG, TIFF, WebP, PSD и др.
Об остальных форматах написано в документации.

В документации обратите внимание на параметры, принимаемые функциями. В частности для формата JPEG имеется возможность задать качество итоговых файлов (от 0 до 95, по умолчанию 75), для WebP - оставить картинку без потери качества, влиять на скорость обработки файлов.

В нашем скрипте для изменения формата изображений необходимо поменять в функции "comperss_image" формат и параметры:
adapt_path = adapt_directory + '/' + filename + '.webp'
img.save(adapt_path, "webp", quality=80, method=6)

Хотите получить предложение по оптимизации картинок на сайте?