Часто приходится изменять размеры и сжимать большое количество картинок. Для этого можно пойти двумя путями: вручную, через графический редактор, или через скрипт. Второй вариант занимает существенно меньше времени.
Далее опишу как пользоваться программами Jpegoptim, OptiPNG, Mogrify для изменения качества и размера изображений. Если работаете на Linux Mint, то Mogrify доступен из коробки, а Jpegoptim, OptiPNG можно загрузить из встроенного менеджера пакетов.
Зачем сжимать картинки?
Современные фотоаппараты снимают с разрешением >20 мегапикселей. И каждая фотография получается размером более 10 мегабайт. Это вполне разумные цифры для объёма памяти фотоаппарата. Но для интернета это чудовищно большие файлы. Если загрузите такую огромную фотографию на свой сайт, то она будет грузиться десять и более секунд.
В интернете принято использовать изображения не превышающие размера в полмегабайта. К примеру, изображение вверху каждой публикации в этом блоге не превышают 200 килобайт. Возможно, через десять лет фотографии размером в 10 мегабайт станут привычными. Но пока все стараются делать их поменьше.
Как уменьшить размер изображения?
Можно уменьшать размер файла изображения через графический редактор, вручную. Но если их несколько сотен, то работа займёт неделю. Гораздо приятнее сделать уменьшение автоматически, программно. Для этого собираем все изображения в одной папке и натравливаем на них несколько программ, которые уменьшат качество и размер: Jpegoptim, OptiPNG, Mogrify
Удалить лишние данные из изображений
Фотоаппараты сохраняют фотографии с лишними данными: гео-локация, марка фотоаппарата и т.п. Их можно удалить из файлов без потери качества изображения. Для этого собираем все фото в одну папку, открываем командную строку в этой папке и пишем:
optipng -strip all *.png
эта команда удалит лишние данные в png изображениях. Если нужно удалить в jpg файлах:
jpegoptim *.jpg --strip-all
Изменить размер
Современные мониторы имеют ~ 2 000 пикселей в ширину. Поэтому ширина фотографий в 5 000 пикселей избыточна. Если уменьшить такое фото до ширины монитора, то можно уменьшить размер файла без видимого ухудшения качества. А если надо вставить фотографию на сайт, в особое место, то можно уменьшить фото ещё и до размера этой области:
mogrify -resize 1500x1500 *
Эта команда изменит размер всех изображений в папке так, чтобы большая сторона не превышала 1 500 пикселей. Если нужно изменить только jpg изображения, то вместо * поставьте *.jpg
Изменить качество
После уменьшения размеров картинки теряется часть веса файла. Но часто этого недостаточно. Для дальнейшего уменьшения необходимо ухудшить качество. Таким способом можно сильно облегчить файл без видимых глазу изменений.
Заходим в ту же папку с изображениями и пишем в консоли:
jpegoptim *.jpg --max=30
Эта команда сократит качество всех jpg изображений до 30% от оригинала. Чаще всего размер файлов этого типа имеет прямую зависимость с качеством. Поэтому уменьшение качества на 70% приведёт к уменьшению размера примерно на те же 70%.
Если надо уменьшить размер файла png, то можно задать уровень сжатия командой:
optipng -o2 *.png
ключ "-o" с цифрой "2" указывает уровень сжатия "2". Максимальный уровень сжатия - "7", минимальный - "0". Как показывает практика, отличия результатов 2 и 7 уровня минимальны. Файлы после сжатия на этих уровнях имеют практически одинаковый размер. Зато сжатие на уровне 2 происходит в пятнадцать раз быстрее. Качество изображения не меняется при изменении степени сжатия.
использую вот такой вариант:
find ./ -type f -iname '*.jp*'| while read i; do convert -strip -geometry 800x800 -quality 80 "$i" "$i";done
Скрипт рекурсивно обходит нижлежащие каталоги и ужимает джипеги согласно настройке. Утилита convert является частью ImageMagick
Если надо конвертировать png в jpg или наоборот, то подойдёт тот же mogrify.
Команда для для конвертации png в jpg:
mogrify -format jpg *.png
.
Команда для конвертации jpg в png:
mogrify -format png *.jpg
.
Последнее время часто использую ресайз вместе со сжатием и чисткой одновременно:
mogrify -resize 1600x1600 * && jpegoptim * --max=70 --strip-all