10 февраля 2013 г.

Пакетная обработка фотографий, часть 1

Сегодня мы поговорим о пакетной обработке фотографий, а именно о создании превьюшек и подписей на фотографии. Много текста, немного картинок, так что крепитесь :)

Велосипедостроение

Тема не блещет оригинальностью, придумано множество решений — кто во что горазд. Тут и использование actions/droplets в Photoshop, и различные картинко-комбайны IrfanView, ACDSee и FastStone и иже с ними, а также много еще чего. Кому как удобно и как привычно. В этой заметке я хочу показать способ, возможно несколько необычный — через работу с командной строкой.

Если честно, я не фанат черных консольных окон, командных строк. Я больше люблю красивые окошки и удобные интерфейсы. Но так получается, что некоторые действия действительно удобнее и быстрее делать через командную строку, когда не надо тыкать мышкой в кучу кнопок и нажимать лишние клавиши. В самом деле, обычно для работы и управления файлами я использую FreeCommander — двухпанельный файловый менеджер. Командная строка там вызывается горячими клавишами, причем уже установлена активная рабочая директория. Остается дописать команду и жмякнуть Enter. Один раз по-хорошему настроить, а потом пользоваться. Unix-way, короче.

Собственно, задача: конвертировать все фотографии из указанной папки в jpg с указанием размера, увеличением четкости и установкой подписи. Причем, если край фотографии темный, подпись должна быть светлая, а если светлый, то, соответственно, темная. Пожалуй, это и стало главной причиной создания этого маленького конвертера.

Итак, нам потребуются:

  • ImageMagick — инструмент пакетной обработки фотографий с интерфейсом командной строки;

  • Python 3.3+ — интерпретатор языка Python, на котором мы и напишем наш скрипт, обрабатывающий фоточки-моточки.

ImageMagick

Сначала разберемся с ImageMagick, потому что именно с его помощью мы будем делать все операции по обработке фотографии, а Python нужен только для того, чтобы подготовить список файлов для обработки и настроить опции конвертации.

Изменение размера

У ImageMagick есть куча опций, с помощью которых можно сделать что угодно от простого изменения размера, до применения хитрых фильтров. Относительно нашей задачи, команда для изменения размера картинки, добавления резкости и сохранения в jpg с заданным качеством выглядит так:

convert test.jpg -resize "1200x1200>" -unsharp "20x0.8" -quality 92 result.jpg

Знающие английский, думаю, без проблем поймут какая опция что значит (кто не догадался, можно посмотреть). В общем-то, это и есть основной костяк всей нашей программы. Грубо говоря, вокруг этой команды все и крутится. convert - утилита, которая входит в состав ImageMagick. Все просто. берем файл, изменяем размер до 1200 пикселей по длинной стороне, добавляем резкость через «нерезкую маску» и сохраняем с качеством 92.

Подпись фотографий

Теперь подпись фотографий. Ставить ее будем в правом нижнем углу, параллельно правой стороне.

convert test.jpg -pointsize 16 -weight 800 -fill rgba(255,255,255,0.6) 
    -gravity "SouthEast" -annotate 270x270+2+130 "ANWINGED.RU" result.jpg

Все значения подбирались «на глаз». Размер шрифта 16, толщина — 800 чего-то, цвет белый с непрозрачностью 60%, расположение «юго-восток» (-gravity "SouthEast"), текст поворачиваем вокруг свей оси на 270 градусов и смещаем относительно края на 2 пикселя по горизонтали и на 130 по вертикали, иначе после поворота он оказывается за пределами фотографии. 270 градусов, потому что поворот идет по часовой стрелке.

Но увы, цвет у нас задается напрямую. Если край фотографии окажется светлым, ничерта не будет видно нашей подписи. Значит, надо сперва выяснить какого цвета область в углу:

convert test.jpg -resize "1200x1200>" -gravity SouthEast 
    -crop 40x160+0+0 -resize 1x1! -colorspace GRAY -depth 8 txt:-

Уменьшаем картику до желаемого размера, потом вырезаем кусочек 40×160 пикселей из правого нижнего угла, еще раз уменьшаем его до размера 1×1 пиксель и переводим в оттенки серого. Результат будет выведен на экран:

# ImageMagick pixel enumeration: 1,1,255,gray
0,0: (104,104,104)  #686868  gray(104,104,104)

Смотрим на вторую строчку. Пиксель [0,0], цвет gray(104,104,104). То, что надо. Уменьшение размера до 1×1 пикселя как раз и надо, чтобы выбрать средний цвет области. Зная средний цвет области, можно лучшим образом выбрать цвет для подписи. Хочется добавить, что «средний цвет» — вещь весьма условная, и может так получиться, что часть надписи попадает на светлую область, а часть на темную. Для сравнения две фотографии:

Темная фотография - светлая подпись Светлая фотография - темная подпись

Замечания по ImageMagick

Я не очень разобрался как ImageMagick работает с цветовыми профилями, которые могут быстро встроены в изображения. Может, кто-нибудь меня просветит по этому поводу? :)

Что касается конвертации RAW-форматов камер. Для этого используется еще одна утилита dcraw из набора ImageMagick. Работает она вполне неплохо, впрочем соответствия внутрикамерному jpg все равно нет, а жаль. К примеру, с моего Nikon D60 конвертировала фотографии так (справа — внутрикамерный jpg):

Обработка dcraw Внутрикамерная обработка

По ImageMagick, пожалуй, все. Нужные команды есть, осталось теперь обернуть их в удобную оболочку. Этим займется Python во второй части статьи.

Если вам понравилось, можете догнать автора и причинить ему добро.

4 комментария:

  1. Ответы
    1. Ну не все же по кнопочкам тыкать :)

      Удалить
  2. Мда... Действительно велосипед с настоящим гиковским приводом :)

    ОтветитьУдалить