Podstawy GIMP Python (Python-Fu)
Tutorial
Opracowanie: Ziomioslaw
Poziom trudności: łatwy
GIMP od dłuższego czasu wspiera język Python. Pozwala to na pisanie pluginów w tym właśnie języku. Wspierał go oczywiście od dość dawna. Wspieranych jest też bardzo wiele innych języków. Ale od jakiegoś czasu Python jest instalowany wraz z GIMP-em nawet podczas instalacji na Windowsie. Co sprawia, że pythonowy plugin będzie mógł być instalowany nawet przez osoby, które nie mają wielkiej wiedzy technicznej (o ile znają Python).
Poniższy tutorial jest krótkim opisem co trzeba zrobić, żeby zacząć swoją przygodę z Python-Fu: o tym gdzie i co należy umieścić, a także jak wywołać nasz plugin.
Tutorial napisany w wersji GIMP 2.8. W innych wersjach nazwy narzędzi i pojęć mogą się różnić.
Python-Fu plugin a Script-Fu skryptBędę w tym tekście używać naprzemiennie słów
plugin i
skrypt. Wynika to z tego, że cokolwiek nie pisze się w języku Python, określa się to zwykle mianem
skryptu. Jednak te pythonowe skrypty, pełnią rolę
pluginów w GIMP-ie. Siedzą sobie w innym katalogu, nieco inaczej GIMP je traktuje, ale najważniejsze z naszego punktu widzenia:
GIMP, nie ogranicza możliwości interpretera Python, a jedynie rozszerza jego możliwości o obsługę programu GIMP (w przypadku Script-Fu i języka Scheme, można jedynie wywoływać procedury z pewnej puli). Co oznacza, że jeśli marzy się Wam jakiś skrypt, który np. pobiera jakieś dane z Internetu w czasie swojej pracy, analizuje pliki z dysku, albo zagląda do jakiejś bazy danych... nic nie stoi na przeszkodzie aby to zakodować. Python-Fu ma też jeszcze jedna przewagę nad Script-Fu: ma dostęp do większej liczby funkcji programu GIMP.
Wstępne przygotowaniaAby przystąpić do pisania tutorialu:
- musisz mieć edytor tekstu
- musisz mieć zainstalowanego GIMP-a
- musisz mieć zainstalowany Python
- GIMP musi umieć używać Python
- musisz znać język Python
Ten tutorial nie uczy:
- jak się instaluje GIMP-a
- jak się instaluje Python
- jak się pisze w
Pythonie Od tego są inne poradniki. Co do ostatniego punktu, jeśli umiesz opisać ładnie co chcesz uzyskać (najlepiej jako konkretna lista kroków), być może pomoże Ci ktoś w dziale:
Pomocna dłoń - GIMP Podstawy podstawPluginy napisane w Pythonie, to po prostu pliki tekstowe, umieszczone w odpowiednim katalogu. Zazwyczaj myślimy o "plug-ins", w katalogu GIMP-a użytkownika:
Linux: ~/.gimp-2.8/plug-ins/
Windows: %USERPROFILE%\.gimp-2.8\plug-ins\
Można też plugin zainstalować "globalnie" (dostępny będzie dla wszystkich użytkowników), szerzej o tym w artykule [ulr=https://en.wikibooks.org/wiki/GIMP/Installing_Plugins]GIMP/Installing Plugins[/url].
Uwaga: na systemach unix-owych, należy nadać tym plikom prawo do uruchamiania jako program. Inaczej GIMP będzie takie pliki "ignorował" (tak jakby ich tam nie było).
Dlaczego nie piszesz o konsoli Python-Fu?Wiele tutoriali na początek wysyła początkującego do konsoli (
Filtry-> Python-> Console...).
Jest to bardzo przydatne narzędzie, ale raczej bardziej zaawansowane niż poruszane tutaj zagadnienia.
Jeśli chcesz czegoś dowiedzieć się o konsoli zajrzyj na stronę
10.5. The "Python-Fu" Submenu Sposób wywołaniaJeśli Python ma jakąś wadę, to jest nią
niemożliwość zostania wywołanym, bez załadowanego obrazka (lub utworzonego). Już tłumaczę: kiedy uruchomisz GIMP-a i akurat nic nie będzie otwarte, wszystkie funkcje zapewniane przez pluginy Python-Fu, będą wyszarzone i nieaktywne. Podobnie zresztą jak np.: filtry i wszystko, co pracuje na płótnie i wybranej warstwie.
Można pomyśleć, że jest to zaleta. W pewien sposób i owszem, ale np. ten wyszydzany Script-Fu pozwala, na to, aby skrypt sam mógł utworzyć sobie obrazek - korzystają z tego choćby i te generujące loga (patrz:
Plik -> Utwórz -> Logo). Choć Python-Fu również mógłby generować nowe obrazy, tak oddanie tej możliwości, aby można było sobie go od tak wybrać z menu, nie da się (przynajmniej prosto) zaprogramować.
No chyba, że wywołamy nasz skrypt z tzw. trybu wsadowego (tego określenia używają chyba wyłącznie nauczyciele informatyki) - czyli konsoli jak kto woli. O czym napiszę niżej.
Hello worldA więc chcemy napisać plugin. Wiemy już gdzie go umieścić.
Weźmy taki oto przykład (znaczenie parametrów metody register nie będę wyjaśniał, ale informację na ten temat można znaleźć na stronie:
GIMP Python Documentation).
#!/usr/bin/env python
from gimpfu import *
def helloWorld(img, drawable):
gimp.message("Hej z gimpuj.info!")
register(
"python-fu-hello-world",
"Hello World",
"Simple hello world",
"Ziomioslaw",
"Ziomioslaw&Co",
"2015",
"<Image>/Filters/Hello World",
"*",
[],
[],
helloWorld)
main()
Zrestartuj GIMP-a. Po umieszczeniu gdzie trzeba (i nadaniu mu uprawień) można próbować uruchomić powyższe.
Zgodnie z ustawieniami nasz plugin został podpięty na przycisk, który pojawi się na samym dole menu Filtry. Jest jednak nieaktywny (jak wspomniałem w jednym z poprzednich podrozdziałów). Utwórz nową pracę, dowolne ustawienia. Teraz możemy użyć naszego pluginu.
Wyświetli on komunikat. W zależności od ustawień i wersji GIMP-a może to być np. okienko z komunikatem, albo tekst na dole ekranu, obok powiększenia płótna. Tak czy siak, powinno tam wyświetlić się "Hej z gimpuj.info!".
Aktualizacja skryptuKrótko teraz o zmianach w kodzie: o ile nie zmieniasz zawartości funkcji "register", to zmiany w pliku ze skryptem będą odzwierciedlane w jego działaniu. Każda zmiana wywołania funkcji register, dodanie nowego pliku w katalogu plug-ins, wymaga restartu GIMP-a (to najprostszy sposób na ich odświeżenie).
Uruchamiając w konsoliKażdy plugin można też wywołać w tzn. trybie wsadowym (batch mode). Może wydawać się zbędne, ale takie pluginy wywoływane są dużo szybciej (a jeszcze można np. nie ładować czcionek, czy pędzli) i niewymagane jest klikanie. Z punktu widzenia programisty, który co chwila uruchamiania GIMP-a, aby sprawdzić małą zmianę, to fajna sprawa. No i każdy błąd jest wyświetlany w tejże konsoli.
Nieco zmodyfikujmy nasz przykładowy skrypt:
#!/usr/bin/env python
from gimpfu import *
def helloWorldConsole():
print "Hej z gimpuj.info!"
register(
"python-fu-hello-world-console",
"Hello World",
"Simple hello world in console",
"Ziomioslaw",
"Ziomioslaw&Co",
"2015",
"",
"*",
[],
[],
helloWorldConsole)
main()
Można wywołać nasz plugin za pomocą poniższego polecenia:
gimp --no-interface --batch '(python-fu-hello-world-console RUN-NONINTERACTIVE)(gimp-quit FALSE)'
Jak widać uruchamia ono GIMP-a w trybie bez interface'u (zupełnie nie ma GUI). Potem za pomocą Script-Fu wywoływany jest plugin zarejestrowany jako "python-fu-hello-world-console" (to nasz!). Potem po jego uruchomieniu, należy GIMP-a zamknąć - polecenie gimp-quit (inaczej będzie ciągle działał w tle).
Można zapytać co to za parametr RUN-NONINTERACTIVE? Jak sama jego nazwa wskazuje, pozwala uruchomić plugin bez interface'u. Tyle, że jako uruchamiany GIMP bez interface'u użytkownika i tak jego wartość zostanie zignorowana:) Można tam podstawić też wartość liczbową (1), jednak nie można go pominąć - jest obowiązkowy.
Parametr "--no-inferface" można skrócić do "-i". A "--batch" do "-b". Jest jeszcze kilka ciekawych parametrów do programu GIMP. Np. ten który sprawia, że program pominie ładowanie czcionek, lub pędzli. Więcej na ten temat: "gimp --help" (lub "gimp -h").
Uruchamiając zaawansowanie w konsoliJeśli ktoś bardzo się brzydzi tego Script-Fu, można pisać także wsadowe polecenia do GIMP-a w Python:
gimp --batch-interpreter python-fu-eval -ib "pdb.python_fu_hello_world_console(); pdb.gimp_quit(0);"
Jak widać pojawił się nowy parametr "--batch-interpreter". Pozwala on podać wartość "python-fu-eval", czyli nazwę funkcji, która będzie tłumaczyć nasze komendy. Jest to parametr obowiązkowy, jeśli chcemy pisać polecenia w języku Python.
Warto zauważyć, że sposób wywoływania pluginów się zmienił: są one metodami obiektu "pdb" (modułu jak kto woli). Zauważcie, że znaki minus ("-") zostały zamienione na podkreślenie ("_"). Podobnie z metodą "gimp-quit".
Uruchamianie kodu Python bez instalacji (bez rejestracji)Oczywiście, jeśli się uprzeć, można wprowadzić cały nasz kod przez parametry w konsoli. Jest dość niewygodne, więc może lepiej użyć poniższego, nie wymagającego instalacji pluginu sposobu. Przekierowujemy plik (tutaj o nazwie "gimpuj.info") ze skryptem do programu GIMP-a, wywołanego z odpowiednimi parametrami:
gimp --no-interface --batch-interpreter python-fu-eval --batch - < gimpuj.py
Tu po parametrze "--batch" jest znak minus, bez niego nie zadziała (ale można "--batch" zastąpić "-b").
Jeszcze innym, choć podobnym sposobem, jest zlecenie GIMP-owi wykonanie z kodem w języku Python:
gimp -i --batch-interpreter python-fu-eval -b execfile(\'gimpuj.py\') -b pdb.gimp_quit(1)
Jak wskazuje tytuł tego podrozdziału, nie trzeba tutaj rejestrować procedur (i używać funkcji register). GIMP, wykona wszystkie instrukcje jedna po drugiej, jak zwykły interpreter Python.
Uruchamianie pluginów wymagających otwartego pliku z konsoliGdzieniegdzie w Internecie można znaleźć, że wystarczy podać nazwę pliku jaki pierwszy parametr do każdej procedury, która wymaga obrazka (IMAGE) i warstwy (DARWABLE). Nie udało mi się tego wywołać. Co więcej oficjalna strona z pomocą GIMP-a podaje raczej okrężne rozwiązanie niż takie wygodne.
Aby wywołać plugin, bazujący na otwartym obrazku. Należy otworzyć jakiś plik i pobrać z niego pierwszą warstwę. Najłatwiej to zrobić za pomocą Python-Fu:
gimp --batch-interpreter python-fu-eval -ib "img = pdb.gimp_file_load('wilber.png', 'wilber.png'); pdb.python_fu_hello_world(img, img.active_layer); pdb.gimp_quit(0);"
Jak widać: otwieramy obrazek za pomocą funkcji pdb.gimp_file_load, w którym podajemy nazwę pliku (dwa razy: pierwsza to prawidłowa, pełna ścieżka, a druga jest czymś, co mógłby podać użytkownik). Wynik jej działania zapisujemy do zmiennej "img" i pobieramy z niej aktywną warstwę (przez "active_layer").
Jeśli nie chcemy wywoływać interpretera Python, trzeba użyć Script-Fu:
gimp --no-interface --batch '(let* ((image (car (gimp-file-load RUN-NONINTERACTIVE "wilber.png" "wilber.png"))) (drawable (car (gimp-image-get-active-layer image))))(python-fu-hello-world RUN-NONINTERACTIVE image drawable)(gimp-quit FALSE))'
To wbrew pozorom realizuje dokładnie to samo co poprzednie wywołanie. Teraz przynajmniej widać, czemu ludzie preferują Python nad Scheme.
PodsumowaniePoczątki są najtrudniejsze, mam nadzieję, ze nieco ułatwiłem te z Python-Fu. Dla chcących wiedzieć więcej, linki: