Так как утилиты предназначены для работы в командной строке, они занимают очень мало дискового пространства, что-то около 19 Мбайт (для Windows-версии). Вы можете также получить исходный код пакета, если хотите посмотреть, как выглядит внутри такое мощное и гибкое программное обеспечение. И снова открытое ПО побеждает.
№ 94. Интеллектуальный анализатор размеров изображений
Команда file позволяет определять типы файлов и в некоторых случаях даже размеры изображений. Но очень часто она терпит неудачу:
$ file * | head -4
100_0399.png:····PNG image data, 1024 x 768, 8-bit/color RGBA, non-interlaced
8t grade art1.jpeg:··JPEG image data, JFIF standard 1.01
99icon.gif:··········GIF image data, version 89a, 143 x 163
Angel.jpg:·········· JPEG image data, JFIF standard 1.01
Файлы PNG и GIF не вызывают проблем, но как быть с не менее распространенными файлами JPEG? Команда file не смогла определить размеры изображений. Какая досада!
Давайте устраним эту проблему с помощью сценария (листинг 14.1), который использует инструмент identify из пакета ImageMagick, чтобы точно определить размеры изображения.
Листинг 14.1.Сценарий imagesize
#!/bin/bash
# imagesize — выводит информацию о файле изображения и определяет размеры,
#·· используя утилиту identify из пакета ImageMagick.
for name
do
··identify −format "%f: %G with %k colors.\n" "$name"
done
exit 0
Когда инструмент identify вызывается с флагом −verbose, он извлекает огромный объем информации о каждом анализируемом изображении, как показано ниже, где исследуется один из файлов в формате PNG:
$ identify −verbose testimage.png
Image: testimage.png
··Format: PNG (Portable Network Graphics)
··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. Добавление водяных знаков в изображения
Если вы надеетесь сохранить в неприкосновенности свои изображения и другой контент, публикуемый в сети, вы неизбежно будете разочарованы. Все, что опубликовано в сети, доступно любому для копирования, даже если вы защитили доступ к своим материалам паролем, включили предупреждение об авторских правах или даже добавили на сайт код, не позволяющий сохранять изображения. Даже чтобы показать изображение на экране, необходимо, чтобы оно оказалось в памяти, а эту память можно скопировать с помощью инструментов захвата экрана.
Читать дальше