Очень часто у многих появляется задача массового изменения фотографий или других изображений. К примеру вы только что сделали пару сотен фотографий и хотите скинуть их на файлообменный сервис, но они занимают слишком много места. Можно уменьшить их разрешение что‐бы они стали меньше, но уменьшать каждую картинку по одному очень долго. Тут на помощь придут возможности shell и утилита convert из пакета ImageMagick (или GraphicsMagick).
Code
$ convert -resize 640x480 Image.jpg mini_image.jpg
Для массового изменения изображений можно воспользоваться возможностями командной оболочки. К примеру цикл for в bash.
Code
$ for name in `ls *.jpg` do ; convert -resize 640x480 $name mini/$name
Или в tcsh с помощью foreach.
Code
% foreach name ( `ls *.jpg` )
convert -resize 640x480 $name mini/$name
end
Или можно с помощью xargs.
Code
$ ls *.jpg | xargs -I'{}' convert -resize 640x480 {} newmini/{}
Или разделённые нулевым символом.
Code
$ find ./ -maxdepth 1 -iname '*.jpg' -printf '%f\0' | xargs --null -I'{}' convert -resize 640x480 {} newmini/{}
Есть ещё десяток способов а то и больше как работать с множеством файлов, но эта статья не об этом. По этому дальше примеры будут показываться на одном файле за исключением некоторых случаев.
В качестве аргументов параметру -resize можно давать также проценты.
Code
$ convert -resize 50% Image.jpg mini_image.jpg
Также можно добавить параметр -quality который задаёт уровень сжатия.
Code
$ convert -resize 640x480 -quality 30 Image.jpg mini_image2.jpg
$ du -ch mini_image*
24K mini_image2.jpg
80K mini_image.jpg
104K итого
Также часто возникает задача перевернуть изображение. Это можно сделать с помощью -rotate, которой параметры задаются в градусах.
Code
$ convert -rotate 90 Image.jpg rotate_image.jpg
Градус может быть любым, но если он не делиться на 90 нацело, то пустые места будут заполнены белым цветом. При желании цвет можно поменять с помощью опции -background.
К примеру, возьмём вот такое изображение:
Пример для convert -rotate
Перевернём его на 120 градусов.
Code
$ convert -rotate 120 ex_or.jpg ex1.jpg
В результате получим такое:
Изображение повёрнутое на 120 градусов
Как видим оно дополнилось белым цветом, а разрешение стало больше (тут не заметно так как для норм вёрстки изображения обрезаны по одному размеру, для просмотра оригинального изображения нажмите на него).
Теперь приведём пример с использованием опции -background.
Code
$ convert -rotate 120 -background blue ex_or.jpg ex2.jpg
Получим такое:
Изображение повёрнутое на 120 градусов
Цвет можно задать несколькими способами. К примеру красный:
Code
-background red
-background "#FF0000"
-background "rgb(255,0,0)"
Короткое имя цвета можно посмотреть с помощью такой команды:
Code
$ convert -list color
Утилита convert может делать несколько действий сразу. К примеру можно изменить размер изображения и перевернуть его одновременно. Очередность указания опций также имеет значение. Первым исполняются те действия которые были указанны первыми. Так команда:
Code
$ convert -resize 640x480 -rotate 120 image.jpg new_image.jpg
и команда
Code
$ convert -rotate 120 -resize 640x480 image.jpg new_image2.jpg
приведут к разным результатам. В первой команде мы сначала изменяем размер и потом переворачиваем изображение, во второй сначала переворачиваем, а потом меняем размер того что получили.
Часто приходится обрезать края изображения. Утилитой convert это можно сделать с помощью опции -chop, -shave.
Опция -shave удаляет одинаковые поля с обеих сторон.
Code
$ convert -shave 200x image.jpg image2.jpg
Этот пример удалит 200 пикселей с левой и правой стороны.
Code
$ convert -shave 200x300 image.jpg image2.jpg
А эта команда удалит 200 писелей с права и лева, и 300 пикселей с верху и снизу.
Обе эти опции опции, а также -resize, принимают в качестве аргумента geometry. Этот аргумент может быть задан разными способами, выше демонстрировалось только два — в процентах и параметры ширины и высоты.
scale% — Высота и ширина заданная в процентах.
scale-x%xscale-y% — Процент заданный для высоты и ширины отдельно. (Достаточно одно символа % .)
width — Задана только ширина, высоты выставляется автоматически с таким‐же соотношении как было.
xheight — Задана высота, ширина автоматически выставляется по соотношению сторон.
widthxheight — Максимальное значение ширины и высоты, соотношение сторон остаётся таким‐же.
widthxheight^ — Минимальное значение ширины и высоты, соотношение сторон остаётся таким‐же.
widthxheight! — Задаётся значение ширины и высоты, соотношение сторон игнорируется.
widthxheight> — Работает также как widthxheight но только если изображение больше указанного размера.
widthxheight< — Изменить разрешение только если оба размера изображения превышают то которое заданно.
area@ — Изменить размер изображения что-бы оно имело такое количество пикселей.
Опция -shop удаляет слева и сверху.
Code
$ convert -chop 200x100 image.jpg image2.jpg
Указанная команда удалит 200 пикселей с лева и 100 сверху. Место откуда вырезаются пиксели можно поменять с помощью опции -gravity. Просмотреть все варианты можно с помощью команды:
Code
$ convert -list gravity
По умолчанию она установлена в NorthWest. Для того что‐бы операция chop удаляла пиксели с права и сверху опцию -gravity необходимо поставить в SouthEast. Например:
Code
$ convert -gravity SouthEast -chop 200x200 image.jpg image3.jpg
Если надо обрезать поля со всех сторон, можно применить операцию chop дважды с разным gravity.
Code
$ convert -gravity NorthWest -chop 100x150 -gravity SouthEast -chop 200x200 image.jpg image4.jpg
Эта команда удалит 100 пикселей с лева, 150 сверху, 200 с права и 200 снизу.
Есть другой вариант обрезать края со всех сторон, но он не такой эффективный.
Code
$ convert -chop 100x150 -rotate 180 -chop 200x200 -rotate 180 image.jpg image5.jpg
Результат получается такой‐же но утилита convert делает лишние действия по обращению изображения.
Также можно удалять пиксели из центра но как правило это не имеет смысла.
Опция -splice наоборот, добавляет новые пиксели цвета который указан с помощью -background, а если он не указан используется белый. Новые пиксели по умолчанию добавляются слева и сверху, но это можно изменить с помощью опции -gravity аналогично как и с chop.