ImageMagick: как правильно сжать фотографии, загружаемые на сервер

Однажды я заметил, что фотографии, загружаемые пользователями на одном нашем сайте, уж слишком много весят. Точнее, слишком тяжелыми делались фотки-миниатюры, которые были по размерам меньше 100 пикселей по каждой из сторон, но могли при этом иметь размер и в 100 килобайт. Еще обратил внимание, что одни фотографии такие огромные, а другие весят, как им и положено, 2-3 килобайта.

Сначала грешил на несовершенство jpeg-сжатия картинок с большим количеством деталей, но все же не нашел корреляции между «сложностью» фотографии и размером ее миниатюры. Еще настораживало, что разница в килобайтах между самыми маленькими миниатюрами и копиями той же фотографии, большими по пикселям в несколько раз, не такая уж и существенная…

И тут меня осенило: фотографии, загружаемые практически напрямую с фотоаппарата на сайт, имеют дополнительные метаданные об условиях съемки и т.п., а imagemagick, которым мы пользуемся для уменьшения изображений, не удаляет эту метаинформацию. В итоге даже в самой маленькой картинке — десятки никому не нужных килобайт. А если таких картинок на странице много, то это выливается в мегабайт или даже больше бессмысленного трафика.

Покопавшись в вопросе, я обнаружил, что у конвертера из пакета imagemagick есть замечательная опция -strip, как раз и нужная мне: она удаляет из фотографии всю ненужную информацию. Вот как будет выглядеть команда, если вы хотите, например, уменьшить фотографию in.jpg до размеров максимум 100 на 100 пикселей, удалить метаданные, и сохранить в качестве 80% (а больше для миниатюр и не надо) в файл out.jpg:

Кстати, пройдясь этой опцией -strip (другие опции не нужны, просто удаляем мусор) по всем картинкам, уже загруженным на сервер, мы уменьшили общий объем фотографий и их миниатюр на несколько гигабайт. А учитывая, что бэкапы мы храним на облачном сервере и платим за объем, это все выливается хоть и в небольшую, но все же экономию. Я уж не говорю про экономию трафика с самого сервера, если за его объем нужно платить. В общем, такое мелкое исправление в коде, а сколько плюсов.

Добавить комментарий