Содержание

Подготовка изображений для публикации в Internet

Итак, фотки с цифровой фотокамеры слиты, разобраны по директориям, и выбрано несколько для размещения в интернете.

Очень хочется привести все фотки к единому размеру (пусть это будет 1024 пиксела по ширине) и на какждой проставить свой watermark - водяной знак. При этом нет желания обрабатывать каждое изображение отдельно, а есть большое желание обработать их кучкой.

На помощь приходит консоль и пакет для обработки изображений imageMagick. В Debian, да думаю и во многих других дистрибутивах, пакет уже есть в репозиториях и его достаточно установить с помощью Вашего менеджера пакетов.

Конвертим один файл

Прежде всего, определитесь где лежит Ваш watermark

WATERMARK=~/image/watermark.png

Я не стал мудрствовать луково и подготовил изображение в GIMP просто написав адрес своего сайта.

watermark.png

Следующим шагом нам надо сконвертировать основное изображение в подходящий для веба формат и размер. Делается это при помощи утилиты 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 необходимых нам возможностей не содержит.

Интересуют нас ключи:

Приведу модифицированный скрипт с применением данных ключей:

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

FIXME к сожалению, у меня сейчас нет времени поставить свежую версию imagemagic, поэтому данный скрипт не проверен, хотя теоретически работать должен.

Что дальше

Данный скрипт всего лишь только набросок по автоматизации подготовки изображений для web. Мне видится как миниму два направления в которых можно и нужно двигаться:

  1. Определение поворота изображения и на основе этого выбор ширины создаваемого.
  2. Автоматическая загрузка на сервер.

~~LINKBACK~~

1) формат файла естественно может быть любой из поддерживаемых imagemagic