Но не все потеряно. У вас есть два способа защитить свои изображения в сети. Первый — публиковать только изображения маленьких размеров. Загляните на сайты профессиональных фотографов и вы увидите, что мы имеем в виду. Обычно на них публикуются только миниатюры, потому что фотографы хотят зарабатывать на больших изображениях.
Второй способ — использование водяных знаков, хотя некоторые художники и отказываются добавлять любую идентификационную информацию непосредственно на фотографии. Тем не менее с помощью ImageMagick легко можно добавить водяные знаки, как показано в листинге 14.3, даже в большое количество файлов сразу.
Листинг 14.3.Сценарий watermark
··#!/bin/bash
··# watermark — добавляет указанный текст в виде водяных знаков в заданное
··#·· изображение, сохраняя результат в файле с именем image+wm.
··wmfile="/tmp/watermark.$$.png"
··fontsize="44"························# Должен быть начальным аргументом.
··trap "$(which rm) −f $wmfile" 0 1 15 # Не оставлять временный файл.
··if [$# −ne 2]; then
····echo "Usage: $(basename $0) imagefile \"watermark text\"" >&2
····exit 1
··fi
··if [! -r "$1"]; then
····echo "$(basename $0): Can't read input image $1" >&2
····exit 1
··fi
··# Для начала получить размеры изображения.
··dimensions="$(identify −format "%G" "$1")"
··# Создать временный слой для водяного знака.
··convert −size $dimensions xc: n −p— pointsize $fontsize −gravity south \
····-draw "fill black text 1,1 '$2' text 0,0 '$2' fill white text 2,2 '$2'" \
····$wmfile
··# Теперь объединить временный слой и исходный файл.
··suffix="$(echo $1 | rev | cut −d. -f1 | rev)"
··prefix="$(echo $1 | rev | cut −d. -f2- | rev)"
··newfilename="$prefix+wm.$suffix"
··composite −dissolve 75 % −gravity south $wmfile "$1" "$newfilename"
··echo "Created new watermarked image file $newfilename."
··exit 0
Вся запутанность кода здесь объясняется использованием ImageMagick. Да, этот пакет многое умеет, но даже полная документация, где описаны все тонкости, не упрощает работу с ним. Но трудности не должны вас пугать, потому что потрясающие возможности различных инструментов ImageMagick стоят того.
Первый шаг — получить размеры изображения
, чтобы создать точно таких же размеров слой с водяными знаками. В противном случае изображение будет испорчено!
Спецификатор "%G" возвращает ширину и высоту, которые затем передаются программе convert для создания нового холста. Строку с вызовом convert
мы скопировали из документации ImageMagick, потому что она действительно слишком хитрая, чтобы ее можно написать с нуля. (Чтобы узнать больше о языке параметров команды conv −d— draw, попробуйте воспользоваться поисковой системой. Или можете просто скопировать наш код!)
Имя нового файла должно состоять из имени исходного файла с дополнением "+wm", и именно это делают три строки в
. Команда rev переворачивает входную строку задом наперед, а следующая команда cut −d. -f1 просто возвращает расширение файла, поскольку мы не знаем, сколько точек присутствует в имени файла. Затем расширение снова переворачивается и добавляется после "+wm.".
В заключение вызывается утилита composite
, объединяющая элементы и создающая изображение с водяными знаками. Вы можете поэкспериментировать с разными значениями −dissolve, чтобы отрегулировать прозрачность дополнительного слоя.
Сценарий принимает два аргумента: имя файла с изображением и текст, который должен быть нанесен на него. Если текст содержит несколько слов, не забудьте заключить его в кавычки, как показано в листинге 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 это можно сделать следующей командой:
Читать дальше