Колдовство ImageMagick

Работа с изображениями для пользователей и программистов

ImageMagick ― это набор инструментов с открытым исходным кодом для создания, редактирования и преобразования растровых изображений. Опытный разработчик может использовать многие его возможности для создания качественных, профессиональных растровых изображений и других произведений для Web-сайтов, маркетинговых брошюр и всего, что должно производить впечатление. Распространяемый по лицензии Apache 2.0, ImageMagick допускает свободное использование, копирование, изменение и распространение как открытых, так и частных приложений.

Билл Циммерли, специалист в области инженерии знаний, Рязанский государственный радиотехнический университет

Билл Циммерли (Bill Zimmerly) является специалистом в области инженерии знаний, а также программистом языков низкого уровня. Он имеет большой опыт работы с различными версиями программного обеспечения UNIX® и Microsoft® Windows®. Билл с огромным энтузиазмом и удовольствием занимается созданием новых технологий и рассказывает о них в своих статьях. Живет он в деревушке Хиллсборо, Миссури, где может наслаждаться чистым воздухом и прекрасной природой. Кроме того, неподалеку находятся несколько винных заводов. Связаться с ним можно по адресу электронной почты: bill@zimmerly.com.



05.12.2012

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

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

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

ImageMagick ― это редактор

Вообще говоря, компьютерная программа, называемая редактором, предназначена для создания, изменения и сохранения цифровых данных определенного типа. Существует много редакторов, как и различных типов цифровых данных. Есть текстовые редакторы для документов, кода программ и сценариев, популярными примерами которых служат Vi и Emacs. Имеются редакторы аудиоданных, такие как Audacity и Wavosaur. ImageMagick представляет собой специализированный редактор для редактирования графических изображений.

Для создания растровых изображений

Как и многие другие графические редакторы, ImageMagick предлагает интерактивную среду редактирования изображений. Но вдобавок у ImageMagick есть всеобъемлющие интерфейсы прикладных программ (API) для многих стандартных языков программирования. Сообщество программистов ImageMagick предлагает массу полезных программ для редактирования изображений с той или иной функциональностью.

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

Для редактирования растровых изображений

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

Для включения изображений в проекты

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

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

Рисунок 1. Мерлин
Кот Мерлин

Чтобы снабдить изображение красивым заголовком, я воспользуюсь следующей командой:

$ convert bMerlin.jpg -font Ubuntu-Bold-Italic \
  -pointsize 56 -fill blue -annotate +25+70 \
  'Merlin, the Wizard of Cats' NewMerlin.jpg

Примечание. Если в системе нет шрифта Ubuntu Bold Italic, используйте следующую команду для получения списка доступных шрифтов:

$ convert -list font

После обработки изображения вы получаете фото, показанное на рисунке 2.

Рисунок 2. Фото с добавленным заголовком
Фото с добавленным заголовком

Как видите, колдовать с помощью ImageMagick совсем не трудно. Нужна только практика, чтобы освоить инструмент. Программисты, то есть чародеи, создавшие ImageMagick, проделали большую работу по документированию своего инструмента на Web-сайте. Я призываю вас посетить его и закрепить то, что вы узнаете из этой статьи. (См. раздел Ресурсы)


ImageMagick библиотека для работы с изображениями

Библиотека программиста с функциями этого мощного инструмента более чем всеобъемлюща. С помощью знакомых языков программирования можно использовать возможности ImageMagick через простые API, свои для каждого языка. Программируемость ImageMagick ― от простых bash-сценариев для команд ImageMagick до вызова функций API для таких языков, как C или Perl, ― отличает его от многих других инструментов для работы с графикой.

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


Преобразования между популярными форматами изображений

Существует более ста различных графических форматов файлов цифровых изображений. ImageMagick позволяет приручить этого зверя сложности.

ImageMagick устанавливается на многие операционные системы. Есть функциональные версии для Windows®, UNIX® и Linux®, Mac OS X и Apple iOS. В этой статье рассматривается версия для Ubuntu Linux. Чтобы загрузить исходный код или предпочтительную двоичную версию системы, обращайтесь по ссылке в разделе Ресурсы.

Двоичный или исходный?

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

Дистрибутив или специальная версия?

Каждый дистрибутив (или distro) предлагает свой метод добавления встроенных двоичных файлов. Чтобы установить ImageMagick на дистрибутивы, восходящие к Debian Linux, такие как Ubuntu, можно использовать один из менеджеров пакетов на базе графического интерфейса пользователя, такой как Synaptic Package Manager, или работать из командной строки, вот так:

$ sudo apt-get install imagemagick

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

$ ./configure --help

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

Сборка ImageMagick из исходного кода

Процесс сборки большинства программы с открытым исходным кодом для компьютеров на платформе *nix включает в себя три команды, и ImageMagick ― не исключение. Вот эти стандартные команды:

$ ./configure
Задача сценария configure ― создать специальный файл Makefile для следующего шага. Он методично выполняет ряд шагов по определению конфигурации вашей машины, а затем либо сообщает, что не хватает чего-то важного, например, необходимой библиотеки, либо говорит, что все это хорошо, и Makefile успешно создан.
$ make
Makefile, созданный на предыдущем шаге, используется программой make для сборки всех программ, составляющих ImageMagick, вместе с соответствующей документацией.
$ sudo make install
Последняя команда копирует программы, документацию и связанные с ними файлы данных в их постоянное место, где все пользователи системы смогут их найти. Обычно это каталог /usr/local/bin.

Работа пользователя с изображениями

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

Создание изображений с нуля

Интерактивный редактор ImageMagick вызывается с командой display с указанием соответствующего имени файла или без него. Интерфейс напоминает многие другие программы для рисования, прост в использовании и управляется посредством меню.

Введите команду display. Появится окно, изображенное на рисунке 3.

Рисунок 3. Окно редактора ImageMagick
Окно редактора ImageMagick

Щелкните в окне, затем выберите из меню File> New, чтобы приступить к созданию растрового изображения. Вам будет предложено ввести геометрию изображения, а затем цвет фона. При вводе геометрии можно использовать градации цветов фона.

Утилиты командной строки

ImageMagick содержит множество утилит командной строки. Вот краткий список:

  • animate. Анимирует последовательность изображений
  • compare. Помечает различия в изображениях
  • composite. Создает наложение, помещая одно изображение поверх другого
  • conjure. Выполняет сценарии, написанные на языке сценариев Magick
  • convert. Преобразует один формат изображения в другой
  • display. Интерактивный графический редактор
  • identify. Описывает файл изображения
  • import. Полезна для захвата экрана или окна
  • mogrify. Подобна convert
  • montage. То же, что и composite, с поддержкой нескольких изображений и других эффектов
  • stream. Инструмент для создания сценариев потоковой построчной передачи изображений

Создав холст, можно начать работу с инструментами рисования, чтобы украсить его. Выберите Image Edit > Draw. Режим изменится, и вы увидите новое меню, а курсор холста станет вести себя по-другому. Выберите инструмент рисования и положите на холст свои идеи. Оставив инструменты рисунка и цвета, можно добавлять специальные эффекты ― творите.

Редактирование изображений

Изображения можно редактировать разными способами. Команда display image-name позволяет использовать интерактивный редактор, описанный выше, но для работы с изображениями можно применять и другие инструменты. Так, программа convert предоставляет возможность конвертировать файл изображения в другой общепринятый графический формат, подходящий для различных сред.

Чтобы увидеть, как это делается, мы воспользуемся программой для создания серии приглашений на "кошачью вечеринку". Программа имеет форму bash-сценария, поэтому запустим xterm и создадим первый файл:

$ touch catcards
$ chmod a+x catcards

Сделав созданный файл исполняемым, можно открыть свой любимый редактор программ (например, Vi или Emacs) и набрать в файле catcards программный код bash-сценария, приведенный в листинге 1.

Листинг 1. Bash-сценарий для изготовления приглашений
---
#!/bin/bash
# Bash-сценарий catcard для демонстрации ImageMagick и генерации приглашений на 
# кошачью вечеринку.
# 20111115 by Bill Zimmerly.

# Команда seq для создания последовательности чисел.

SEQ=`which seq`

# Создание файла гостей. Исключите это, если имена «гостей» находятся во внешнем файле.
# (Важное замечание: «cat» в этом сценарии не имеет ничего общего с кошками!)

cat > guests << EOF
Grandma
Aunt Linda
Uncle Dave
Aunt Rachael
Uncle Joe
Uncle Myk
EOF

# Считывание списка гостей в массив а.
# Примечание. IFS ― это значение разделителя полей, которое в данном случае ДОЛЖНО 
# быть задано для строк.

old_IFS=$IFS
IFS=$'\n'
a=($(cat guests))

echo "Generating $((${#a[@]})) invitations to:"

# Создание приглашений.

for i in $($SEQ 0 $((${#a[@]} - 1)))
do
  # Использование base=1 для подсчета гостей и вывода их числа на консоль.

  j=i
  ((j += 1))
  echo $j. ${a[$i]}

  # Подготовка имени файла.

  echo "Merlin"$j".jpg" > filename

  # Подготовка текста приглашения.

  echo ${a[$i]}", I love you and"       > text1
  echo "I want you to come to my"       > text2
  echo "cat party to scratch my belly." > text3
  echo "Sincerely,"                     > text4
  echo "Merlin"                         > text5

  # Создание новой карточки командой ImageMagick convert.

  convert bMerlin.jpg \
    -font Ubuntu-Bold-Italic \
    -pointsize 24 -fill blue \
    -annotate +25+40 $(cat text1) \
    -annotate +25+70 $(cat text2) \
    -annotate +25+100 $(cat text3) \
    -annotate +25+130 $(cat text4) \
    -annotate +25+160 $(cat text5) \
    $(cat filename)

done

# Восстановление значения разделителя  полей и очистка временных файлов.

IFS=$old_IFS

rm guests
rm filename
rm text1
rm text2
rm text3
rm text4
rm text5

exit 0
---

Щелкните правой кнопкой на изображении кота Мерлина (рисунок 1) и сохраните его в каталоге со сценарием catcards. (Сценарий catcards использует этот файл изображения в качестве данных).

Наконец, запустите сценарий и перечислите созданные файлы, как показано в листинге 2.

Листинг 2. Вызов сценария для получения приглашений
$ ./catcards
Generating 6 invitations to:
1. Grandma
2. Aunt Linda
3. Uncle Dave
4. Aunt Rachael
5. Uncle Joe
6. Uncle Myk
$ ls Merlin*

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

$ display Merlin1.jpg
    .
    .
    .
   Etc.

Например, на рисунке 4 показано приглашение для тети Рейчел.

Рисунок 4. Приглашение на кошачью вечеринку для тети Рейчел.
Приглашение на кошачью вечеринку для тети Рейчел.'s invitation

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


Работа с изображениями для программистов

Программисты могут использовать функциональность для работы с изображениями двумя способами: через API MagickWand на языке C или API MagickCore.

Использование MagickWand API на языке C

В качестве примера авторы ImageMagick создали программу для повышения контрастности изображения Мерлина (см. раздел Ресурсы). Ее код приведен в листинге 3.

Листинг 3. Пример программы на языке C для изменения контрастности изображения.
---
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <wand/MagickWand.h>

int main(int argc,char **argv)
{
#define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
#define SigmoidalContrast(x) \
  (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
#define ThrowWandException(wand) \
{ \
  char \
    *description; \
 \
  ExceptionType \
    severity; \
 \
  description=MagickGetException(wand,&severity); \
  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
  description=(char *) MagickRelinquishMemory(description); \
  exit(-1); \
}

  MagickBooleanType
    status;

  MagickPixelPacket
    pixel;

  MagickWand
    *contrast_wand,
    *image_wand;

  PixelIterator
    *contrast_iterator,
    *iterator;

  PixelWand
    **contrast_pixels,
    **pixels;

  register ssize_t
    x;

  size_t
    width;

  ssize_t
    y;

  if (argc != 3)
    {
      (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
      exit(0);
    }
  /*
    Чтение изображения.
  */
  MagickWandGenesis();
  image_wand=NewMagickWand();
  status=MagickReadImage(image_wand,argv[1]);
  if (status == MagickFalse)
    ThrowWandException(image_wand);
  contrast_wand=CloneMagickWand(image_wand);
  /*
    Управление контрастностью методом сигмоидальной нелинейности.
  */
  iterator=NewPixelIterator(image_wand);
  contrast_iterator=NewPixelIterator(contrast_wand);
  if ((iterator == (PixelIterator *) NULL) ||
      (contrast_iterator == (PixelIterator *) NULL))
    ThrowWandException(image_wand);
  for (y=0; y < (ssize_t) MagickGetImageHeight(image_wand); y++)
  {
    pixels=PixelGetNextIteratorRow(iterator,&width);
    contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width);
    if ((pixels == (PixelWand **) NULL) ||
        (contrast_pixels == (PixelWand **) NULL))
      break;
    for (x=0; x < (ssize_t) width; x++)
    {
      PixelGetMagickColor(pixels[x],&pixel);
      pixel.red=SigmoidalContrast(pixel.red);
      pixel.green=SigmoidalContrast(pixel.green);
      pixel.blue=SigmoidalContrast(pixel.blue);
      pixel.index=SigmoidalContrast(pixel.index);
      PixelSetMagickColor(contrast_pixels[x],&pixel);
    }
    (void) PixelSyncIterator(contrast_iterator);
  }
  if (y < (ssize_t) MagickGetImageHeight(image_wand))
    ThrowWandException(image_wand);
  contrast_iterator=DestroyPixelIterator(contrast_iterator);
  iterator=DestroyPixelIterator(iterator);
  image_wand=DestroyMagickWand(image_wand);
  /*
    Запись изображения и его удаление.
  */
  status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
  if (status == MagickFalse)
    ThrowWandException(image_wand);
  contrast_wand=DestroyMagickWand(contrast_wand);
  MagickWandTerminus();
  return(0);
}
---

Если ввести этот исходный код в файл contrast.c, то для построения программы можно использовать следующую команду contrast:

$ cc `MagickWand-config \
     --cflags --cppflags` \
     -O2 -o wand wand.c \
     `MagickWand-config --ldflags --libs`

Когда команда contrast готова, и ее можно использовать для увеличения контрастности изображения Мерлина вот так:

$ ./contrast bMerlin.jpg MerlinX.jpg

Сравните изображение на рисунке 5 с предыдущими изображениями Мерлина.

Рисунок 5. Результаты выполнения программы регулирования контрастности
Результаты выполнения программы регулирования контрастности

API MagickCore

API MagickCore ― это низкоуровневый интерфейс между библиотеками обработки изображений и программами. Он предназначен главным образом для системных программистов и обеспечивает базовую функциональность, обычно невидимую на более высоких уровнях: инициализацию среды, создание экземпляров объектов, вычисление преобразования Фурье и т.п.


Распространение проектов с библиотеками ImageMagick

ImageMagick распространяется по лицензии ПО с открытым исходным кодом Apache 2.0, которая предъявляет несколько особых требований к тем, кто намерен использовать ее в своих проектах. Вкратце, нужно включить полную копию лицензии в дистрибутив своего проекта и дать четкую ссылку на Apache Software Foundation. См. ссылку на полную информацию о лицензии Apache 2.0 в разделе Ресурсы .


Заключение

В сфере редакторов изображений ImageMagick выделяется как мощный инструментарий программиста для создания и редактирования файлов изображений. Как показано в предыдущем bash-сценарии и примерах кода на языке C, этот всеобъемлющий и полезный инструментарий позволяет колдовать над проектами, связанными с графикой.

Ресурсы

Научиться

Получить продукты и технологии

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=848724
ArticleTitle=Колдовство ImageMagick
publish-date=12052012