Оптимизация размера изображений на сайте 2.X

900
Нередко посетители сайтов загружают на сервер "слишком большие" изображения. Зачастую оригинальный размер так никогда и не будет востребован, а память на диске он съедает.
Пользователи InstantCMS 2 знают, что система имеет непростую структуру директории upload, которая ставит некоторых юзеров в тупик при попытке проинспектировать имеющиеся на сайте картинки. Собственно эти обстоятельства и явились неким "вызовом" для написания утилиты, представленной под катом.

Назначение утилиты составить список "слишком больших" изображений и, при необходимости, перезаписать эти файлы с меньшим размером.

Утилита лазает по указанной папке, например, upload/000/u5 или любой другой и смотрит на все картинки. Можно задать типы: jpeg, png, gif. Можно сразу 3 типа, можно 2, можно 1.
"Слишком большие" изображения выбираются:
- либо по размеру файла,
- либо по длине "длинной" стороны изображения.
Например, для изображения 5000х3000px длинная будет 5000px, а для изображения 2200х4000px - 4000px.
Указываем, например, выбирать все, чей размер больше 5 мегабайт, или все, у которых длинная сторона больше 3000px. Запускаете утилиту - получается список. На этом этапе можно и остановиться, и оценить "насколько всё запущено".

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

Когда это станет понятно, вы запускаете утилиту по новой. Но уже добавив исполнение нескольких методов в файле app.php для перезаписи.
И утилита перезаписывает отобранные файлы. Т.е. был upload/000/u5/f/1/ddd.jpg размером 5 мегабайт, станет upload/000/u5/f/1/ddd.jpg с шириной 900px или высотой 600px в зависимости от ориентации. И это будет уже не 5 мегабайт, а гораздо меньше.

Все размеры можно выставлять в файле конфигурации data/config.json
Информация по результатам работы утилиты пишется в файл data/app.log, чтобы ничего не потерялось и можно было смотреть сколь угодно долго.
Спойлер
По ходу выполнения скрипта можно расставлять метки, чтобы оценить время выполнения отдельных участков скрипта.


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

Это основные моменты доступным языком, саму утилиту вы найдёте здесь, а более формальное описание есть в файле readme.ru.md
Deprecation Detector для PHP кода
Комментарии (3)
webtotma 8 сентября 2020 в 14:46 +1
Спасибо. Полезно.

А то я делал в духе:

Код PHP:
  1. find pictures/ -type f -iname "*.jpg" -exec mogrify -resize "800>x600>" {} \; -exec jpegoptim --strip-all --all-progressive -Pptm85 {} \;
Если на серваке, конечно, установлен imagemagick и jpegoptim. Плюс в find можно задать "возраст" файлов для поиска.
@IamB 9 сентября 2020 в 16:40 0
webtotma, благодарю за обратную связь!
В утилите я сейчас, например, для jpeg при сохранении просто указываю quality из интервала [0,100].
Вы в своём варианте задаёте quality=85 и ещё применяете преобразование в прогрессивный jpeg (--all-progressive).
Как тут правильно выбрать quality, чтобы изображению от этого преобразования хуже не стало? Эти два преобразования как-то взаимосвязаны?
webtotma 10 сентября 2020 в 10:18 0
Это просто пример на bash. Все цифры указаны лишь для примера. Использование jpegoptim обусловлено лишь тем, что он умеет делать (когда мне это нужно) lossless-сжатие (т.е без потери качества). А так качество можно указать в параметрах и у mogrify. Использовать прогрессивный jpg или нет - дело вкуса, учитывая его плюсы и минусы.