Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?


Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Strony: [1]
DrukujPobierz PDF
Autor Wątek: Podstawy GIMP Python (Python-Fu)  (Przeczytany 5382 razy)
0 użytkowników i 1 Gość przegląda ten wątek.
Ziomioslaw
Administrator

Reputacja: 46 Offline Offline

Płeć: Mężczyzna
GIMP: 2.10
JID: ziomioslaw@jabber.org
Licencja: Copyright
Wiadomości: 7 331
Galeria Użytkownika


Cyklista Apokalipsy


Zobacz profil
« : 18.10.2015, 09:25:44 »

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ć.



Lime Point Python-Fu plugin a Script-Fu skrypt

Bę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.

Lime Point Wstępne przygotowania

Aby 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

Lime Point Podstawy podstaw

Pluginy napisane w Pythonie, to po prostu pliki tekstowe, umieszczone w odpowiednim katalogu. Zazwyczaj myślimy o "plug-ins", w katalogu GIMP-a użytkownika:

Kod:
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).

Lime Point 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

Lime Point Sposób wywołania

Jeś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.

Lime Point Hello world

A 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).

Kod:
#!/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!".

Lime Point Aktualizacja skryptu

Kró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).

Lime Point Uruchamiając w konsoli

Każ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:

Kod:
#!/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:

Kod:
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").

Lime Point Uruchamiając zaawansowanie w konsoli

Jeśli ktoś bardzo się brzydzi tego Script-Fu, można pisać także wsadowe polecenia do GIMP-a w Python:

Kod:
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".

Lime Point 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:

Kod:
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:

Kod:
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.

Lime Point Uruchamianie pluginów wymagających otwartego pliku z konsoli

Gdzieniegdzie 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:

Kod:
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:

Kod:
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.

Lime Point Podsumowanie

Początki są najtrudniejsze, mam nadzieję, ze nieco ułatwiłem te z Python-Fu. Dla chcących wiedzieć więcej, linki:

« Ostatnia zmiana: 18.10.2015, 10:12:12 wysłane przez Ziomioslaw » Zapisane
Strony: [1]
DrukujPobierz PDF
Polskie Forum Użytkowników GIMP-aTutorialePropozycje i prośby o tutorialeFabryka tutoriali (Moderator: davlasq)Wątek: Podstawy GIMP Python (Python-Fu)
Skocz do: