GIMP и Perl


О чем собственно речь?

Разумеется не секрет, что в GIMP есть встроенный интерпретатор языка Scheme (диалект LISP), есть libgimp для доступа к API редактора. Добрая половина эффектов и фильтров в GIMP - самые настоящие plug-in'ы. Но изучать LISP не хочется, libgimp и C API - совсем грустно. А надо-то что-то совсем простое, например добавить в менюшку новую команду или скриптом обработать каталог с фотками. Как поступить?

В GIMP есть возможность делать это все на Perl и об этом - сегодняшний рассказ. Несмотря на то, что GIMP 2 существует достаточно давно, мой рассказ про GIMP 1.2.

   NB!  Рассказ про GIMP 2 можно почитать здесь.

Сборка и настройка

Сперва нужно установить необходимые Perl модули. Нам понадобятся:

Для последнего нужны библиотеки GTK и GNOME (проверьте наличие файла gtk-xmhtml.h в include/).

Для сборки модулей распаковываем скачанные архивы и далее (пример для XML::Writer):

[/tmp/XML-Writer-0.603]# perl ./Makefile.PL
[/tmp/XML-Writer-0.603]# make
[/tmp/XML-Writer-0.603]# make install

Cи-шная часть.
Если в планах печать на принтере, собираем gimp-print. Нам нужна версия 4.2, которую качаем отсюда.
Собираем:

[/tmp]# tar zxvf gimp-print-4.2.7.tar.gz
[/tmp]# cd gimp-print-4.2.7
[/tmp/gimp-print-4.2.7]# ./configure
[/tmp/gimp-print-4.2.7]# make
[/tmp/gimp-print-4.2.7]# make install

Качаем GIMP отсюда, собираем (мне нравится установка в отдельный каталог /usr/local/gimp):

[/tmp]# bzip2 -dc gimp-1.2.5.tar.bz2 | tar zxvf -
[/tmp]# cd gimp-1.2.5
[/tmp/gimp-1.2.5]# ./configure --disable-nls --prefix=/usr/local/gimp 
[/tmp/gimp-1.2.5]# make
[/tmp/gimp-1.2.5]# make install

Если gimp-print не установлен, при запуске configure добавляем ключик --disable-print

Запускаем GIMP от обычного пользователя (не root)

> /usr/local/gimp/bin/gimp

Теперь в меню Xtns видим:

Все готово для скриптописания.
Собственно скрипты могут быть самостоятельными программами, или же plug-in'ами, которые запускаются внутри GIMP.
И то и другое в принципе схоже, ниже чуть подробнее.

Скрипты

Их удобно использовать для автоматизации чего-либо, ну например есть каталог с кучей PNG и нужно нам:

  • уменьшить их в 3 раза
  • выровнять контраст
  • за'sharp'ить на 30%
  • и, естественно, сохранить результат

Скелет такого скрипта выглядит примерно так:

use strict;
use Cwd;
use Gimp qw(:auto);

Gimp::on_net {
...
тут выполняются наши операции над файлами
...
};
exit main();

Заполняем Gimp::on_net{}:

Gimp::on_net {
  my $dir = cwd;
  while ($_=shift(@ARGV)) {  # разбираем все файлы из ком. строки
    chomp; s|\./||;
    my $raw = $_ ;
    my $file = $dir . '/' . $_ ;

    print "Processing $file\n";

    my $img = gimp_file_load ($file, $raw);  # грузим картинку в GIMP
    $img->undo_disable;  # undo не нужно  

    my $h = $img->height;  # определяем размеры
    my $w = $img->width;

    my $scale = 0.33;  # теперь уменьшаем в 3 раза
    $img->scale (int($scale * $w),int($scale * $h));

    my $alayer=$img->get_active_layer();  # layer, с которым будем работать
    $img->c_astretch($alayer);  # выравниваем контраст
    $alayer->sharpen (30);  # 30% usharp mask
 
    $alayer->file_png_save( "$file", "$raw", 0, 9, 0, 0, 0, 0, 0);  # записываем результаты 
    $img->delete;  # освобождаем память
  }
};

Все полностью.
В GIMP выбираем из меню Xtns->Perl->Server. В консоли, из которой он был запущен, видим:

1150186019: server version 1.211 started
1150186019: accepting connections on /tmp/gimp-perl-serv-uid-500/gimp-perl-serv

Теперь можно запускать perl'овку:

> perl ./script1.plx fotka1.png fotka2.png

Все файлы будут последовательно обработаны. Если нужно обработать много файлов, то GIMP и скрипты можно запустить в отдельном Xnest, тогда progress-bars и прочая ерунда не будет замусоривать экран.

Plug'in'ы

Эта категория, как я уже говорил запускается внутри GIMP.
В качестве примера - автоматизация Crop с записью выделенного участка в тот же файл.
Скелет:

use strict;
use Gimp ":auto";
use Gimp::Fu;

sub crop_save_close {
...
тут собственно вся логика  
...
}

register
    "crop_save_close",   # имя Plig-in'а
    "Crop save close",   # короткое описание
    "No help yet",       # help
    "Alexey Semenoff",   # автор, (c) и дата
    "Alexey Semenoff (c) 2006",
    "2006-09-07",
    "<Image>/Crop-Save", # позиция в менюшнице 
    "*",                 # какие типы картинок, у нас - все
    [
    ],
    \&crop_save_close;   # регистрируем наше творение

exit main();

Этот же скрипт полностью.
Не комментирую, потому как все должно быть понятно из первого примера.
Далее устанавливаем наш plug-in:

> cp crop-save-close ~/.gimp-1.2/plug-ins/
> chmod 755 ~/.gimp-1.2/plug-ins/crop-save-close
Запускаем GIMP, открываем какой-нибудь файл. Выделяем кусок, который хотим сохранить.
Правой кнопкой мыши выбираем Crop-Save из меню:

Все работает и именно как и задумывалось!

Двигаться дальше

Для полноценной работы под рукой есть неплохая дока по API. В GIMP открываем Xtns->PDB Explorer. Например для получения справки для работы с файлами набираем gimp_file и жмем <Enter>, затем выбираем интересующее, например 'gimp_file_load' :

Наши plug-in'ы тоже экспортируют функции (с префиксом 'perl_fu_') и их тоже можно просмотреть из PDB Explorer'a:

В заключение ссылки по теме:

Tags: gimp photo editors perl


Назад в оглавление



[Home] [TTL] [Unix] [Sdictionary] [ROW Programmer] [Symbian] [Misc] [News] [Search] [Contacts] [Guestbook]


Copyright (c) 1999-2017 Alexey Semenoff