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

ImageMagick: кадрирование(обрезка) изображений

Декабрь — тяжелая пора для всех студентов. Я не исключение. Сегодня срочно пришлось сканировать (точнее фотографировать) лекции и рассылать их однокурсникам. Изображений получилось много и некогда было тратить время на всякие программы вроде Scan Tailor и gscan2pdf (обе есть в репозиториях Ubuntu). Да и зачем, если под рукой есть ImageMagick и любимый скриптовый язык (в моем случае Python).

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

Таким образом, мне нужно было решить две задачи:
  1. массово уменьшить размеры фотографий
  2. массово кадрировать фотографии
С первой задачей справился мой скрипт из предыдущего поста. Со второй задачей я справился при помощи одной из команд ImageMagick. Об этом и пойдет речь дальше.

Кадрирование изображений с помощью ImageMagick

Кадрирование осуществляется простой командой:
convert -crop {size}{+-}x{+-}y input.png output.png

На деле это выглядит так:
convert -crop 500x640+60+80 input.png output.png

Чтобы понять что значит эта команда, необходимо обратиться к рисунку.
Допустим, весь лист это наше исходное изображение. Серый прямоугольник это полезная область, которая нам нужна, а все остальные поля можно обрезать. Пунктирная линия для наглядности. Серая область имеет размер 500x640 пикселей и отстоит от левого края на 60, от верхнего на 80 px.

Командой выше мы указываем область, которую надо оставить и смещение относительно верхнего левого угла изображения. Это аналогично программам с грфическим интерфейсом, там при кадрировании появляется прямоугольник, который выделяет полезную область. А в случае с ImageMagick этот прямоугольник мнимый.

Итак, применив команду "convert -crop 500x640+60+80 input.png output.png" к моему примеру я получил четко серый прямоугольник:

Массовое кадрирование изображений

Перед тем, как массово обрезать все фотографии с лекциями, мне пришлось потренироваться на одной из них, чтобы найти оптимальную область. А затем применил команду:
convert -crop 500x640+60+80 *.png output.png

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

В качестве выходящего файла я написал output.png, программа сама добавила всем обработанным файлам концовку в виде числа. Т.е. в итоге у меня в папке появились изображения output-0.png, output-1.png, ..., output-n.png.

После этого я загнал все изображения в один PDF файл. И тоже при помощи ImageMagick. Впрочем, это уже тема другого поста.

Массовое кадрирование изображений с разной ориентацией

Данное действие стало моим коронным номером. Если есть необходимость кадрировать изображения с разной ориентацией, то для них нужно подобрать свои пропорции оставляемой области.

За основу я взял свой скрипт py_magick, и изменил в нем всего две строчки. Не буду останавливаться на подробностях работы всего скрипта, они есть в руководстве к нему.

Изменить нужно 78 и 90 строки, вместо:
78 str = 'convert "%s" -resize %sx -quality 95 %s/"%s"' % (file, width, out, file)
и
90 str = 'convert "%s" -resize x%s -quality 95 %s/"%s"' % (file, height, out, file)
написать:
78 str = 'convert -crop 500x640+320+50 "%s" %s/"%s"' % (file, out, file)
90 str = 'convert -crop 640x500+320+50 "%s" %s/"%s"' % (file, out, file)


В 78 строке прописываются параметры для альбомно-ориентированных изображений, в 90 для портретно.

Об экономии времени

В завершении хочу обратить ваше внимание на один примечательный факт. На все эти действия у меня ушло не больше 5 минут. И все они были выполнены с помошью инструмента, который в большинстве дистрибутивов установлен по умолчанию.