Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Запуск сценария
Сценарий принимает два аргумента: имя файла с изображением и текст, который должен быть нанесен на него. Если текст содержит несколько слов, не забудьте заключить его в кавычки, как показано в листинге 14.4, чтобы сценарий правильно воспринял фразу целиком.
Листинг 14.4.Запуск сценария watermark
$ watermark test.png "(C) 2016 by Dave Taylor"
Created new watermarked image file test+wm.png.
Результаты
Результат показан на рис. 14.1.

Рис. 14.1.Изображение с нанесенными водяными знаками
Если вы столкнетесь с ошибкой unable to read font (невозможно прочитать шрифт), скорее всего, в вашей системе отсутствует пакет Ghostscript (в OS X он устанавливается по умолчанию). Чтобы устранить проблему, установите Ghostscript с помощью своего диспетчера пакетов. Например, в OS X это можно сделать следующей командой:
$ 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" в конце (но перед расширением, определяющим тип файла).
Например, для имени файла abandoned-train.png в переменную suffix будет записано расширение png, а в переменную prefix — имя abandoned-train. Обратите внимание на пропажу точки (.) — она возвращается на место во время сборки нового имени файла . После этого остается только вызвать программу convert со всеми параметрами
.
Запуск сценария
Укажите тип желаемой рамки — с помощью параметра −frame (для придания 3-мерного вида) или −border (простой бордюр) — и ее размеры, предпочтительный цвет для бордюра или лицевой поверхности рамки, а также имя исходного файла (или файлов). Например, как показано в листинге 14.6.
Листинг 14.6.Запуск сценария frameit
$ frameit −f 15%x15 %+10+10 −m black abandoned-train.png
Adding a frame to image abandoned-train.png, saving as abandoned-train+f.png
Результаты
Результат этого вызова показан на рис. 14.2.

Рис. 14.2.3-мерная рамка матового стекла в музейном стиле
Читать дальшеИнтервал:
Закладка: