Обработка графики в командной строкеИсточник: rus-linux А. Кривошей
В этой статье описывается, как обрабатывать изображения в командной строке. Я занимаюсь этим достаточно часто, так как моя коллекция фотографий насчитывает несколько тысяч штук. Утилиты командной строки особенно полезны для веб-разработчиков или администраторов, которые часто занимаются пакетной обработкой большого количества изображений, так как разработчик может просто интегрировать их в свои скрипты. Но даже если вы занимаетесь этим от случая к случаю, утилиты командной строки помогут вам сэкономить время. Как работает ImageMagickImageMagick служит оберткой для набора различных графических библиотек, включающего libtiff и libpng. В терминологии ImageMagick это вызываемые делегаты. Это является одной из причин, почему ImageMagick не так быстр, как мог бы быть. Он написан таким образом, что может взаимодействовать с библиотеками несколькими способами. Необходимо отместить, что все описанное в этой статье можно выполнять различными способами. Я описываю методы, которые я использовал и которые у меня работали. Это не значит, что другие утилиты в этом случае не будут работать, это всего лишь значит, что мне было удобно работать так, как это описано. Создание миниатюрПервое, что я делаю со своей коллекцией изображений - создаю миниатюры. Также я хотел создать уменьшенные версии изображений для размещения на сайте, так как вряд ли многие захотят открывать 2-х мегапиксельные фотографии моего сына. Чтобы изменить размер изображения с помощью convert, просто используйте опцию командной строки -sample. Например, мне нужна миниатюра размером 80 x 40 пикселей. Тогда команда будет выглядеть следующим образом: $ convert -sample 80x40 input.jpg output.jpg Полученная миниатюра будет выглядеть так: ImageMagick при преобразовании автоматически сохраняет соотношение сторон первоначального изображения. Это значит, что реальный размер созданной нами миниатюры составит 53 на 40 вместо 80 на 40. $ convert -sample 25%x25% input.jpg output.jpg Теперь мы получим такую миниатюру: С помощью этой команды можно создать миниатюры всех изображений в директории. Так как эта статья не посвящена написанию скриптов, я просто покажу вам пример скрипта для создания миниатюр всех JPEG в текущей директории: Листинг 1. Создание миниатюр всех JPEG в текущей директории for img in `ls *.jpg` do convert -sample 25%x25% $img thumb-$img done Этот скрипт генерирует серию миниатюр размером 25% от размера исходного изображения с именем файла, которое создается путем добавления префикса thumb- к имени файла исходного изображения. Получение информации о файле изображенияЕще одна часто встречающаяся задача - определение размеров и получение другой информации об изображении. Многие графические библиотеки имеют прекрасные инструменты, предназначенные для этого. Например, libtiff включает утилиту tiffinfo, которая позволяет получить следующую информацию об изображениях в формате TIFF: $ tiffinfo sample.tif Листинг 2. Простой вывод tiffinfo TIFF Directory at offset 0x146 Image Width: 352 Image Length: 288 Bits/Sample: 8 Compression Scheme: Deflate Photometric Interpretation: RGB color Samples/Pixel: 3 Planar Configuration: single image plane Это не самый исчерпывающий пример использования tiffinfo, но, как вы можете видеть, она возвращает достаточное количество информации. Похожая утилита pnginfo возвращает информацию о файлах PNG. $ pnginfo sample.png Листинг 3. Простой вывод pnginfo $ sample.png... Image Width: 640 Image Length: 480 Bitdepth (Bits/Sample): 8 Channels (Samples/Pixel): 3 Pixel depth (Pixel Depth): 24 Colour Type (Photometric Interpretation): RGB Image filter: Single row per byte filter Interlacing: No interlacing Compression Scheme: Deflate method 8, 32k window Resolution: 0, 0 (unit unknown) FillOrder: msb-to-lsb Byte Order: Network (Big Endian) Number of text strings: 0 of 0 Я не знаю, есть ли аналогичные утилиты для других графических форматов, таких как BMP, GIF и JPEG. Тем не менее, и в этом случае на помощь приходит ImageMagick с утилитой под названием identify. $ identify -verbose sample.png Листинг 4. Простой вывод identify Image: sample.png Format: PNG (Portable Network Graphics) Geometry: 640x480 Class: DirectClass Type: true color Depth: 8 bits-per-pixel component Colors: 142360 Filesize: 555.6k Interlace: None Background Color: grey100 Border Color: #DFDFDF Matte Color: grey74 Dispose: Undefined Iterations: 0 Compression: Zip signature: 361fe70ae623ef6f1fca44e0d29d157c2d701039fcf0f8625862925d881e13a4 Tainted: False User Time: 0.190u Elapsed Time: 0:01 Вы можете видеть, что identify выводит набор полезной информации о каждом файле, такой как размер изображения в пикселях, глубина цвета и формат изображения. identify также имеет флаг командной строки -format, который позволяет задать вывод только нужной вам информации. Например, если вас интересует только размер изображения, вы можете использовать команду вида: $ identify -format "%wx%h" sample.png Вывод этой команды: $ 640x480 Здесь %w значит ширину изображения, а %h - высоту. Для получения более подробной информации о форматировании вывода identify можно узнать, прочитав man-страницу утилиты. Вращение изображенийДругая часто встречающаяся задача - поворот изображений. Например, многие сделанные цифровой камерой фотографии требуется повернуть на 90 градусов, чтобы нормально просматривать их в портретном режиме. Моя камера не делает этого автоматически, поэтому я написал скрипт, который запускаю после копирования фотографий с камеры. Чтобы повернуть изображение, мы снова используем команду convert: $ convert -rotate 90 input.jpg output.jpg Теперь фотография выглядит так: Заметьте, что аргумент опции -rotate - это число градусов, на которое нужно повернуть изображение по часовой стрелке. Для повора против часовой стрелки вводится число градусов со знаком минус. Конвертирование изображенийКоманда convert также используется для конвертирования файлов изображений. Под конвертированием здесь подразумевается как изменение формата фотографии, например из JPEG в PNG, так и преобразование цветной фотографии в черно-белую, сглаживание и другие подобные операции. $ convert input.jpg output.png ImageMagick в настоящее время поддерживает 89 форматов изображений. Добавление текстовых подписей к изображениюИногда бывает нужно добавить тестовую подпись к изображению. Например, представьте, что в вашей компании используется единый шаблон для визитных карточек, и нужно подставить данные конкретного сотрудника перед отправкой карточки на печать. Другой пример - создание сертификатов для пользователей, которые проходят онлайн-курсы на вашем веб-сайте. Давайте начнем с этого фото: Вы можете подписать изображение с помощью следующей команды: $ convert -font helvetica -fill white -pointsize 36 \ -draw 'text 10,50 "Floriade 2002, Canberra, Australia"' \ floriade.jpg comment.jpg Результат: Это, наверное, самая сложная для понимания команда из приведенных в этой статье, поэтому она требует некоторых пояснений. $ convert -font fonts/1900805.ttf -fill white -pointsize 36 \ -draw 'text 10,475 "stillhq.com"' \ floriade.jpg stillhq.jpg Результат: -fill white - задает белый цвет шрифта вместо стандартного черного. Другие, более артистичные преобразованияconvert способен также выполнять быстрые художественные преобразования. Я продемонстрирую наиболее интересные из них. О других можно прочитать на сайте ImageMagick. Для демонстрации я буду использовать следующее изображение: CharcoalЭффект charcoal имитирует рисование углем. $ convert -charcoal 2 input.jpg output.jpg Результат: Увеличение магнитуды аргумента опции -charcoal усиливает эффект, но при этом обработка изображения требует больше времени. Ниже пример с увеличенным значением: $ convert -charcoal 10 input.jpg output.jpg И получаем: Если вы хотите посмотреть, как будет выглядеть максимально усиленный эффект charcoal, попробуйте: $ convert -charcoal 200 input.jpg output.jpg Получаем вот это: СolorizeСolorize - это процесс смешивания цвета каждого пикселя с заданным цветом. Аргумент обозначает цвет, с которым производится смешивание. Он может быть задан в виде одного значения (это значение используется для красного, зеленого и синего цветов), или в виде трех значений. Максимальное значение - 255. $ convert -colorize 255 input.jpg output.jpg Uluru теперь выглядит так: ImplodeЭффект implode моделирует втягивание центра вашего изображения в виртуальную черную дыру. Аргумент задает степень воздействия эффекта. $ convert -implode 4 input.jpg output.jpg Uluru теперь выглядит так: SolarizeЭффект solarizing имитирует передержанный в процессе проявки негатив. Аргумент задает интенсивность применения эффекта, который может быть задан как в абсолютном выражении, так и в процентном от максимально возможного для пикселя значения. $ convert -solarize 42 input.jpg output.jpg Теперь наше фото будет выглядеть так: SpreadSpread перемещает пиксели изображения в случайном порядке. Аргумент задает размер области вокруг пикселя, в пределах которой выбирается его новое местоположение, то есть насколько размазанным будет изображение. $ convert -spread 5 input.jpg output.jpg Ниже Uluru после размазывания: Несколько команд в одном вызове ImageMagickВы уже могли видеть пример такой команды в разделе о текстовых подписях. В целом возможно составлять цепочки из любых команд ImageMagick, описанных в этой статье. Например, мы хотим сделать миниатюру изображения, затем размыть его. После размытия мы применим эффект рисования углем: $ convert -sample 25%x25% -spread 4 \ -charcoal 4 input.jpg output.jpg Результат: Хитрости и подсказкиЕсть несколько моментов, о которых нужно помнить, перед тем, как вы начнете работать со своими фото. Во-первых, вы должны определиться с форматом, в котором вы собираетесь хранить изображения, чтобы не оказаться в ситуации, когда у вас будет куча фотографий в формате, который вас не будет больше устраивать. Итак, мы объединили уменьшение с увеличением: $ convert -sample 10% -sample 1000% input.jpg output.jpg В результате получили следующую картинку: Достаточно трудно узнать водопад на этой фотографии. ЗаключениеВ этой статье мы обсудили несколько интересных вещей, которые позволяет делать ImageMagick при обработке изображений в командной строке. Описанные здесь инструменты не решат всех проблем, но позволят сэкономить время при выполнении рутинных, наиболее часто встречающихся операций. |