Подготовка изображений для публикации в 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 необходимых нам возможностей не содержит.

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

  • -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

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

Что дальше

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

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

~~LINKBACK~~

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

Дискуссия

GQ, 2007/03/09 10:31

/bin/ls -1 *.jpg | while read f; do echo $f; done

хе.

for f in *.jpg; do echo $f; done

Зачем лишние fork+exec

Ivan A-R, 2007/03/09 10:54 (2007/03/09 11:02)

Я сталкивался в bash с тем, что когда файлов очень много, то for ругается что аргумент слишком велик. Есть где описание логики его работы?

В общем-то здесь не предполагается работа с большими списками. Но мало ли. А если обрабатывать результат find?

Ага.. Вот сейчас эксперимент поставил ;-)

Проверяем for:

cat test1.sh

#!/bin/sh

cd /usr/bin/
for f in *
do
    echo $f
done
time ./test1.sh
...
./test1.sh  0,18s user 0,02s system 66% cpu 0,306 total

Проверяем пайпы:

cat test2.sh

#!/bin/sh

cd /usr/bin/
/bin/ls -1 | while read f
do
    echo $f
done
time ./test2.sh
...
./test2.sh  0,15s user 0,08s system 82% cpu 0,281 total

Upd: Сейчас потестировал ещё... Сложно сказать, что лучше... И там и там время скачет от 0,150 до 0,350

GQ, 2007/03/09 12:32
Я сталкивался в bash с тем, что когда файлов очень много, то for ругается что аргумент слишком велик. Есть где описание логики его работы?

Странно. Не должен for ругаться. может кто другой ругался. описание логики в bash(1), хотя это стандартный позиксовый цикл, я в таких случаях предпочитаю читать dash(1), а то ман баша это слишком мутное болото ИМХО.

GQ, 2007/03/09 12:35

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

Ivan A-R, 2007/03/09 12:58

Я так особо и не разобрался в её полезности =) Просто оно есть, я и оставил. Кстати, вроде CoComents фильтрует часть спама при добавлении комментариев... По крайней мере когда отключаешь его, то спама сыпется больше =)

GQ, 2007/03/09 13:14

Да нет,оно не для того. Хотя не исключено, что наличие дополнительных полей сбивает с толку спам-роботов.

Мимоход, 2007/03/13 21:25

Рекомендую использовать -normalize особенно для серии фотографий. А зачем временный файл?

convert -normalize -resize $WIDTH $f - | \ composite -quality $QUALITY -dissolve $OPACITY $WATERMARK - $TARGET$f

Мимоход, 2007/03/13 21:57

точнее, convert -normalize -resize $WIDTH $f tga:- | composite -quality $QUALITY -dissolve $OPACITY $WATERMARK tga:- $TARGET$f

Ivan A-R, 2007/03/13 22:38

Да, как-то я забыл про пайпы. Спасибо. Сейчас поправлю.

Enter your comment (wiki syntax is allowed):
Краткая справка
  • **полужирный**
  • //курсив//
  • > цитата
  • [[http://link | Заголовок ссылки]]
Больше о синтаксисе...
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:CC Attribution-Noncommercial-Share Alike 3.0 Unported
image4web.txt · Последние изменения: 2007/11/26 12:49 От plumbum