Если Вы собираетесь написать свой первый плагин для GIMP...

Январь 29, 2010
Плагин GIMP

... то этот пост для Вас. Мне довелось использовать три скриптовых движка — Script-fu, PERL-fu и Python-fu, и теперь я хочу поделиться своими соображениями о достоинствах и недостатках каждого из них.

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

Тогда я впервые столкнулся со Script-fu. И впервые с языками типа Scheme. Да, синтаксис оказался для меня необычным, но это не главное. Важно, что существует большая библиотека скриптов на этом движке, множество примеров в сети и удобный просмотрщик функций, позволяющий в несколько кликов собрать простенький скрипт.

Фрагмент кода на Script-fu

(if (= transparent-bg 1) () (
  ; создаем слой: image, width, height, type, name, opacity, mode -> layer
  (set! back-layer (car (gimp-layer-new img (car (gimp-image-width img)) (car (gimp-image-height img)) RGBA-IMAGE "main" 100 NORMAL)))
  ; добавляем слой к изображению: image, layer, position
  (gimp-image-add-layer img back-layer 0)
  ; устанавливаем цвет заднего плана: color
  (gimp-context-set-background background-color)
  ; заливаем слой: drawable fill_type
  (gimp-edit-fill back-layer BACKGROUND-FILL)
  ; опускаем слой в самый низ: image, layer
  (gimp-image-lower-layer-to-bottom img back-layer)
))

Script-fu отлично подходит, если Вам требуется записать ряд действий, которые Вы выполняете при помощи GIMP (кстати, странно, что в этом графическом редакторе нет "записи" действий, как в Adobe Photoshop или Microsoft Office — мне кажется, что это одна из возможностей первостепенной важности). И все же, если Вы собираетесь делать нетривиальную обработку изображений, вычислять размеры, сдвиги, выполнять собственные преобразования, то писать на Script-fu будет непросто. Вторым, но не менее важным недостатком движка являются скудные возможности для отладки. Когда мой скрипт сломался после очередного обновления GIMP, то у меня не получилось понять в чем проблема за разумное время. В итоге я бросил это занятие и решил переписать свой несложный скрипт на другом движке.

К этому времени я уже успел попробовать PERL-fu и написать на нем скрипт для автоматической обработки изображений из слайд-сканера. Писать на знакомом языке в привычной форме несомненно проще. Здесь можно передавать переменные в родные функции PERL, выводить в файл и потоки вывода отладочную информацию и сообщения. Что мне особенно нравилось, так это возможность запустить в открытом окне GIMP специальный сервер, после чего плагин становится законченным приложением по массовой обработке изображений, использующий всю мощь графического редактора. К моему сожалению я обнаружил, что движок PERL-fu в GIMP-2.6 испорчен, и нашел в интернете слухи, что он перестал поддерживаться. Возможно, это связано с тем, что Python-fu вышел на передний план.

Фрагмент кода на PERL-fu

# удалить все слои, которые имеют другую высоту и ширину
@layers = $image->get_layers ();
for ($i = 0; $i <= $#layers; $i++)
{
  if ($layers[$i]->width () != $width || $layers[$i]->height () != $height)
  {
    $image->remove_layer ($layers[$i]);
  }
}

В Python-fu все очень похоже на PERL-fu, только здесь в основе лежит популярный объектно-ориентированный язык Python. Имеется специальная консоль, вызываемая из окна GIMP, где можно потренироваться и выполнить команды прямо оттуда. Правда, в отличие от Script-fu, здесь нет просмотрщика функций, но все функции редактора имеют единый интерфейс, поэтому вызов Script-fu легко переделать в вызов Python-fu. Также меня огорчило отсутствие такого сервера, как для PERL-fu. По этой причине пакетная обработка файлов в Python-fu (как и в Script-fu) усложняется, т.к. с каждым вызовом плагина придется запускать новый экземпляр GIMP. Здесь две альтернативы — либо писать встроенный цикл для создания или изменения изображений, либо смириться с увеличенным временем работы. Решать Вам. Возможно, со временем кто-нибудь и напишет аналогичный сервер для Python-fu. Может быть, это даже буду я.

Фрагмент кода на Python-fu

# создаем слой: image, width, height, type, name, opacity, mode
layer = gimp.Layer(image, "background", image.width, image.height, RGBA_IMAGE, background_opacity, NORMAL_MODE)
# добавляем слой к изображению
image.add_layer(layer, 0)
# заливаем слой
layer.fill(BACKGROUND_FILL)
# опускаем слой в самый низ
pdb.gimp_image_lower_layer_to_bottom(image, layer)

Подведем итог. На Script-fu удобно писать простейшие скрипты, но трудно производить сложную обработку изображений и отлаживать скрипт. PERL-fu сейчас сломан, но идея с сервером достойна упоминания. Python-fu годится для написания скриптов любого уровня сложности и позволяет использовать всю мощь языка Python.

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

Никита Мельниченко.

Комментарии

zero
27.04.2010, 21:59

>К моему сожалению я обнаружил, что движок PERL-fu в GIMP-2.6 испорчен, и нашел в интернете слухи, что он перестал поддерживаться. Возможно, это связано с тем, что Python-fu вышел на передний план.

извиняюсь за тупой вопрос, но значит ли это, что прикрутить gimp-perl к gimp2.6 на данный момент не представляется возможным? у меня, например, он просто не собирается, ругаясь на то, что не может найти gimp2.0

Никита Мельниченко
28.04.2010, 22:32

Прикрутить можно, но в этом мало толку, т.к. там сломана даже базовая функциональность, насколько я помню. Кстати, только что проверил - собирается gimp-perl-2.2_pre1 с gimp-2.6.8, так что я вряд ли здесь помогу.

11.01.2012, 20:04

Скажите, Вы интересовались плагинами. Вот сейчас, как я понимаю, в Gimp API можно собирать плагин из виджетов. А реально включить в интерфейс плагина инструмент типа Curves? Или придется писать самому "с нуля"?

Никита Мельниченко
12.01.2012, 12:58

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

Михаил
12.01.2012, 14:09

Спасибо за ответ

Комментирование приостановлено