Закругление углов изображений с помощью ImageMagick

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

Как сделать у множества изображений закруглённые углы, причём сделать это “пачкой”, с использованием консоли Linux и минимумом сторонних утилит?

Уже после написания этого поста я вспомнил, что, если речь идёт об использовании картинок на сайте, то углы у них можно закруглить при помощи css-свойства border-radius. Но теперь уже поздно 🙂

Установка

Для этого понадобится установленный пакет ImageMagick

# apt-get install imagemagick

и скрипт, под названием, скажем round_corners.sh с таким вот содержанием:

#!/bin/bash
THIS=`basename $0`
FILE=$1
 
if [ -z "$FILE" ];
then
	echo "Утилита для загругления углов картинки"
	echo
	echo "Если конечный файл имеет формат .png, и не указан цвет, то углы будут прозрачные"
	echo "Есле конечный файл не указан, то формат его будет взят из исходного файла"
	echo
	echo "Использование:"
	echo "$THIS input_filename [output_filename] [round_percent] [background_color]"
	echo "Параметры:"
	echo "  input_filename   - имя файла с картинкой, углы которой нужно закруглить"
	echo "  output_filename  - имя файла, куда будет записан результирующий файл"
	echo "                     если не указано, тогда будет rounded_{input_filename}"
	echo "  round_percent    - процент размера скругляемых углов, обычно равен 20"
	echo "  background_color - цвет фона для скругляемых углов. Обычно white, можно"
	echo "                     указывать цвета, которые принимает ImageMagich,"
	echo "                     такие как #fff, #ffffff, #ffffffff, rgb(255,255,255)"
	echo "                     Подробнее здесь http://www.imagemagick.org/www/color.html"
	exit
fi
 
FILENAME=`basename $1`
FILEPATH=`dirname $1`
 
DEST_FILE=$2
 
ROUND=$3
 
if [ -z "$ROUND" ];
then
	ROUND=20
fi;
 
BGCOLOR=$4
 
if [ -z "$BGCOLOR" ];
then
	BGCOLOR="white"
fi
 
echo "BGCOLOR:$BGCOLOR"
 
if [ -z "$DEST_FILE" ];
then
	DEST_FILE="rounded_$FILENAME"
fi
 
DESTPATH=`dirname $DEST_FILE`
 
if [ $DESTPATH != "" ];
then
	DEST_FILE=`basename $DEST_FILE`
else
	DESTPATH="$FILEPATH"
fi
 
DEST_EXT=`echo ${DEST_FILE##*.} | tr '[:upper:]' '[:lower:]'`
 
echo "Processing $FILE"
read -a INFO  <<<  `identify -format "%[w] %[h] %[fx:w*$ROUND/200] %[fx:h*$ROUND/200]" $1`
W=${INFO[0]}
H=${INFO[1]}
CW=${INFO[2]}
CH=${INFO[3]}
 
if [ $CW -gt $CH ];
then
	CW=$CH
else
	CH=$CW
fi;
 
echo "SRC_PATH:$FILEPATH"
echo "DEST_PATH:$DESTPATH"
echo "SRC_FILE:$FILENAME"
echo "DEST_FILE:$DEST_FILE"
 
echo "Size:${W}x${H}"
echo "Creating mask..."
convert -size ${W}x${H} xc:none -draw "roundrectangle 0,0,$W,$H,$CW,$CH" ./mask.png
echo "Applying mask..."
convert $1 -matte ./mask.png  -compose DstIn -composite $DESTPATH/$DEST_FILE.png
if [ $DEST_EXT != "png" ];
then
	echo "Removing transparency..."
	convert $DESTPATH/$DEST_FILE.png -background $BGCOLOR -alpha remove -alpha off $DESTPATH/$DEST_FILE
	echo "Removing temporary file..."
	rm $DESTPATH/$DEST_FILE.png
else
	echo "Moving temporary file..."
	mv $DESTPATH/$DEST_FILE.png $DESTPATH/$DEST_FILE
fi
echo "Removing mask..."
rm ./mask.png
echo "Created file: $FILEPATH/$DEST_FILE"

Поместим ссылку на скрипт в /usr/local/bin (запуск от root-а):

# ln -s `realpath ./round_corners.sh` /usr/local/bin/round_corners.sh

Теперь, скриптом можно пользоваться из любой точки файловой системы.

Примеры:

Допустим, у нас есть картинка picture.jpg, выглядящая вот так:

picture.jpg

1) Закругление углов jpeg-картинки, с заполнением их белым цветом (будет создан файл rounded_picture.jpg:

round_corners.sh ./picture.jpg

rounded_picture

2) Закругление углов jpeg-картинки, с превращением её в png, углы становятся прозрачными:

round_corners.sh ./picture.jpg ./picture.png

picture.png

3) Закругление углов jpeg-картинки, с превращением её в png, с разными радиусами закругления (в процентах)

round_corners.sh ./picture.jpg ./picture5.png 5
round_corners.sh ./picture.jpg ./picture10.png 10
round_corners.sh ./picture.jpg ./picture40.png 40
round_corners.sh ./picture.jpg ./picture100.png 100

picture5picture10picture40picture100

4) Закругление углов jpeg-картинки, с заполнением цвета углов не белым, а разными цветами:
(для ввода цвета в формате CSS пришлось взять егов кавычки, чтобы “#” не считалась комментарием)

round_corners.sh ./picture.jpg ./picture-red.jpg 20 red
round_corners.sh ./picture.jpg ./picture-black.jpg 20 black
round_corners.sh ./picture.jpg ./picture-green.jpg 20 green
round_corners.sh ./picture.jpg ./picture-green.jpg 20 "#ff4a12"

picture-blackpicture-greenpicture-red

5) Ну и, самое главное, закругление множества картинок:

for i in ./*.jpg; do round_picture.sh $i ./rounded-$i.png ; done

или:

find ~/ -type f -name *.jpg -name *.jpeg -exec round_picture.sh {} \;

Здесь всё как обычно и делается в bash-скриптах.


So, what do you think ?