Время от времени многие сталкиваются с тем, что нужно закруглить углы некоей картинки, а лучше не одной, а сразу множества.
Например, это бывает нужно, если у вас задача загрузить в интернет-магазин множество товаров с фотографиями, но, как ни прискорбно, товары сфотографированы на белом фоне, а фон сайта — цветной. Немного закруглив углы, можно чуть-чуть улучшить внешний вид магазина (в случае, если закругление углов с помощью 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, выглядящая вот так:
1) Закругление углов jpeg-картинки, с заполнением их белым цветом (будет создан файл rounded_picture.jpg:
round_corners.sh ./picture.jpg |
2) Закругление углов jpeg-картинки, с превращением её в png, углы становятся прозрачными:
round_corners.sh ./picture.jpg ./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 |
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" |
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-скриптах.
Оставить комментарий