Если Вы собираетесь написать свой первый плагин для GIMP...
... то этот пост для Вас. Мне довелось использовать три скриптовых движка — Script-fu, PERL-fu и Python-fu, и теперь я хочу поделиться своими соображениями о достоинствах и недостатках каждого из них.
Началось все, когда меня попросили сделать сайт ресторана, у которого заголовки и названия продуктов выполнены специальным фигурным шрифтом. Если Вы веб-дизайнер, то понимаете в чем проблема — поддержка произвольных шрифтов в браузерах до сих пор под большим вопросом. А уж несколько лет назад... В общем, было решено делать большое количество картинок с надписями и вставлять их на страницу. Несмотря на то, что сайт был небольшой, делать вручную одинаковым образом множество изображений было невыносимо, поэтому я стал искать автоматические подходы. С ImageMagick у меня не сложилось, а вот писать плагины для GIMP оказалось несложно.
Тогда я впервые столкнулся со Script-fu. И впервые с языками типа Scheme. Да, синтаксис оказался для меня необычным, но это не главное. Важно, что существует большая библиотека скриптов на этом движке, множество примеров в сети и удобный просмотрщик функций, позволяющий в несколько кликов собрать простенький скрипт.
(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 вышел на передний план.
# удалить все слои, которые имеют другую высоту и ширину @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. Может быть, это даже буду я.
# создаем слой: 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. Я сделал для него отдельную страничку. Кстати, хороший пример для начинающих, ведь модифицируя простой работающий скрипт легче научиться!
Никита Мельниченко.
Комментарии
>К моему сожалению я обнаружил, что движок PERL-fu в GIMP-2.6 испорчен, и нашел в интернете слухи, что он перестал поддерживаться. Возможно, это связано с тем, что Python-fu вышел на передний план.
извиняюсь за тупой вопрос, но значит ли это, что прикрутить gimp-perl к gimp2.6 на данный момент не представляется возможным? у меня, например, он просто не собирается, ругаясь на то, что не может найти gimp2.0
Прикрутить можно, но в этом мало толку, т.к. там сломана даже базовая функциональность, насколько я помню. Кстати, только что проверил - собирается gimp-perl-2.2_pre1 с gimp-2.6.8, так что я вряд ли здесь помогу.
Скажите, Вы интересовались плагинами. Вот сейчас, как я понимаю, в Gimp API можно собирать плагин из виджетов. А реально включить в интерфейс плагина инструмент типа Curves? Или придется писать самому "с нуля"?
Насколько я понимаю, Gimp API предлагает определенный набор виджетов, и Кривые туда не входят, поэтому я считаю, что без модификации кода самого Gimp здесь не обойтись. Впрочем, если писать плагин не на скриптовом языке, а на C, то вполне возможно, что удастся вызвать диалог Кривые по кнопке из формы плагина, но это только предположение.
Спасибо за ответ