Подготовка изображений для публикации в Internet
Итак, фотки с цифровой фотокамеры слиты, разобраны по директориям, и выбрано несколько для размещения в интернете.
Очень хочется привести все фотки к единому размеру (пусть это будет 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~~










Дискуссия
/bin/ls -1 *.jpg | while read f; do echo $f; done
хе.
for f in *.jpg; do echo $f; done
Зачем лишние fork+exec
Я сталкивался в bash с тем, что когда файлов очень много, то
forругается что аргумент слишком велик. Есть где описание логики его работы?В общем-то здесь не предполагается работа с большими списками. Но мало ли. А если обрабатывать результат
find?Ага.. Вот сейчас эксперимент поставил
Проверяем for:
cat test1.sh
Проверяем пайпы:
cat test2.sh
Upd: Сейчас потестировал ещё... Сложно сказать, что лучше... И там и там время скачет от 0,150 до 0,350
Странно. Не должен for ругаться. может кто другой ругался. описание логики в bash(1), хотя это стандартный позиксовый цикл, я в таких случаях предпочитаю читать dash(1), а то ман баша это слишком мутное болото ИМХО.
Кстати, посмотрел cocomments - забавная штука, надо попробовать.
Я так особо и не разобрался в её полезности
Просто оно есть, я и оставил. Кстати, вроде CoComents фильтрует часть спама при добавлении комментариев... По крайней мере когда отключаешь его, то спама сыпется больше
Да нет,оно не для того. Хотя не исключено, что наличие дополнительных полей сбивает с толку спам-роботов.
Рекомендую использовать -normalize особенно для серии фотографий. А зачем временный файл?
convert -normalize -resize $WIDTH $f - | \ composite -quality $QUALITY -dissolve $OPACITY $WATERMARK - $TARGET$f
точнее, convert -normalize -resize $WIDTH $f tga:- | composite -quality $QUALITY -dissolve $OPACITY $WATERMARK tga:- $TARGET$f
Да, как-то я забыл про пайпы. Спасибо. Сейчас поправлю.
- **полужирный**
- //курсив//
- > цитата
- [[http://link | Заголовок ссылки]]
Больше о синтаксисе...