На главную
  Назад в „Автоматизация рутинных операций“  

Использование GraphicsMagic для пакетного изменения размеров изображений

Как — то раз понадобилось мне изменить размер для большого количества изображений в папке. Предположим, что это была большая куча фотографий 20 мегапиксельных, по 8 мегабайт весом каждая. С отчётом о поездке в дальние края. И захотелось выложить их мне на сайт, а для этого надобно их ужать, да оптимизировать.
Конечно пару / десяток фотографий можно и руками, можно в Фотошопе, можно ещё поискать программы, да скрипты под это дело заточенные.. Но, это ведь не так интересно, как написать пару строк в консоли и всё само чтобы обработалось красиво. Тут тебе и удовольствие от сделанного, и опыт который в будущем обязательно пригодится и материал для сайта, добрым людям в помощь.

GraphicsMagick логотип Один важный момент, всё происходит не в OS Windows, a в OS Ubuntu.
Устанавливаем отличный пакет для работы с изображениями GraphicsMagick. Именно GraphicsMagick а не ImageMagick. Почему? Просто это более продвинутый форк.

Кстати, под Windows он тоже устанавливается, так - что при небольшом шаманстве этот же подход можно и там использовать.

После такой долгой прелюдии, всего-то строка кода: find -name "*.JPG" | while read f; do gm -convert -scale 800 $f thumbs/$f; done
Тут:
JPG — расширение обрабатываемых файлов.
800 — Целевая ширина конвертации.
thumbs/ — Папка, в которую будут складываться уменьшенные изображения.
done — Признак конца операции.
В итоге, в папке thumbs имеем уменьшенные копии фотографий, с теми же названиями.

В случае, если название нужно немного изменить — добавить постфикс _sm для уменьшенных превьюшек, можно написать так: find -name "*.JPG" | while read f; do gm -convert -scale 200 "$f" "thumbs/${f%.*}_sm.jpg"; done

Дополнительно может понадобится изменить регистр букв в именах всех файлов, так-как некоторые особо продвинутые фотоаппараты упорно ставят расширение в верхнем регистре.
В этом случае пишем: rename 'y/A-Z/a-z/' *


Ну и если очень хочется добавить водяные знаки, чтобы никто просто так не мог фотографии скачать с Вашего сайта и выдать за свои, то это сделать тоже не сложно: composite -dissolve 55 -gravity SouthEast  watermark_image.png target_image.jpg result_image.jpg Или в цикле: find -name "*.JPG" | while read f; do composite -dissolve 55 -gravity SouthEast  watermark.png "$f" "wat/${f%.*}"; done

Тут:
55 — Степень прозрачности накладываемого изображения.
SouthEast — Константа определяющая положение накладываемого изображения. Может принимать одно из следующих значений:
NorthWest, North, NorthEast, West, Center, East, SouthWest, South, или SouthEast.
watermark_image.png —Путь до файла накладываемого изображения.
target_image.jpg — Путь до целевого файла с фотографией.
result_image.jpg — Путь и название результирующего файла.

Ещё:
gm mogrify -resize 120x120! imagename.jpg изменит размер изображения на 120x120 не взирая на соблюдение пропорций.
Или в цикле:
( ВНИМАНИЕ! Этот скрипт ПАРЕЗАПИШЕТ существующие фотографии их уменьшенными копиями, так-что сначала скопируйте изображения которые будете конвертировать в отдельную папку!) find -name "*.JPG" | while read f; do gm mogrify -resize 120x120! "$f"; done

Если задача состоит в том, чтобы привести все изображения к одной ширине, вне зависимости от их ориентации, то подойдёт такой код: gm -convert -geometry '650^x436^' target_image.jpg result_image.jpg Тут: '650^x436^' - максимальные ширина или высота, символ крышки ^ - признак того, что данное значение будт использоваться в качестве максимального. Или в цикле:
find -name "*.JPG" | while read f; do gm -convert -geometry "650^x436^" "$f" "thumbs/${f%.*}_sm.jpg"; done Обработка 200 фотографий по 2.5Мб каждая заняла у меня около 4 минут.

Вот и всё!
Успешной, приятной и эффективной работы!

Павел Осипов
2011.07.19



  Наверх