$ brew install ghostscript
Усовершенствование сценария
Размер шрифта, используемого для нанесения водяных знаков, должен быть функцией от размеров изображения. Если изображение имеет ширину 280 пикселей, шрифт размером в 44 пункта окажется слишком большим, но, если изображение имеет ширину 3800 пикселей, тот же шрифт окажется слишком мелким. Можно также позволить пользователю самому выбирать подходящий размер шрифта или местоположение текста, добавив в сценарий поддержку соответствующих параметров.
ImageMagick в состоянии определять шрифты, присутствующие в вашей системе, поэтому вполне можно разрешить пользователю указывать шрифт по его названию.
№ 96. Добавление рамок вокруг изображений
Часто бывает желательно добавить вокруг изображения бордюр или причудливую рамку. Пакет ImageMagick предоставляет массу возможностей для этого через утилиту convert. Проблема, как и с остальными утилитами из пакета, в том, что документация к ImageMagick недостаточно ясно описывает, как пользоваться этим инструментом.
Например, ниже приводится выдержка из документации с описанием параметра −frame:
Часть аргумента geometry с размерами определяет дополнительные ширину и высоту, которые будут добавлены к размерам изображения. Если смещения в аргументе geometry не заданы, тогда добавляется бордюр со сплошной заливкой. Смещения x и y , если они заданы, определяют ширину и высоту бордюра, которые отводятся для формирования фаски, внешней ( x пикселей) и внутренней ( y пикселей).
Получили?
Возможно, вам станет понятнее после разбора практического примера. Именно эту цель преследует функция usage() в сценарии, представленном в листинге 14.5.
Листинг 14.5.Сценарий frameit
··#!/bin/bash
··# frameit — упрощает добавление графической рамки вокруг
··#·· изображения, используя ImageMagick.
··usage()
··{
··cat << EOF
··Usage: $(basename $0) −b border −c color imagename
····or $(basename $0) −f frame −m color imagename
··In the first case, specify border parameters as size x size or
··percentage x percentage followed by the color desired for the
··border (RGB or color name).
··In the second instance, specify the frame size and offset,
··followed by the matte color [8] В первом случае определяются параметры бордюра, как пиксели×пиксели или проценты×проценты, за которыми следует желаемый цвет бордюра (в формате RGB или в виде названия цвета). Во втором случае определяются размеры рамки и ее фасок, за которым следует цвет рамки.
.
··
··EXAMPLE USAGE:
····$(basename $0) −b 15x15 −c black imagename
····$(basename $0) −b 10%x10 % −c gray imagename
····$(basename $0) −f 10x10+10+0 imagename
····$(basename $0) −f 6x6+2+2 −m tomato imagename
··EOF
··exit 1
··}
··#### ГЛАВНЫЙ БЛОК КОДА
··# Большая его часть занимается парсингом начальных аргументов!
··while getopts "b: c: f: m: " opt; do
····case $opt in
······b) border="$OPTARG";······;;
······c) bordercolor="$OPTARG";;;
······f) frame="$OPTARG";······;;
······m) mattecolor="$OPTARG";··;;
······?) usage;················;;
····esac
··done
··shift $(($OPTIND — 1)) # Употребить все проанализированные аргументы.
··if [$# −eq 0]; then # Изображения не указаны?
····usage
··fi
··# Что требуется добавить? Бордюр или рамку?
··if [! -z "$bordercolor" −a! −z "$mattecolor"]; then
····echo "$0: You can't specify a color and matte color simultaneously." >&2
····exit 1
··fi
··if [! -z “$frame” −a! −z “$border”]; then
····echo “$0: You can’t specify a border and frame simultaneously.” >&2
····exit 1
··fi
··if [! -z “$border”]; then
····args=”-bordercolor $bordercolor −border $border”
··else
····args=”-mattecolor $mattecolor −frame $frame”
··fi
··for name
··do
····suffix="$(echo $name | rev | cut −d. -f1 | rev)"
····prefix="$(echo $name | rev | cut −d. -f2- | rev)"
····newname="$prefix+f.$suffix"
····echo "Adding a frame to image $name, saving as $newname"
····convert $name $args $newname
··done
··exit 0
Если не считать использования команды getopts для анализа сложных параметров, которую мы уже исследовали, этот сценарий действует достаточно прямолинейно. Основная работа в нем выполняется в нескольких последних строках. В цикле for
создается имя нового файла, включающее "+f" в конце (но перед расширением, определяющим тип файла).
Читать дальше