Итак, фотки с цифровой фотокамеры слиты, разобраны по директориям, и выбрано несколько для размещения в интернете.
Очень хочется привести все фотки к единому размеру (пусть это будет 1024 пиксела по ширине) и на какждой проставить свой watermark - водяной знак. При этом нет желания обрабатывать каждое изображение отдельно, а есть большое желание обработать их кучкой.
На помощь приходит консоль и пакет для обработки изображений imageMagick. В Debian, да думаю и во многих других дистрибутивах, пакет уже есть в репозиториях и его достаточно установить с помощью Вашего менеджера пакетов.
Прежде всего, определитесь где лежит Ваш watermark
WATERMARK=~/image/watermark.png
Я не стал мудрствовать луково и подготовил изображение в GIMP просто написав адрес своего сайта.
Следующим шагом нам надо сконвертировать основное изображение в подходящий для веба формат и размер. Делается это при помощи утилиты convert. Результирующее изображение мы сохраним во временный файл, поскльку в дальнейшем нам ещё понадобится наложить на изображение watermark.
convert -normalize -resize 1024 source.jpg tempimg.tga
Данная команда преобразует изображение source.jpg1) в изображение шириной 1024 пиксела и сохранит во временный файл в формате Truevision TGA, что бы избежать потерь качества и не множить «артефакты» раньше времени. Параметр -normalize «нормализует» изображение – приводит все цветные элементы к единому цветовому пространству.
Следующей командой мы накладываем на нашу фотографию watermark и сохраняем её в результирующий JPEG файл.
composite -dissolve 30 $WATERMARK tempimg.tga -quality 65 target.jpg
Здесь параметр -dissolve 30 означает что watermark должен быть непрозрачен только на 30% при наложении на фотографию, а параметр -quality 65 определяет качество сохраняемого в JPEG изображения.
Пора теперь вспомнить, что всё дело затевалось ради обработки изображений скопом.
Переписывать исходные изображения мы не станем, а результат сохраним в дочерний каталог относительно текущего.
mkdir inet
Получим и обработаем список изображений с помощью конструкции подобной нижеприведённой:
/bin/ls -1 *.jpg | while read f; do echo $f; done
Здесь для каждого файл соответствующего шаблону *.jpg будет выполнена последовательность команд между do и done.
Возможен и другой вариант:
for f in *.jpg; do echo $f; done
Какой из них оптимальнее, сказать со 100% уверенностью не могу. Я предпочитаю первый.
В результате мы получаем вот такой вот скрипт
~/bin/image2web.sh
#!/bin/sh # Configuration WATERMARK=~/images/watermark.png WIDTH=1024 QUALITY=65 OPACITY=30 MASK='*.jpg' TARGET='inet/' # Process mkdir -p $TARGET # Get and processed all masked files /bin/ls -1 $MASK | while read f do echo "Processed '$f' image" convert -normalize -resize $WIDTH $f tga:- | composite -quality $QUALITY -dissolve $OPACITY $WATERMARK tga:- $TARGET$f done echo All done
Обратите внимание, здесь мы избавились от промежуточного файла и передаём изображение между процессов с помощью потоков. Кроме того, это должно дать прирост производительности на многопроцессорных системах.
И примерчик фотографии обработанной данным скриптом с использованием -normalize (слева) и без нормализации (справа):
Нажмите на изображение, что бы увидеть его полный размер.
alexkbs нашел способ автоматических поворотов и машстабирований изображений. Но для этого понадобится последняя версия пакета imagemagic. Версия ImageMagick 6.2.4 02/10/07 Q16 которая присутсвует в debian lenny необходимых нам возможностей не содержит.
Интересуют нас ключи:
-auto-orient - автоматически поворачивает фотографии согласно данных из EXIF.-adaptive-resize WIDTHxHEIGHT - вписать изображение в указанный прямоугольник с сохранением пропорций.Приведу модифицированный скрипт с применением данных ключей:
image4web.sh
#!/bin/sh # Configuration WATERMARK=~/images/watermark.png QUALITY=75 SIZE="-adaptive-resize 1024x1024" ORIENT="-auto-orient" OPACITY=30 MASK='*.jpg' TARGET='inet/' # Process mkdir -p $TARGET # Get and processed all masked files /bin/ls -1 $MASK | while read f do echo "Processed '$f' image" convert -normalize -verbose $ORIENT $SIZE $f tga:- | composite -quality $QUALITY -dissolve $OPACITY $WATERMARK tga:- $TARGET$f done echo All done
к сожалению, у меня сейчас нет времени поставить свежую версию imagemagic, поэтому данный скрипт не проверен, хотя теоретически работать должен.
Данный скрипт всего лишь только набросок по автоматизации подготовки изображений для web. Мне видится как миниму два направления в которых можно и нужно двигаться:
~~LINKBACK~~