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
Назад в оглавление
|