30 сентября 2008 г.

Подготовка фотографий к публикации в интернете.

Не так давно я обзавёлся цифровой камерой, и на моём жёстком диске гордо заняла своё место и начала расти немалая стопка фотографий. Захотелось ими поделиться, но не тут-то было: мой асимметричный канал всяко противился загрузки фотографий в их исходном качестве (по 3,5 МБ на фото). Поэтому потребовалось придумать что-нибудь этакое, способное ресайзить фотографии пачками. Ещё мне хотелось поместить на них т.н. watermark («водяной знак») — поместить в один из уголков своё имя.

Под операционку имени Билла Гейтса существует множество платных программ, предназначенных специально для этих целей. Однако, у пользователей Linux есть более простые и гибкие инструменты, способные в считанные минуты справиться с этой задачей. Вот тут предлагается решение этой задачи. Это пример того самого преславутого «unix-way», когда несколько небольших строго специализированных программ справляются со своей задачей лучше и быстрее монстра-комбайна по переработке картинок.

Итак, для начала нам понадобится эти самые специализированные программы. Вышеозначенные действия умеют выполнять программы из комплекта Imagemagick. Кроме того, нам будет полезна утилитка, которая переворачивает картинку в соответствии с её EXIF-тегом (цифровые фотоаппараты определяют, когда ориентация снимка была книжной и прописывают это в EXIF-теге). В этом нам поможет renrot. Ставим всё необходимое:

$ sudo aptitude install imagemagick renrot

Это ещё не всё. Так как нам нужен «водяной знак», который мы будем накладывать на фотографии, не помешает его заранее приготовить. Автор руководства по ссылке предлагает сделать его в формате JPG. Но это не обязательно, поэтому если хотите «водяной знак» с прозрачным фоном — PNG вполне сгодится. Поскольку мы планируем пользоваться им постоянно, готовый знак рекомендую спрятать с глаз долой, спрятав его в скрытую папку, либо просто переименовав его таким образом, чтобы первым символом в названии файла была точка.

Теперь, непосредственно к механизму работы нужных нам программ. Для изменения размера изображения нам потребуется утилита convert. У неё довольно обширные возможности, однако, нас интересует изменение размера и jepg-качества картинки. Это действие производится с помощью команды:

$ convert -resize N -quality M исходный_файл.jpg конечный_файл.jpg

Где N — желаемая ширина в пикселях, например 1024, а M — желаемое jpeg-качество, например, 89. Если вместо конечный_файл.jpg задать исходный_файл.jpg, то утилита преобразует исходный файл и заменит его новой, уменьшенной (или увеличенной) версией. Для того, чтобы вклеить в картинку знак, нам потребуется утилита composite:

$ composite -gravity northeast -dissolve L знак.jpg исходный_файл.jpg конечный_файл.jpg

Эта команда встроит ваш знак.jpg в правый верхний (northeast) угол картинки, прозрачность (точнее, непрозрачность) задаётся значением L. Исходный файл также, как и в случае с предыдущей командой, может быть заменён конечным.

В целом, всё необходимое уже есть. Наш скрипт будет выглядеть примерно так:

#!/bin/bash
WATERMARK="$HOME/.watermark.png"

echo "*****************************************"
echo "* Image Resize and Watermarking Script *"
echo "* By Gilbert Mendoza - SavvyAdmin.com! *"
echo "*****************************************"
echo " "

for i in ~/Photo_publ/landscape/*{.jpg,.jpeg,.png,.JPG,.JPEG,.PNG}
do
echo "Working on $i ..."
convert -resize 1024 -quality 89 $i $i 2> /dev/null
composite -gravity southeast -dissolve 75 $WATERMARK $i $i 2> /dev/null
echo "... Done!"
done
exit 0

Этот скрипт будет обрабатывать все файлы с расширениями .jpg, .jpeg, .png, .JPG, .JPEG, .PNG, находящиеся в папке ~/Photo_publ/landscape, заменяя их на новые. Знак находится в домашнем каталоге: ~/.watermark.png. При необходимости замените пути, не забудьте задать права на исполнение, разместите в /usr/local/bin и пользуйтесь.

Наблюдательные читатели уже заметили, что в вышеозначенном скрипте не фигурирует указанная мною ранее утилита renrot. Всё верно, этот скрипт предназначен для обработки «альбомно»-ориентированных изображений. Для «книжно»-ориентированных я предлагаю использовать следующий скрипт:

#!/bin/bash
WATERMARK="$HOME/.watermark.png"

echo "*****************************************"
echo "* Image Resize and Watermarking Script *"
echo "* By Gilbert Mendoza - SavvyAdmin.com! *"
echo "*****************************************"
echo " "

for i in ~/Photo_publ/portrait/*{.jpg,.jpeg,.png,.JPG,.JPEG,.PNG}
do
echo "Working on $i ..."
renrot --no-rename $i 1> /dev/null 2> /dev/null
convert -resize 768 -quality 89 $i $i 2> /dev/null
composite -gravity southeast -dissolve 75 $WATERMARK $i $i 2> /dev/null
echo "... Done!"
done
exit 0

Во-первых, для этих картинок вам может понадобиться другой размер (меняем местами ширину и высоту), во-вторых, renrot создаёт резервные копии файлов при конвертировании (с расширением .*_orig), поэтому после эти файлы может понадобиться удалить. Всё остальное аналогично предыдущему, пути почти те же. Меняете, что нужно, добавляете атрибуты, кладёте в желаемое место, и пользуетесь. Длительность процедуры зависит от характеристик железа, всё-таки, работа с графикой требует от системных ресурсов многих усилий. Прежде, чем в полную силу использовать скрипт, рекомендую сделать резервные копии фотографий. Приятной обработки картинок!

PS. Мне кажется, что всё это можно привести к единому скрипту, нужно только заставить наш скрипт распознавать соотношение сторон и если оно соответствует одной маске — исполнять одну команду изменения размера, в противном случае — другую. Если уважаемые читатели знают, как это сделать, буду благодарен.

8 комментариев:

Семен Семеныч комментирует...

Я могу заблуждаться, но по моему у ImageMagick есть ключик, который позволяет сделать умный ресайз. Типа "привести большую сторону к 1024 и оставить исходный коэффициент соотношения сторон". Тогда пропадает необходимость в двух разных папках и разных скриптах. Правда точно эту опцию сейчас посмотреть не могу -- нету доступа к манам.

Ivan A-R комментирует...

% convert -resize 600x600 ../P9236196.JPG 1.jpg

% convert -v
Version: ImageMagick 6.3.7 05/02/08 Q16 http://www.imagemagick.org

Оно даже без всяких ключиков умеет делать умный ресайз. Результирующие изображение вписано в прямоугольник 600х600

drakulavich комментирует...

Опредили. 1024x1024 избавит от необходимости переворачивать снимки :-)
У jetxee описывался прием пакетного уменьшения, только без водяных знаков.

Vladimir Dolzhenko комментирует...

обычно, масштабирование более, чем в 2 раза "смазывает" изображение, поэтому часто после масштабирования немного повышают резкость (sharpness)

Надеюсь полезной будет информация про масштабирование картинок силами imagemagick и Python Imageing Library.

Ivan A-R комментирует...

Dr.AKULAvich, кажись это описывает каждый после покупки камеры =)

Я тоже описвал полтора года назад =)

Von_old комментирует...

Огромное всем спасибо!
Сейчас допилю скрипт и сотворю отдельный пост.

libc6 комментирует...

Отличный пост. Спасибо. И отдельное - за водяные знаки. Буду пользоваться. Ато статьи тырят.

Von_old комментирует...

libc6
Всегда пожалуйста! :)

Отправить комментарий