Использование языка Python для написания GIMP-плагинов

Расширение GIMP для автоматического решения задач

В этой статье показано, как автоматизировать GNU Image Manipulation Program (GIMP) с помощью сценариев для решения двух простых задач: изменения размера всех фотографий в папке и их сохранения в одном и том же формате. Вы узнаете, как построить плагины для GIMP на языке сценариев Python. Новые плагины можно использовать с помощью команды gimp из командной строки.

Натан А. Гуд, инженер по программному обеспечению, начальник отдела

Натан Гуд (Nathan A. Good) живет в регионе Twin Cities (штат Миннесота, США). Н. Гуд профессионально занимается разработкой программного обеспечения, архитектурой программного обеспечения и системным администрированием. Когда Н. Гуд не занят написанием программного обеспечения, он с удовольствием занимается построением ПК и серверов, изучением и освоением новых технологий, а также убеждением своих коллег в необходимости перехода на программное обеспечение с открытым кодом. Натан Гуд лично и в соавторстве написал множество книг и статей, в том числе: Professional Red Hat Enterprise Linux 3, Regular Expression Recipes: A Problem-Solution Approach, Regular Expression Recipes for Windows Developers: A Problem-Solution Approach, PHP 5 Recipes: A Problem-Solution Approach. Самая новейшая из его работ: Foundations of PEAR: Rapid PHP Development.



16.09.2011

Эта статья посвящена использованию GIMP-Python, набора Python-модулей, которые позволяют создавать программы на языке Python для автоматизации команд GNU Image Manipulation Program (GIMP). Эти Python-модули представляют собой оболочку вокруг библиотек libgimp. GIMP-Python отличается от расширений Script-Fu. В Script-Fu плагин используется для выполнения сценариев. В GIMP-Python центральное место занимает сценарий Python, который и выполняет всю работу. Экземпляры сценариев GIMP-Python можно создавать внутри самого GIMP или использовать пакетный режим GIMP для запуска этих сценариев из командной строки.

Эта статья посвящена написанию кода Python, позволяющего автоматизировать две разные задачи в GIMP: изменение размера изображений и их сохранение в разных форматах.

GIMP и Python можно установить и использовать на многих платформах, включая Linux®, Mac OS X® и Microsoft® Windows®. Кросс-платформенный характер как GIMP, так и Python означает возможность создавать сложные плагины для GIMP с использованием Python и запускать их на разных платформах.

Обзор GIMP

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

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


Обзор языка сценариев Python

Python ― это объектно-ориентированный язык сценариев, который позволяет писать код, работающий на разных платформах. Python портирован на обе виртуальные машины .NET и Java™, так что существует масса различных способов его исполнения. О том, как установить Python на свой компьютер, можно узнать по ссылкам в разделе Ресурсы.

Для Python существует множество модулей, которые обеспечивают нужную функциональность, избавляя от необходимости писать свой собственный код (примером служат модули GIMP-Python).В списке модулей Python встречается множество готовых модулей, пригодных для решения самых разных задач от операций с Hypertext Markup Language (HTML) и соединениями Hypertext Transfer Protocol (HTTP) до работы с файлами Extensible Markup Language (XML) (см. раздел Ресурсы). Можно создавать собственные модули Python, что позволит повторно использовать фрагменты кода в пределах предприятия.

Как и GIMP, Python пользуется значительной поддержкой сообщества. Это означает возможность находить информацию, а также загружать и использовать относительно зрелые инструменты, помогающие в программировании на Python.

Прежде чем перейти к чтению следующей части статьи, установите Python на свою операционную систему в соответствии с инструкциями на сайте Python. Убедитесь, что Python правильно установлен: откройте командную строку и наберите python --version. Результат должен выглядеть примерно как, как в листинге 1.

Листинг 1. Проверка правильности установки Python
$ python --version
Python 2.6.6

Установив интерпретатор Python, можно создваать файлы Python в любом текстовом редакторе и запускать их в интерпретаторе. Также можно использовать плагин PyDev для Eclipse, который обеспечивает подсветку синтаксиса и некоторые другие полезные функции, такие как выявление синтаксических ошибок. Другой вариант ― использование консоли Python непосредственно в Eclipse; это удобно для поиска справочных материалов.

В новых версиях GIMP модули GIMP-Python уже должны быть установлены. Чтобы проверить это, откройте GIMP и посмотрите, присутствует ли в меню Filters пункт Python-Fu. Если да, можно приступать к созданию сценариев. В противном случае установите Python-расширения для GIMP, следуя по ссылкам в разделе Ресурсы.

Если нужен плагин PyDev для Eclipse, выполните следующие действия.

  1. Установите плагин PyDev, выбрав пункт меню Help > Install New Software.
  2. В качестве сайта обновлений используйте http://pydev.org/updates (см. раздел Ресурсы ).
  3. Выполните остальные инструкции по установке и перезагрузите Eclipse.
  4. После перезапуска Eclipse выберите File > New> Project, чтобы создать новый проект.
  5. Выберите пункт PyDev\PyDev Project и нажмите кнопку Next.
  6. Введите имя проекта (например, MyPythonGimpPlugins).
  7. Снимите флажок Use default (использовать параметры по умолчанию) и введите местоположение своего каталога GIMP для модулей Python, как показано на рисунке 1 .
    Рисунок 1. Создание нового проекта с плагином PyDev для Eclipse
    Создание нового проекта с плагином PyDev для Eclipse
  8. Нажмите на ссылку, чтобы настроить интерпретатор. Если Python установлен правильно и по указанному пути, должна работать кнопка Auto Config.

Не забудьте добавить к своему проекту папку с модулями GIMP Python gimp и gimpfu. Добавьте этот каталог в свой проект Eclipse (но не добавляйте его к основному пути) с помощью пункта меню Project> Properties, как показано на рисунке 2.

Рисунок 2. Добавление каталога модулей GIMP-Python к проекту в Eclipse
Добавление каталога модулей GIMP-Python к проекту в Eclipse

Нажмите кнопку PyDev - PYTHONPATH. Затем выберите вкладку External Libraries (внешние библиотеки) и нажмите кнопку Add source folder (Добавить папку-источник), чтобы добавить папку, в которой устанавливаются модули GIMP Python. Путь будет примерно таким: /usr/lib/gimp/2.0/python/.

В Eclipse можно запустить консоль Python. Когда видна консоль, выберите из списка консолей Pydev Console.


Регистрация сценария

Файлы Python попадают в папку пользователя GIMP. В Mac- и Linux-системах это папка ~/.gimp-2.6/plug-ins. Файлы сценариев Python должны быть исполняемыми и содержать интерпретатор Python в первой строке, как стандартные декларации сценариев (см. листинг 2).

Листинг 2. Элементарный сценарий Python, который выводит "Hello, world!"
#!/usr/bin/python

print "Hello, world!"

Сценарий Python для GIMP нужно зарегистрировать, чтобы поместить плагин в одно из меню GIMP. В листинге 3 приведен минимальный код, необходимый для регистрации сценария в GIMP и вывода "Hello, World!" на консоль при его вызове.

Листинг 3. Регистрация плагина в GIMP
#!/usr/bin/python

from gimpfu import *

def plugin_main(timg, tdrawable):
    print "Hello, world!"

register(
        "python_fu_resize",
        "Saves the image at a maximum width and height",
        "Saves the image at a maximum width and height",
        "Nathan A. Good",
        "Nathan A. Good",
        "2010",
        "<Image>/Image/Resize to max...",
        "RGB*, GRAY*",
        [],
        [],
        plugin_main)

main()

Метод register() передает GIMP информацию о вашем плагине.

Метод register() имеет несколько параметров, которые говорят GIMP, как отображать меню для плагина и какой метод Python вызвать при запуске плагина из меню. В таблице 1 приведены параметры метода register().

Таблица 1. Параметры и примеры метода register()
ПараметрПримерОписание
proc_namepython_fu_resizeИмя команды, которую можно вызывать из командной строки или сценария
blurbСохраняет изображение с максимальной шириной и высотойИнформация о плагине, который отображается в браузере процедур
helpСохраняет изображение с максимальной шириной и высотойСправка по плагину
authorNathan A. GoodАвтор плагина
copyrightNathan A. GoodОбладатель авторских прав на плагин (обычно тот же, что и автор)
date2010Дата авторского права
label<Image>/Image/Resize to max...Метка, используемая для плагина в меню
imagetypesRGB*, GRAY*Типы изображений, с которыми работает плагин
params[]Параметры метода плагина
results[]Результаты метода плагина
functionplugin_mainИмя метода, вызываемого в программе Python

Чтобы получить самую актуальную информацию о параметрах метода register, откройте консоль Python-Fu (нажмите Filters > Python-Fu > Console) и введите команды, показанные в листинге 4.

Листинг 4. Получение справки с использованием консоли Python
import gimpfu 
help(gimfu.register)

После ввода значений в метод register сохраните свой сценарий. Убедитесь, что он исполняемый и находится в папке .gimp2-6/plug-ins.

Сохранив сценарий, запустите GIMP из командной строки с помощью команды gimp. Это позволит вам увидеть любую информацию, выведенную вашим плагином, в том числе выходное сообщение. Кроме того, если в плагине есть ошибки, вы их увидите.

Запустив GIMP, перейдите в меню Image, где появится новый пункт меню Resize to max, как показано на рисунке 3.

Рисунок 3. Новый пункт меню нового плагина
Скриншот, показывающий, что 'Resize to max..' появляется в нижней части меню Image в GIMP

Теперь, когда ваш плагин правильно зарегистрирован в GIMP, и можно выбрать пункт меню своего плагина, вы готовы приступить к добавлению кода Python для изменения размера изображения.


Сценарий изменения размера

Имея плагин Python в GIMP, можно добавить реальный код в метод plugin_main внутри кода плагина.

В листинге 5 показан код для изменения размеров изображения.

Листинг 5. Добавление кода в метод plugin_main
def plugin_main(timg, tdrawable, maxh=500, maxw=500):

 currentWidth = tdrawable.width
 currentHeight = tdrawable.height

 newWidth = currentWidth
 newHeight = currentHeight

 if (maxw < newWidth):
 newWidth = maxw
 newHeight = (float(currentHeight) / (float(currentWidth) / newWidth))

 if (maxh < newHeight):
 newHeight = maxh
 newWidth = (float(currentWidth) / (float(currentHeight) / newHeight))

 pdb.gimp_image_scale(timg, newWidth, newHeight)

Чтобы изменить размер изображения, код Python просто вызывает метод pdb.gimp_scale_image, выполнив некоторые элементарные вычисления, чтобы определить требуемые значения размеров масштабируемого изображения. Поскольку значения, введенные в поле, это максимальные значения, сценарий должен проверить как ширину, так и высоту текущего изображения, чтобы определить, нужно ли ограничить его размеры. Если какой-либо размер изображения больше максимального, плагин ограничивает его до максимального размера, а затем вычисляет другое измерение.

О других методах, которые можно вызывать в сценарии Python, см. в Справке GIMP Help > Procedure Browser. На рисунке 4 показан браузер процедур метода pdb.gimp_image_scale.

Рисунок 4. Просмотр метода gimp-image-scale в браузере процедур
Просмотр метода gimp-image-scale в браузере процедур

Запуск сценария плагина изменения размера

Добавив код изменения размера, откройте изображение в GIMP. Выберите свой новый пункт меню Image > Resize to max. Сценарий спросит у вас размеры, как показано на рисунке 5.

Рисунок 5. Входные параметры плагина
Входные параметры плагина

При нажатии кнопки ОК выполняется метод plugin_main, и ваш сценарий изменяет размеры изображения.


Сценарий преобразования изображений

Теперь, когда у вас есть плагин для изменения размеров изображения, сценарий Python можно изменить так, чтобы он сохранял изображение в другом формате. Это позволит сохранить исходное изображение в виде файла JPEG и изменить его размер в соответствии с определенными ограничениями.

Дополнения к сценарию показаны в листинге 6.

Листинг 6. Добавление кода для сохранения JPEG-копии исходного изображения
#!/usr/bin/python

from gimpfu import *

def plugin_main(timg, tdrawable, maxh=500, maxw=500, savecopy=TRUE):

    currentWidth = tdrawable.width
    currentHeight = tdrawable.height

    newWidth = currentWidth
    newHeight = currentHeight

    if (maxw > newWidth):
        newWidth = maxw
        newHeight = (float(currentHeight) / (float(currentWidth) / newWidth))

    if (maxh > newHeight):
        newHeight = maxh
        newWidth = (float(currentWidth) / (float(currentHeight) / newHeight))

    pdb.gimp_image_scale(timg, newWidth, newHeight)
 
    if savecopy:
        pdb.file_jpeg_save(timg, tdrawable, timg.name+".jpg", timg.name+".jpg", 
                           0.9, 0, 0, 0, "", 0, 0, 0, 0)

register(
        "python_fu_resize",
        "Saves the image at a maximum width and height",
        "Saves the image at a maximum width and height",
        "Nathan A. Good",
        "Nathan A. Good",
        "2010",
        "<Image>/Image/Resize to max...",
        "RGB*, GRAY*",
        [
                (PF_INT, "max_width", "Maximum Width", 500),
                (PF_INT, "max_height", "Maximum Height", 500),
                (PF_BOOL, "copy", "Make a JPEG copy", TRUE),
        ],
        [],
        plugin_main)

main()

Имя нужного метода можно получить из базы данных процедур (переменная PDB) с помощью пункта меню Help > Procedure Browser, как показано на рисунке 6.

Рисунок 6. Поиск метода для сохранения файлов JPEG в браузере процедур
Поиск метода для сохранения файлов JPEG в браузере процедур

Константы, используемые для типов входных параметров, берутся из библиотеки gimpfu. Список доступных констант можно получить, введя команды, показанные в листинге 7, с консоли Python в GIMP или Eclipse.

Листинг 7. Получение справки по константам gimpfu
import gimpfu help(gimpfu)

Константы начинаются с PF_ и определяют типы, которые можно использовать для элементов управления формы ввода.


Запуск отредактированного сценария плагина

После того как в сценарий Python добавлен новый код для сохранения изображений в формате JPEG, можно запустить плагин, открыв изображение в GIMP и воспользовавшись пунктом меню Image > Resize to max. Вы увидите обновленное окно ввода параметров, как показано на рисунке 7.

Рисунок 7. Обновленное окно ввода параметров
Обновленное окно ввода параметров 'Make a JPEG copy'

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


Запуск обеих операций для всей папки

У GIMP есть неинтерактивный пакетный режим, который позволяет вызывать команды GIMP из командной строки. Функцию командной строки можно применить для работы со всеми изображениями в папке, используя стандартные шаблоны.

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

Листинг 8. Использование неинтерактивного пакетного режима GIMP для сохранения изображений
gimp -i -b '(file-jpeg-save "Menu_006.png" 200 200 TRUE)' -b '(gimp-quit 0)'

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

Теперь, когда плагин работает и зарегистрирован в GIMP, у него есть собственная команда в базе данных процедур GIMP. Ее можно найти в браузере процедур (Help > Procedure Browser в GIMP) и ввести имя, присвоенное плагину. Например, если в методе register вы назвали его python_fu_resize, как показано в листинге 6, то и в браузере процедур GIMP он будет фигурировать под именем python-fu-resize. Вызовите эту команду, как она представлена в браузере процедур GIMP, из командной строки с помощью команды gimp и флагов -i -b, как показано в листинге 9.

Листинг 9. Вызов плагина в неинтерактивном пакетном режиме GIMP
gimp -i -b '(python-fu-resize "myimage.png" 200 200 TRUE)' -b '(gimp-quit 0)'

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

Команда, показанная в листинге 10, применяет новый плагин ко всем изображениям Portable Network Graphics (PNG), содержащимся в папке.

Листинг 10. Вызов плагина в GIMP для всех изображений в папке
gimp -i -b '(python-fu-resize "*.png" 200 200 TRUE)' -b '(gimp-quit 0)'

Заключение

Python ― это объектно-ориентированный язык сценариев, который позволяет писать сценарии, исполняемые на разных платформах. У языка сценариев Python обширная инструментальная поддержка ― от простой подсветки синтаксиса в текстовых редакторах до плагинов Eclipse.

GIMP ― это приложение, которое обеспечивает широкие возможности по редактированию графических файлов на разных платформах. GIMP поддерживает плагины, которые можно использовать для автоматизации самых сложных задач с помощью сценариев. Так как GIMP поддерживает в плагинах сценарии Python, этот язык можно использовать для расширения GIMP. В неинтерактивном пакетном режиме плагины можно вызывать из командной строки методом, подходящим для создания сценариев.

Ресурсы

Научиться

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

  • Интерпретатор Python, который позволяет запускать сценарии Python на имеющемся компьютере.
  • Основы разработки кода Python в IDE: Eclipse IDE.
  • Плагин PyDev для Eclipse, позволяющий программировать на Python в Eclipse IDE.
  • GIMP, программа с открытым исходным кодом для работы с изображениями.

Комментарии

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=758017
ArticleTitle=Использование языка Python для написания GIMP-плагинов
publish-date=09162011