Предисловие: обожаю модульные решения! :)
Изначально моей идеей было сжимать все картинки в webp. Формат, увы, не поддерживается Firefox (пока), но на телефоне большинство браузеров на движке Blink, так что - живем! Простая замена формата в стандартном конфиге RabbIT и все работает... но потом я решил попробовать запустить обработанную страничку на PaleMoon (он тоже умеет webp). PaleMoon показывает только дырки и жалуется на ошибки в изображении.
Написал автору программы, и поинтересовался, может ли она менять на лету MIME-type файла. Оказалось - может, но есть особенности. Нужно рядом с конвертированным файлом дополнительно создавать файлик с тем же именем и расширением type, содержимое которого - строка с типом (нужный нам - image/webp).
Написав элементарный cmd-шник под это дело, я решил заморочиться и еще и gif переделывать во что-нибудь этакое, более современное. Изначально я замахнулся на webm (кодек VP9) и попробовал реализовать это. Увы, но хоть файлы и перекодируются, но на странице это добро отображаться перестает. Остаются APNG (Firefox) и WebP Animated (Chrome). Здесь еще одна проблема - GraphicsMagick не умеет кодировать webp-анимацию. К счастью, это умеет ffmpeg, который я уже и так скачал.
По итогам: разница в качестве изображения на экране телефона (1270x720) незаметна. Только если очень-очень сильно приглядываться. Разница в размерах - от 3 раз, но в среднем получается ощутимо больше. Например
вот эта картинка в виде JPEG весит 123кб, а в виде сжатого webp - 5.61. Выигрыш в 22 раза. А
39,7Мб лихо ужимается до 1,42Мб, выигрыш в 27 раз. При этом никаких адских артефактов изображения нет - оно просто становится более "сглаженным".
GIF ужимается менее круто, но тоже хорошо. Скажем,
4,79 мегабайт котяток преобразованные в webp весят всего 267 кб. 17 раз. Но тут многое зависит от содержания гифок. Порой разница незначительна - скажем, из 1,4 мегабайта одной из локальных гифок получилось всего 700кб webp. Впрочем, два раза - это тоже хорошо :)
html, css и js сжимаются в gzip (по умолчанию только html, остальное надо разрешить в настройках) но доля текста на современных страничках ничтожна.
Ну а теперь - что потребуется для того, чтобы поднять такую же игрушку у себя, локально или на VPS.
Я лично использую винду и инструкцию дам под нее, но принципиальной разницы нет - все кроссплатформенное. Скачиваем с оффсайта
RabbIT proxy,
FFmpeg и
GrapicsMagick. Для работы RabbIT так же потребуется
JRE.
RabbIT укладывается в какую-нибудь папочку, в нее же складируется распакованный ffmpeg и gm.
Настройка rabbit.conf - ищем [rabbit.handler.ImageHandler*jpeg] и пишем туда следующие параметры:
converter_type=external
convert=.\cmnd\jpegz.cmd
convertargs=$filename
min_size=0
quality=0.1
Для остального - параметры аналогичные, разве что для [rabbit.handler.ImageHandler*gif] имеет смысл поставить min_size=100. Анимированные гифки больше, а статические конвертировать не имеет смысла.
Теперь - идем в папку cmnd и создаем два файлика: jpegz.cmd и gifz.cmd
Содержимое jpegz.cmd:
.\gm\gm.exe convert -quality 15 -flatten %1 +profile "*" webp:%1.c
echo image/webp > %1.type
Содержимое gifz.cmd
.\ffmpeg\bin\ffmpeg.exe -i %1 -c:v libwebp -threads 6 -bufsize 12M -c:v libwebp -loop 0 -compression_level 6 -q:v 10 -an -f webp %1.c
echo image/webp > %1.type
Для того чтобы это работало еще и с HTTPS, потребуется использовать
Proxomitron SSL Helper и запускать по отдельному процессу RabbIT на каждую "ветку".