Закруглённые углы при помощи ImageMagick

Просто и быстро

Постановка задачи: есть несколько тысяч картинок-миниатюр с прямыми углами. Необходимо преобразовать их таким образом, чтобы углы были закруглёнными.

Кто-то будет писать PHP-скрипт, кто-то — использовать PhotoShop, а для любителей командной строки и есть более простое решение.

Итак, пусть у нас имеется такое исходное изображение (размер изображения — 96×96, но для описываемого метода это не важно):

Исходное изображение

Для начала нам надо рассчитать параметры рамки:

[-]
View Code Bash
convert source.png -border 2 -format 'roundrectangle 1,1 %[fx:w-2],%[fx:h-2] %[fx:int((w+h)/15)],%[fx:int((w+h)/15)]' info: > rounded-corners.mvg

Высота и ширина берутся непосредственно из файла, а результаты вычислений сохраняются в файле формата Magick Vector Graphics и будут использоваться далее. Перед проведением вычислений к файлу добавляется двухпиксельная рамка. Таким образом, размер изображения с рамкой (концы которой будут закругляться) составит 100×100.

Теперь нам нужно сгенерировать оверлей и маску:

[-]
View Code Bash
convert source.png -border 2 -matte -channel RGBA -threshold -1 -background none -fill none -stroke black -strokewidth 3 -draw "@rounded-corners.mvg" overlay.png
convert source.png -border 2 -matte -channel RGBA -threshold -1 -background none -fill white -stroke black -strokewidth 1 -draw "@rounded_corner.mvg" mask.png

Оверлей представляет собой рамку с закругленными концами, которая будет накладываться на исходное изображение. Маска же используется для стирания лишних частей изображения. Ширина штриха маски меньше ширины штриха оверлея: хотя будет стёрто чуть большее по площади изображение, края изображения будут сглажены должным образом. Цвет рамки задаётся в параметре stroke.

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

Формируем окончательное изображение:

[-]
View Code Bash
convert source.png -matte -bordercolor none -border 2 mask.png -compose DstIn -composite overlay.png -compose Over -composite -depth 8 -quality 95 dest.png

Получим следующее изображение:
Изображение с рамкой

Над изображением можно извратиться и получить более красивую рамку:

[-]
View Code Bash
convert target.png -matte -virtual-pixel transparent -channel A -blur 0x8 -evaluate subtract 50% -evaluate multiply 2.001 soft-edge.png

Получим такое изображение:
Красивая рамка

Есть еще один способ закругления углов (в этом случае ни маска, ни оверлей не нужны):

[-]
View Code Bash
convert source.png -matte -virtual-pixel transparent -channel A -blur 0x8 -evaluate subtract 50% -evaluate multiply 2.001 soft-edge.png

Закруглённые углы

Как обработать коллекцию файлов? В Linux это просто: я приведу общий случай:

[-]
View Code Bash
find . -type f -name "*.png" -exec convert "{}" -matte -bordercolor none -border 2 /path/to/mask.png -compose DstIn -composite /path/to/overlay.png -compose Over -composite -depth 8 -quality 95 -matte -virtual-pixel transparent -channel A -blur 0x8 -evaluate subtract 50% -evaluate multiply 2.001 "{}" \;

PS — а еще можно и тень добавить:

[-]
View Code Bash
convert -page +4+4 soft-edge.png \( +clone -background gray -shadow 60x4+4+4 \) +swap -background none -mosaic -depth 8 -quality 95 shadowed.png

Вложения:

Автор: ; опубликовано в: ImageMagick; метки: ImageMagick, закруглённые углы, эффекты
12
Янв
2009

RSS Комментарии к статье «Закруглённые углы при помощи ImageMagick» (18)  »

  1. Паша

    Спасибо. Не мог понять в чём дело – оказывается в двойных процентах под Windows.

    А вот под Linux почему-то не сработало, после первой команды генерируется файл с таким содержимым
    roundrectangle 1,1 , ,

  2. Шлагбаум

    А где можно взять эту программку – очень занимательно получается

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Закруглённые углы при помощи ImageMagick»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा