29 сентября 2014 г.

ImageMagick: Пакетная обработка изображений с разной ориентацией

Пакетная обработка изображений — одновременное автоматическое выполнение операций над множеством графических файлов.

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

Моим излюбленным инструментом является программа ImageMagick вкупе с языком программирования Python.

Преимущества ImageMagick

ImageMagick — свободный и многоплатформенный пакет программ для неинтерактивной (пакетной) обработки графических файлов. Поддерживает множество форматов изображений и позволяет изменять их размеры, кадрировать, изменять наклон, менять цветовую схему и т.д.

Преимущества:
  • Бесплатность
  • Многоплатформенность (Linux, Mac OS X и др. UNIX-подобные, Windows, iOS)
  • Широкий набор возможностей
  • CLI-интерфейс (да-да именно это одно из основных преимуществ, но есть и графическая оболочка)
  • Наличие интерфейсов для различных языков программирования (Python, Php, Perl и др.)
ImageMagick является консольным графическим редактором. Это означает, что перед вами не будет красивого интерфейса с панелями инструментов и множеством кнопок. Все операции задаются посредством команд, вводимых в командной строке. Многих это отпугивает, но в действительности это является преимуществом программы.

Во-первых, из-за отсутствия навороченного графического интерфейса(GUI) программа потребляет меньше ресурсов. Во-вторых, это позволяет встраивать программу в собственные скрипты, что и мы и сделаем дальше.

Установка ImageMagick

Страница загрузки ImageMagick — www.imagemagick.org/script/binary-releases.php

В большинстве Linux-дистрибутивов ImageMagick установлен по умолчанию, либо имеется в стандартных репозиториях.

В Ubuntu(и других Debian-based дистрибутивах) для установки нужно выполнить в терминале команду:
sudo apt-get install imagemagick

В RedHat\Fedora:
sudo yum install imagemagick

Основные команды

ImageMagick включает в себя ряд утилит командной строки для работы с изображениями — animate, compare, composite, conjure, convert, display, identify, import, mogrify, montage и stream.

Команд и возможностей много, поэтому опишу только те, что использую чаще всего.

Информация об изображении

Для получения информации об изображении используется утилита identify.
identify example.png

При вызове без аргументов она выдает такой результат:
example.png PNG 1063x591 1063x591+0+0 8-bit DirectClass 114KB 0.000u 0:00.000

Вызов утилиты с опцией -verbose выдает полную информацию об изображении:
 identify -verbose example.png
Image: example.png
Format: PNG (Portable Network Graphics)
Class: DirectClass
Geometry: 1063x591+0+0
Resolution: 118.11x118.11
Print size: 9.00008x5.00381
Units: PixelsPerCentimeter
Type: TrueColorAlpha
Endianess: Undefined
Colorspace: sRGB
Depth: 8-bit
...
Оставшаяся часть вывода опущена


Если нужно получить какие-то конкретные параметры, то нужно использовать опцию -format, который может принимать разные атрибуты (полный список атрибутов приведен здесь — www.imagemagick.org/script/escape.php)

Так, например, если требуется узнать только размер изображения, необходимо ввести следующую команду:
identify -format "%G" example.png

Атрибут "%G" возвращает значения ширины и высоты в пикселях. Вывод будет следующим:
1063x591

Чтобы узнать только цветовую схему изображения, применяется атрибут "%r":
identify -format "%r" example.png
DirectClass sRGB Matte


Атрибуты можно комбинировать. Например для получения размеров изображения в дюймах нужно ввести такую команду:
identify -format "%[fx:w/72] на %[fx:h/72] дюймов" example.png
14.7639 на 8.20833 дюймов

Изменение размера изображений

За данную функцию отвечает утилита convert. Чтобы изменить размер изображения, используется команда convert -resize ШИРИНАхВЫСОТА:
convert -resize 500x400 example.png out.png

Проведем проверку результатов:
identify -format "%G" example.png
1063x591

identify -format "%G" out.png
500x400


Чтобы пропорционально изменить размер, необходимо указывать только один из параметров. Уменьшим пропорционально ширину изображения:
convert -resize 600x example.png out.png

identify -format "%G" example.png
1063x591

identify -format "%G" out.png
600x334


Можно задавать значения в процентах. Значения меньше 100% уменьшают размеры, больше — увеличивают:
convert -resize 50% example.png out.png
convert -resize 150% example.png out2.png

identify -format "%G" example.png
1063x591


identify -format "%G" out.png
532x296


identify -format "%G" out2.png
1595x887

Изменение цветовой схемы(модели) изображения

Для перевода изображения из одной цветовой модели в другую используется команда:
convert -colorspace GRAY example.png out.png

identify -format "%r" example.png
DirectClass sRGB Matte


identify -format "%r" out.png
DirectClass Gray Matte


В качестве параметров -colorspace можно указывать аббревиатуру любой цветовой модели: GRAY, OHTA, RGB, Transparent, XYZ, YCbCr, YIQ, YPbPr, YUV или CMYK.

Изменение контрастности изображенияДля изменения контрастности используются опции -contrast и +contrast. Первая понижает контрастность, вторая повышает. Команда будет выглядеть следующим образом:
convert +contrast example.png example.png

Команду можно записывать и таким образом
convert example.png +contrast example.png

Обязательно надо указывать исходное и конечное изображение. В примере я указал одно и то же изображение example.png, поэтому исходное изображение просто перезаписалось с новыми параметрами.

Пакетная обработка изображений с разной ориентацией

Все хорошо, программа отлично справляется с пакетной обработкой изображений одной ориентации. Но что делать если в папке лежат файлы с разной ориентацией (портретной или альбомной)?

Вот тут и вступает в силу одно из преимуществ ImageMagick. Для решения этой задачи я написал скрипт на Python, который взаимодействует с ImageMagick.

Скачать скрипт и подробное руководство - https://github.com/DmitryBowie/magick_py

Несмотря на волшебное название, скрипт не творит чудеса. Скрипт лишь:
  • Получает имена всех изображений в папке
  • Передает эти имена программе identify
  • Получает обратно значение ширины и высоты изображения
  • Сравнивает эти значения
  • И если высота больше ширины, то скрипт просит convert пропорционально изменить высоту изображения. Если ширина больше высоты, то пропорционально изменяется ширина.
  • Все остальное описано в руководстве по скрипту.
Самое замечательное, что скрипт можно адаптировать под практически любые задачи, достаточно только поменять команды, передаваемые ImageMagick.

Заключение

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