Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Простое нанесение водяных знаков на изображения с помощью утилит из пакета ImageMagick

Оригинал: Easy Watermarking with ImageMagick
Автор: Dave Taylor
Дата публикации: 29 октября 2014 г.
Перевод: А.Панин
Дата перевода: 6 сентября 2015 г.

Нанесение водяных знаков на изображения с помощью утилит из пакета ImageMagick

Давайте начнем с выполнения небольшой домашней работы. Используйте поисковую систему Google (или Bing) для поиска информации по запросу "конфиденциальности не существует, смиритесь с этим". Впервые я услышал это утверждение от Bill Joy, одного из основателей компании Sun Microsystems, причем аналогичные мысли были высказаны и множеством других технических специалистов, из чего можно сделать вывод о том, что данное утверждение в какой-то мере соответствует действительности. Размещение какого-либо материала в сети приведет к его бесконтрольному распространению несмотря на все ваше желание контролировать этот процесс.

Не верите в это? Спросите у музыкантов, авторов книг или режиссеров фильмов. На сегодняшний день люди, которые скачивают 350-страничные файлы формата PDF вместо покупки печатного издания книги за 14 долларов могут существенно снизить продажи, но это уже другой вопрос, в ходе рассмотрения которого можно сделать вывод о том, что Интернет является публичной и открытой сетью, позволяющей людям осуществлять доступ даже к тем ресурсам, к которым нам не хотелось бы его предоставлять.

Это означает, что в том случае, если вы являетесь фотографом или загружаете изображения, которые хотелось бы защитить от бесконтрольного распространения, вам рано или поздно придется решить непростую задачу. Да, вы можете добавить на ваши веб-страницы специальный код, который не позволит веб-браузеру обрабатывать событие нажатия правой кнопки мыши, делая невозможным сохранение изображений, но в любом случае вам не удастся полностью предотвратить кражу интеллектуальной собственности в сети.

По этой причине многие профессиональные фотографы размещают в сети миниатюры фотографий с уменьшенным разрешением вместо оригиналов. Даже свадебные фотографы, получающие вознаграждения за продажу отпечатанных фотографий (а не за саму съемку свадьбы) уделяют особое внимание данному вопросу!

По аналогии с тем, как люди благодаря хостингу YouTube привыкли к просмотру в сети документального или забавного видео низкого качества, они также привыкли к бесплатному просмотру изображений низкого разрешения вместо даже символической оплаты лицензионных отчислений для получения прав на использование фотографий или рисунков высокого разрешения.

Однако, существует и другой способ защиты изображений, демонстрируемый сетевыми компаниями, занимающимися продажами фотографий: нанесение водяных знаков.

Вы наверняка видели фотографии с информацией об авторских правах, адресами веб-сайтов и другими надписями, которые не искажают изображения, но затрудняют их использование где-либо, кроме официального источника.

Оказывается, наш любимый пакет утилит ImageMagick является потрясающим инструментом для создания этих водяных знаков различными способами, о чем мы и поговорим в данной статье. Данный материал будет интересен большинству авторов изображений, ведь я знаю о том, что даже постоянно загружаемые мною в сеть фотографии загружаются с моего сайта и используются на других сайтах без разрешения с моей стороны и указания источника.

Базовый принцип нанесения водяного знака на изображение заключается в создании изображения водяного знака и наложении этого изображения на оригинальное изображение, в результате чего будет создано новое изображение с водяным знаком. К счастью, создание нового изображения может осуществляться программно с помощью утилиты convert из состава пакета ImageMagick.

Рассказав о достаточно сложном для понимания процессе, я хотел бы начать с достаточно прямолинейного, но быстрого способа добавления водяного знака на изображение с использованием функции label:. По сути, в данном случае вам придется указать желаемые текст, его позицию на оригинальном изображении, имя файла оригинального изображения и имя файла результирующего изображения. Давайте начнем работу со следующим оригинальным изображением (представленным на Рисунке 1).

Оригинальное изображение, дети на празднике

Рисунок 1. Оригинальное изображение, дети на празднике

Конечно же, вы можете получить информацию о размерах и других параметрах изображения с помощью утилиты identify:

$ identify kids-party.png
kids-party.png PNG 493x360 493x360+0+0 8-bit 
  DirectClass 467KB 0.000u 0:00.000

При этом вы можете проигнорировать практически всю выведенную информацию; вас должен интересовать лишь размер изображения, равный в данном случае 493x360 пикселей.

Теперь давайте используем утилиту composite для добавления простой надписи на изображение:

$ composite label:'AskDaveTaylor.com' kids-party.png \
  kids-party-labelled.png

На Рисунке 2 показано изображение с нанесенной надписью.

На изображение добавлена надпись без стилизации

Рисунок 2. На изображение добавлена надпись без стилизации

Это довольно скучный, но эффективный и простотой способ нанесения водяного знака. Давайте перейдем к более интересному способу нанесения водяного знака с центровкой текста снизу изображения и увеличением высоты изображения на высоту надписи:

$ convert kids-party.png -background Khaki \
 label:'AskDaveTaylor.com' \
 -gravity center -append party-khaki.png

В данном случае я добавил параметр для указания цвета фона надписи (цвет хаки - khaki) и использовал сложный, но чертовски полезный параметр выравнивания gravity для центровки текста в рамках новой (добавленной с помощью параметра append) области изображения. Результирующее изображение показано на Рисунке 3.

Надпись на фоне цвета хаки

Рисунок 3. Надпись на фоне цвета хаки

Я еще не закончил перечисление способов нанесения водяного знака на изображение. В следующем примере я предлагаю разместить текст надписи на поверхности изображения на полупрозрачном фоне.

Это более сложный метод использования утилит из пакета ImageMagick, включающий несколько шагов, на первом из которых необходимо определить ширину оригинального изображения. Это делается с помощью следующей команды:

width=$(identify -format %w kids-party.png)

Выполните данную команду и вы получите интересующее значение:

$ echo $width
493

Теперь давайте снова перейдем к использованию утилиты convert, но в этот раз укажем значения цвета фона надписи, цвета надписи и используем некоторые другие параметры для корректного вывода прозрачного фона надписи:

$ convert -background '#0008' -fill white -gravity center \
  -size ${width}x30 caption:AskDaveTaylor.com \
  kids-party.png +swap -gravity south -composite \
  party-watermark.png

Я предупреждал, что этот способ будет достаточно сложным, не так ли? Давайте посмотрим на результирующее изображение для того, чтобы разобраться в произошедшем (Рисунок 4).

Улучшенная надпись с полупрозрачным фоном

Рисунок 4. Улучшенная надпись с полупрозрачным фоном

Вы можете самостоятельно поэкспериментировать с различными цветами надписей и фонов, но сейчас давайте продолжим работу с данной командой и перейдем к выполнению второй части задачи, а именно, к преобразованию данной команды в полноценный сценарий, который позволяет осуществить обработку множества изображений из директории. Базовая структура данного сценария будет выглядеть достаточно просто:

Для каждого файла изображения
	рассчитывается ширина
	создается новая версия с водяным знаком
	оригинальное изображение перемещается в скрытую директорию
	имя файла изображения с водяным знаком меняется на имя оригинального изображения
окончание обработки изображений

Так как Linux поддерживает механизм сокрытия файлов, имена которых начинаются с символа точки, давайте добавим в сценарий код для создания директории ".originals" в текущей директории для того, чтобы в процессе нанесении водяных знаков не уничтожались оригинальные изображения. Ниже приведен код сценария:

savedir=".originals"
mkdir $savedir

if [ $? -ne 0 ] ; then
  echo "Ошибка: не удалось создать $savedir."
  exit 1
fi

for image in *png *jpg *gif
do
 if [ -s $image ] ; then   # ненулевой размер файла
    width=$(identify -format %w $image)
    convert -background '#0008' -fill white -gravity center \
       -size ${width}x30 caption:AskDaveTaylor.com \
       $image +swap -gravity south -composite new-$image
     mv $image $savedir
     mv new-$image $image
    echo "На изображение $image успешно нанесен водяной знак"
  fi
done

Как вы можете видеть, данная команда отлично интегрируется в сценарий, позволяющий обрабатывать оригинальные изображения с их последующим сохранением в директории .originals.

После запуска сценария в директории с изображениями я получил краткий вывод:

На изображение figure-01.png успешно нанесен водяной знак
На изображение figure-02.png успешно нанесен водяной знак
На изображение figure-03.png успешно нанесен водяной знак
На изображение figure-04.png успешно нанесен водяной знак

Это было достаточно просто.

Разумеется, вы можете продолжить исследование возможностей нанесения водяных знаков на изображения средствами утилит из состава пакета ImageMagick, но лично я предпочитаю остановиться на руководствах, которые уже опубликованы в сети, включая данное полезное, хотя и непростое руководство: http://www.imagemagick.org/Usage/annotating.

Как бы вы не относились к вопросам интеллектуальной собственности, но в том случае, если изображения, которые вы планируете размещать в сети, будут иметь большие разрешения или будут являться уникальной, защищенной авторским правом интеллектуальной собственностью, навыки нанесения на них водяных знаков с использованием интерфейса командной строки окажутся чертовски полезными.