ImageMagic

Вот уже много лет я пишу статьи на свои блоги. Очень часто с большим количеством картинок и каждую картинку обычно надо:

  • Ужать под размер страницы
  • Налепить водяной знак
  • Ну и накатать рамочку в 1 пиксель вокруг, чтобы аккуратней смотрелось

Всегда я делал это ручками. В своей любимой смотрелке FastStone Viewer. Благо там хватало инструментов. Но все равно это приходилось делать нудно и долго. Это демотивировало и бесило. И да, я уже много лет знал про существование такого пакета как ImageMagic. Это набор консольных утилит для работы с графикой. Мощный, кроссплатформенный, вроде бы даже опенсорцный. Но мне все лень было сесть и разобраться в нем. Поэтому я выдрачивал все картинки вручную. Каждый раз. Нет, все же прав был ворон — лучше день потерять потом за пять минут долететь. И вот я взялся и разобрался. Все просто и незатейливо оказалось. И чего я столько лет мудохался вручную? Ща запускаешь батник и опа — вся пачка картинок обработана и разложена по стадиям.

▌ImageMagic
Как он выглядит? Это большая куча консольных утилит (convert, composite и куча других), к которым обращаешься через консоль с указанием параметров. Вся установка заключается в том, чтобы прописать в переменную PATH виндового окружения путь к этим утилиткам. Ну или пути абсолютные указывать (но это неудобно). В принцие, после инсталляции ImageMagic все встанет само. А чтобы проверить, что оно работает правильно запустите командную строку cmd (пуск — cmd) наберите там convert. Должна выпасть вот такая стена текста с подсказкой по ключам:

Если работает, то можно приступать к написанию скриптов. Писать будем на cmd они же bat файлы в прошлом.
Итак, вот что у меня получилось:

MKDIR R
MKDIR R\WR
MKDIR R\WR\BWR
MKDIR BIGBW


FOR %%a IN (*.jpg *.png) DO (convert -size 300x300 xc:none -fill #80808080 -gravity NorthWest -draw "text 10,10 'easyelectronics.ru'" -gravity East -draw "text 5,15 'easyelectronics.ru'"  miff:- | composite -tile miff:- "%%a"  miff:- | convert -border 1x1 -bordercolor "#000000" miff:- "BIGBW/bw%%a")

FOR %%a IN (*.jpg *.png) DO (convert -resize 750^> "%%a" "R/r%%a")

CD R
FOR %%a IN (*.jpg *.png) DO (convert -size 300x300 xc:none -fill #80808080 -gravity NorthWest -draw "text 10,10 'easyelectronics.ru'" -gravity East -draw "text 5,15 'easyelectronics.ru'"  miff:- | composite -tile miff:- "%%a"  "WR/w%%a")

CD WR
FOR %%a IN (*.jpg *.png) DO (convert -border 1x1 -bordercolor "#000000"   "%%a" "BWR/b%%a")

MOVE .\BWR ..\..\BWR
CD..
MOVE .\WR ..\WR

Ну и подробней про каждый пункт, вдруг кто не знает.

MKDIR R
MKDIR R\WR
MKDIR R\WR\BWR
MKDIR BIGBW

Это я создаю структуру служебных подкаталогов. MKDIR это команда создания каталога, а дальше имя и путь если надо. R — для ужатых до размера картинок. WR — для ужатых и с налепленным водяным знаком, BWR для ужатых с водяным знаком и с рамкой вокруг.
BIGBW — для оригиналов без сжатия, но с водяным знаком и рамочкой.

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

Конструкция вида:

FOR %%a IN (*.jpg *.png) DO (бла бла бла %%a bw%%a")

Это цикл который из набора IN (в данном случае это все *.JPG и *.PNG файлы) последовательно берет файлы и помещает их имена в переменную %%а. А то что в скобочках после DO это то, что с этим всем сделать. Там стоят операции из ImageMagic, о них ниже. Т.е. везде тут этот цикл хватает по очереди из каталога где лежит скрипт все картинки и скармливает их конвертеру. Получая на выходе файлы bw%%a т.е. был например 01.jpg, а на выходе будет bw01.jpg Где bw у меня означают проделанные операции: B — border W — watermark.

Вот операция, что прячется в DO

convert -size 300x300 xc:none -fill #80808080 -gravity NorthWest -draw "text 10,10 'easyelectronics.ru'" -gravity East -draw "text 5,15 'easyelectronics.ru'"  miff:- | composite -tile miff:- "%%a"  miff:- | convert -border 1x1 -bordercolor "#000000" miff:- "BIGBW/bw%%a"

Cостоит она из трех частей объединенных в конвеер:

генерация водяного знака -> склейка с исходным изображением -> наложение рамки. Рассмотрим их последовательно.

Генерация водяного знака:

convert -size 300x300 xc:none -fill #80808080 -gravity NorthWest -draw "text 10,10 'easyelectronics.ru'" -gravity East -draw "text 5,15 'easyelectronics.ru'"  miff:- 

Формат у convert следующий:

convert [параметры] [входные данные ] [ выходные данные] 

в данном случае входными данными служит не файл, а генерируемая на лету картинка размером 300 на 300, пустая. Почему 300 на 300? А потому, что у меня картинки в среднем по 750 пикселей и в нее войдет 4 таких картинки. Что даст сетку из ватермарков. С заливкой цвета #80808080 (серый полупрозрачный) и в точках -gravity NorthWest и -gravity East рисуем текстовую надпись сдвинутую относительно точки гравитации на 10,10 и 5,15 пикселей «text 10,10 ‘easyelectronics.ru'». NordWest это левый верхний угол, а East это центр справа у получившегося квадрата. Т.е. выглядеть оно будет как то так:

А в качестве выходных данных указан: miff:-

Так зовется внутренний формат ImageMagic предназначенный для конвеерной обработки. Т.е. выход пишем как miff:-, а у следующей команды вход как miff:- . Следующая команда идет после символа |

composite -tile miff:- "%%a"  miff:-

У композита такой формат:

composite [параметры] [входной файл 1] [ входной файл2] [выходной файл] 

Параметр тут один -tile т.е. входным файлом надо замостить выходной. Входной файл тут с прошлой операции miff:- (тот самый квадрат с двумя надписями) второй входной файл это наша исходная картинка, которая берется из цикла FOR через переменную %aa, ну а выход опять miff:-

Следующий кусочек делает бордюр вокруг картинки. На входе у него miff:- из прошлой операции, а на выходе уже конечный файл который он поместит в папку BIGBW приписав к файлам префикс bw

convert -border 1x1 -bordercolor "#000000" miff:- "BIGBW/bw%%a"

Параметр -border говорит, что к входному файлу надо пририсовать рамку размером 1 пиксель сверху/снизу и 1 пиксель слева/справа. Ну и -bordercolor указывает на цвет «#000000» — т.е. черный.

Получается вот как то так:

Таким образом мы получили закопирайченные файлы с рамочкой. Осталось сделать еще их уменьшенные версии. Для этого идут следующие команды:

FOR %%a IN (*.jpg *.png) DO (convert -resize 750^> "%%a" "R/r%%a")

Будет хватать в цикле все картинки jpg и png формата и если они больше 750 пикселей по ширине (на это намекает знак > , а ^ это лишь указание командной строке на то, чтобы он следующий символ не считал служебным. В юниксе там вместо крыжика будет слеш) то он его ужмет до 750 пикселей. И положит в папку R приписав к имени букву r перед именем файла.

CD R 

Перейдетм в каталог R

FOR %%a IN (*.jpg *.png) DO (convert -size 300x300 xc:none -fill #80808080 -gravity NorthWest -draw "text 10,10 'easyelectronics.ru'" -gravity East -draw "text 5,15 'easyelectronics.ru'"  miff:- | composite -tile miff:- "%%a"  "WR/w%%a")

И там в цикле тем же макаром, что и в прошлый раз нахреначим ватермарки на все картинки, положив их в папку WR и приписав к ним префикс w

Аналогично сделаем рамочку:

CD WR
FOR %%a IN (*.jpg *.png) DO (convert -border 1x1 -bordercolor "#000000"   "%%a" "BWR/b%%a")

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

MOVE .\BWR ..\..\BWR
CD..
MOVE .\WR ..\WR

И все. После запуска этого скрипта у нас образуется рядом с картинками четыре папки:

  • R — уменьшенные
  • WR — уменьшенные с ватермарками
  • BWR — с рамкой, ватермарками, уменьшенные
  • BIGBW — исходные с ватермарками и рамкой

Ну или, вот вам общий скрипт которые сразу сделает уменьшение, рамку и водяной знак, положив все в папку READY

MKDIR READY
FOR %%a IN (*.jpg *.png) DO (convert -size 300x300 xc:none -fill #80808080 -gravity NorthWest -draw "text 10,10 'easyelectronics.ru'" -gravity East -draw "text 5,15 'easyelectronics.ru'"  miff:- | composite -tile miff:- "%%a"  miff:- | convert -resize 750^> miff:- miff:- | convert -border 1x1 -bordercolor "#000000" miff:- "READY/%%a")

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

Запись опубликована в рубрике Компьютерное. Добавьте в закладки постоянную ссылку.

Добавить комментарий