··Class: DirectClass
··Geometry: 1172x158+0+0
··Resolution: 72x72
··Print size: 16.2778x2.19444
··Units: Undefined
-опущено-
··Profiles:
····Profile-icc: 3144 bytes
······IEC 61966-2.1 Default RGB colour space −sRGB
··Artifacts:
····verbose: true
··Tainted: False
··Filesize: 80.9KBB
··Number pixels: 185KB
··Pixels per second: 18.52MB
··User time: 0.000u
··Elapsed time: 0:01.009
··Version: ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
$
Это очень большой объем данных. Намного больше, чем можно было представить. Но без флага −verbose вывод выглядит весьма туманным:
$ identify testimage.png
testimage.png PNG 1172x158 1172x158+0+0 8-bit DirectClass 80.9KB 0.000u
0:00.000
Нам хотелось бы получить что-то среднее, и в такой ситуации может пригодиться строка формата. Давайте рассмотрим внимательнее листинг 14.1, сфокусировав все внимание на единственной значимой строке .
Строка формата −format поддерживает почти 30 спецификаторов, позволяющих извлекать конкретные данные из одного или нескольких файлов изображений в строго определенном формате. В данном сценарии мы выбрали %f, чтобы получить имя файла, %G — чтобы получить ширину и высоту, и %k — чтобы получить максимальное количество цветов, используемых в изображении.
Более подробную информацию о спецификаторах строки формата −format можно найти по адресу: http://www.imagemagick.org/script/escape.php.
Запуск сценария
Всю работу выполняет ImageMagick, поэтому данный сценарий в основном лишь кодирует желаемый формат вывода. Информация извлекается из изображений легко и просто, как показывает листинг 14.2.
Результаты
Листинг 14.2. Запуск сценария imagesize
$ imagesize * | head -4
100_0399.png: 1024x768 with 120719 colors.
8t grade art1.jpeg: 480x554 with 11548 colors.
dticon.gif: 143x163 with 80 colors.
Angel.jpg: 532x404 with 80045 colors.
$
Усовершенствование сценария
В настоящий момент мы видим размеры изображений в пикселях и количество используемых цветов, но также было бы полезно знать размеры файлов. Однако любую дополнительную информацию сложно читать, если не предусмотреть ее форматирование.
№ 95. Добавление водяных знаков в изображения
Если вы надеетесь сохранить в неприкосновенности свои изображения и другой контент, публикуемый в сети, вы неизбежно будете разочарованы. Все, что опубликовано в сети, доступно любому для копирования, даже если вы защитили доступ к своим материалам паролем, включили предупреждение об авторских правах или даже добавили на сайт код, не позволяющий сохранять изображения. Даже чтобы показать изображение на экране, необходимо, чтобы оно оказалось в памяти, а эту память можно скопировать с помощью инструментов захвата экрана.
Но не все потеряно. У вас есть два способа защитить свои изображения в сети. Первый — публиковать только изображения маленьких размеров. Загляните на сайты профессиональных фотографов и вы увидите, что мы имеем в виду. Обычно на них публикуются только миниатюры, потому что фотографы хотят зарабатывать на больших изображениях.
Второй способ — использование водяных знаков, хотя некоторые художники и отказываются добавлять любую идентификационную информацию непосредственно на фотографии. Тем не менее с помощью 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 \