GIMP/Programowanie

Opracowane na podstawie GIMP 2.6.8 wersja polska /linux

Architektura gimpa

edytuj
 
Architektura Gimpa

W gimpie możemy wyróżnić (z punktu widzenie programisty) 3 główne składniki:

  • jądro (ang. core)
  • bazę procedur: PDB (ang. Procedural database)[1]
  • wtyczki, rozszerzenia i skrypty

Wtyczka wpływa na działanie gimpa poprzez PDB[2]

Dokładna architektura jest bardziej skomplikowana[3]

  • GIMP Library (libgimp) Reference Manual[4]
  • GEGL[5]

Wtyczki (ang. plugin), rozszerzenia, skrypty

edytuj

Gimp jest dużym programem. Ma ponad 600 000 linii kodu w około 2 600 plikach.[6] Łatwiej dodać nową funkcję poprzez napisanie wtyczki, niż poprzez modyfikację kodu.[7] Wiele wartościowych wtyczek ma 100-200 linii kodu (np. w C)[8]

Dodatkowe funkcje w gimpie można realizować poprzez:

  • wtyczki (ang. plugin): osobny proces wywoływany przez rdzeń gimpa, kod źródłowy wymaga kompilacji, zmieniają obrazy
  • rozszerzenia (ang. extension): osobny proces, kod źródłowy wymaga kompilacji, nie zmieniają obrazów
  • skrypty (ang. script): nie wymaga kompilacji, zmienia obraz


Działanie wtyczek można sprawdzić za pomocą funkcji GIMP_PLUGIN_DEBUG[9]

Porównanie skryptów Gimpa i Photoshopa

edytuj

Skrypty GIMP są podobne do Photoshop "Actions" w tym że mogą automatyzować powtarzalne czynności ale różnią się w kilku szczegółach:

  • Photoshop actions mogą być nagrywane przez użytkownika, skrypty GIMP-a nie .
  • Photoshop actions są zawsze w tym samym miejscu i są wyraźnie oznaczone jako actions.
  • Skrypty GIMP mogą być umieszczone w dowolnym miejscu i mogą być wyświetlane tak, jakby były nową funkcją.
  • Photoshop actions używają bezwzględnych wartości (np. zaznacz 2000 x 3000 pikseli, niezależnie od tego jak duży jest obraz)
  • Skrypty GIMP mogą obliczać zmienne oparte na atrybutach obrazu. (np. zacznij na 1/3 wzdłuż obrazu i zaznacz drugą trzecią)
  • Skrypty GIMP mogą sprawdzać atrybuty obrazu i zatrzymać lub wyświetlać komunikaty gdy pewne warunki są lub nie są spełnione.

Podsumowując tworzenie skryptów GIMP-a jest bardziej złożone niż PS actions ale jednocześnie mają one większe możliwości i są bardziej elastyczne.[10]

Ostrzeżenie

edytuj
 
  • Uwaga: wtyczki mogą bardzo dużo (np. udostępnić twój system dla innych osób bez twojej wiedzy) dlatego instaluj tylko wtyczki z zaufanego źródła
  • wtyczki mogą nie działać w innej wersji gimpa niż tej dla której zostały utworzone. Dokumentacji nie ma (jest przestarzała). Informacji trzeba szukać w kodzie źródłowym (po angielsku)

Źródła

edytuj

Szukaj w

  • rejestrze wtyczek [11]
  • przykłady René Nyffeneggera [12]

Podział dodatków

edytuj

Dodatki możemy podzielić wg:

  • języka programowania w którym zostały napisane
  • kompilacji
    • skompilowane czyli wtyczki lub rozszerzenia
    • nieskompilowane czyli skrypty
  • złożoności wtyczki
    • jeden plik
    • wiele plików (osobny katalog)
  • operujące:
    • globalnie (nie związane z konkretnym obrazem)
    • operujące na konkretnym obrazie

Języki programowanie

edytuj

Dodatki mogą być w:

  • c (skompilowane , czyli wtyczki) [13]
  • perl (nieskompilowane, czyli skrypty, nie jest instalowany domyślnie)[14][15][16]
  • python (rozszerzenie py, mimo że są to skrypty to wymagają kompilacji)[17]
  • scheme (nieskompilowane, czyli skrypty) rozszerzenie scm dla Script-Fu [18][19]
  • Tcl (nieskompilowane, czyli skrypty, nie jest instalowany domyślnie)

Scheme

edytuj

Scheme jest to język programowanie (odmiana Lispa). W gimpie jest jednym z 2 głównych języków skryptowym (domyślnie instalowanych). Wersje:

  • TinyScheme jest to wersja języka Scheme zgodna ze standardem R5RS. Tak jest od wersji 2.4 Gimpa,
  • SIOD [20]

Script-Fu jest to wtyczka do gimpa pozwalająca uruchamiać skrypty w TinyScheme [21]

Jest to również języki makr (ang. macro language) oparty na Scheme.

Funkcje:

  • script-fu-register
  • script-fu-menu-register

są zdefiniowane w procedurze ts_init_procedures() w pliku plug-ins/script-fu/scheme-wrapper.c Dzięki temu plikowi skrypty mogą być używane w obrębie Gimpa.

Interpretator Skryptów (ang. Script Interpreter) który parsuje i uruchamia kod w Scheme jest to TinyScheme składnik wtyczki Script-Fu. Jest on zlokalizowany w katalogu tinyscheme: plug-ins/script-fu.



Konsola

edytuj

Możesz otworzyć konsolę za pomocą menu głównego: Menu/Filtry/Script-Fu/Konsola

Witamy w TinyScheme
Copyright (c) Dimitrios Souflis
Konsola Script-Fu - Rozwój interaktywny schematu

Teraz można wprowadzać polecenia w języku Scheme, a dokładniej w jego odmianie TinyScheme.

Na przykład dodać 3 i 5:

(+ 3 5)

lub pozdrowić świat:

(gimp-message "Hello World")

utworzyć nowy obraz:[22]

(define width 256)
(define height 384)
(define image (car (gimp-image-new width height 0)))

utworzyć nową warstwę:

(define layer (car (gimp-layer-new image width height 0 "Layer" 100 0)))

dodać warstwę do obrazu:

(gimp-image-add-layer image layer 0)

wyświetlić nowy obraz:

(gimp-display-new image)

wyczyścić obraz na kilka sposobów:

(gimp-selection-all image)     ; Select everything
(gimp-edit-clear layer)        ; Do "Clear" from the "Edit" menu
(gimp-selection-none image)    ; Select nothing

wybrać kolory:

(gimp-palette-set-background  (list 255 255 255)) ; białe tło
(gimp-palette-set-foreground (list 0 0 255)); 

wybrać pędzel:

(gimp-brushes-set-brush "Circle (03)")

wyświetlić obraz:

(gimp-display-new image)






Tutaj możesz również sprawdzić działanie skryptu.

Katalog

edytuj

Linux: Twoje skrypty są zapisane w twoim lokalnym katalogu skryptów:

~/.gimp-2.8/scripts/

lub ogólniej:

~/.gimp-[Numer wersji]/scripts/

albo w katalogu globalnym:

/usr/share/gimp/2.0/scripts


Windows: User:

C:\user\<username>\.gimp-2.8\scripts

Global:

C:\Program Files\GIMP 2\share\gimp\2.0\scripts

Tworzenie

edytuj

Etapy tworzenia:

  • utworzenie pliku z rozszerzeniem scm i odpowiednią zawartością
  • zapisanie pliku w odpowiednim katalogu
  • zarejestrować skrypt w gimpie


Nazwa skryptu

edytuj

Nazwa skryptu powinna być:

script-fu-nazwa

ponieważ wtedy będzie dobrze widoczny w liście procedur [23]

Zawartość skryptu

edytuj

Wzorce skryptu:

(define (script-fu-demo image
			drawable)
		1)

(script-fu-register "script-fu-demo"
		    "_Demo..."
		    "Demo Plugin."
		    "John Kawakami "
		    "John Kawakami"
		    "8/28/2006"
		    "RGB*"
		    SF-IMAGE       "Image"          0
		    SF-DRAWABLE    "Drawable"       0)

(script-fu-menu-register "script-fu-demo"
			 _"/Script-Fu/Demo")

Każdy skrypt musi zawierać:[25]

  • definicję głównej funkcji (opisującej jego działanie)
  • wywołanie 2 funkcji (w celu rejestracji skryptu w gimpie): script-fu-register i script-fu-menu-register


Każdy skrypt może zawierać:

  • wywołanie innego skryptu
  • wywołanie innej wtyczki


Definicje funkcji
edytuj

Opis funkcji script-fu-register: [26]

(script-fu-register     name_of_function
                         menu_label ; pass just the menu label in script-fu-register
                         description
                         author
                         copyright
                         date
                         images_applyable
                        [parameter [parameter...]]

)

parameter

SF-TYPE "description" "default value"

SF-TYPE

    * SF-VALUE
    * SF-STRING
    * SF-FONT
    * SF-COLOR
    * SF-TOGGLE
    * SF-FILENAME
    * SF-PATTERN
    * SF-GRADIENT
    * SF-IMAGE
      together with SF-DRAWABLE
    * SF-DRAWABLE
      together with SF-IMAGE
    * SF-ADJUSTMENT 





Dodawanie pozycji w menu:

Za pomocą funkcji script-fu-register dodajemy tylko etykietę menu [27]

(script-fu-register "script-fu-xach-effect"
  _"_Xach-Effect..."   ; pass just the menu label in script-fu-register
  _"Add a subtle translucent 3D effect to the selected region (or alpha)"
  "Adrian Likins <adrian@gimp.org>"
  "Adrian Likins"
  "9/28/97"
  "RGB* GRAY*"
  SF-IMAGE       "Image"                   0
  SF-DRAWABLE    "Drawable"                0
  SF-ADJUSTMENT _"Highlight X offset"      '(-1 -100 100 1 10 0 1)
  SF-ADJUSTMENT _"Highlight Y offset"      '(-1 -100 100 1 10 0 1)
  SF-COLOR      _"Highlight color"         "white"
  SF-ADJUSTMENT _"Highlight opacity"       '(66 0 255 1 10 0 0)
  SF-COLOR      _"Drop shadow color"       "black"
  SF-ADJUSTMENT _"Drop shadow opacity"     '(100 0 100 1 10 0 0)
  SF-ADJUSTMENT _"Drop shadow blur radius" '(12 0 255 1 10 0 1)
  SF-ADJUSTMENT _"Drop shadow X offset"    '(5 0 255 1 10 0 1)
  SF-ADJUSTMENT _"Drop shadow Y offset"    '(5 0 255 1 10 0 1)
  SF-TOGGLE     _"Keep selection"          TRUE
)

Za pomocą funkcji script-fu-menu-register dodajemy pozycję menu (ang. menu-item) w postaci łańcucha zawierającego pełną ścieżkę i zaczynającego się od:

  • <Image> dla menu lokalnego obrazu (otwieranego prawym przyciskiem myszy
  • <Toolbox>/Xtns/ dla menu głównego:[28][29]
(script-fu-menu-register "script-fu-xach-effect"
                         "<Image>/Filters/Light and Shadow/Shadow") 
; nowa pozycja w menu głównym (wersja ang)
; script which works on an already existing image
; the script will be available through the gimp menu that is launched by the right mouse button over an image: the popup image menu
; Such script must also have as their first and second argument a SF-IMAGE and a SF-DRAWABLE.

inny przykład:[30]

(script-fu-menu-register "uni-img" 
                         "<Toolbox>/Xtns/Script-Fu/Tutorials") 
 ; to create a new image that is independant of earlier images, then the script will be available                                                            
 ; through   the gimp menu that is launched by the right mouse button over an image
 ; Such script must also have as their first and second argument a SF-IMAGE and a SF-DRAWABLE.

Rejestracja skryptu

edytuj
  • za pomocą menu: Menu/Filtry/Scipt-Fu/Odśwież skrypty
  • automatycznie przy starcie gimpa

Możemy to sprawdzić za pomocą przeglądarki skryptów wywołanej z menu: Menu/Pomoc/Przeglądarka wtyczek

Uruchomienie skryptu

edytuj

Skrypt możesz uruchomić:

  • za pomocą menu głównego lub podręcznego (jeśli tworzy własną pozycję w menu)
  • z linii poleceń korzystając z trybu wsadowego gimpa [31]
  • z innego skryptu[32]

Python

edytuj

Dokumentacja [33]

Konsola

edytuj

Możesz otworzyć konsolę za pomocą menu głównego: Menu/Filtry/Python-Fu/Console

GIMP 2.6.8 Python Console
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3]
>>> 

Teraz można wprowadzać polecenia w języku Python.


Przykłady

edytuj

Jak utworzyć pierwszą wtyczkę w c [35][36][37]

Zapisujemy w lokalnym (prywatnym) katalogu wtyczek:

~/.gimp-2.6/plug-ins

lub ogólniej:

~/.gimp-[Numer wersji]/plug-ins/


Kompilujemy:

gimptool --install plugin.c 

lub

gimptool --install-admin plugin.c


Przykładowy wtyczek:

Odnośniki

edytuj
  1. pdbgen source
  2. How to write a GIMP plug-in Written By Dave Neary
  3. Earl Oliver, Jaime Ruiz, Steven She, and Jun Wang, The Software Architecture of the GIMP, December 2006.
  4. GIMP Library Reference Manual for GIMP 2.6.0
  5. GEGL
  6. van Gumster J, Shimonski Robert : GIMP Bible. John Wiley and Sons 2009, stron = 722 -04-16 | isbn = 978-0470523971
  7. Browse gimp code online
  8. Skrypty w gimpie - dokumentacja
  9. debug-plug-ins by
  10. gimp-scripts at Open Source Photography
  11. A repository of extensions for GIMP
  12. Script-FU by René Nyffenegger
  13. Gimp plug-in by Kevin Turner
  14. Gimp doc : Basic Perl
  15. updated Gimp doc for ver. 2.0 - perl
  16. Gimp tutorial : Perl Debugged
  17. gimp python doc
  18. Script-Fu and plug-ins for The GIMP by Simon Budig
  19. gimp-using-script-fu-tutorial-first-script at User Manual
  20. SCRIPT-FU IN GIMP 2.4
  21. tiny-fu-faq
  22. Generating GIMP Images with Script-Fu by Glimmer Labs
  23. GIMP Script-Fu Notes: JamCam Cleanup Plugins Submitted by johnk
  24. GIMP Script-Fu Notes: JamCam Cleanup Plugins Submitted by johnk
  25. Your First Script-Fu Script - gimp docs
  26. Opis script_fu_register - René Nyffenegger
  27. commit d4120fe1ab54812a805d920e5c5ca695ab60b956: Updated all scripts to use script-fu-menu-register and pass just the menu by Kevin Cozens 2004-11-22
  28. gimp-plugin-menu-register at GIMP Library Reference Manual
  29. A Scheme Tutorial for Gimp Users Updated for Gimp-1.2 by Dov Grobgeld
  30. A Scheme Tutorial for Gimp Users Updated for Gimp-1.2 by Dov Grobgeld
  31. Basic Batch at Gimp doc
  32. Script-Fu Questions by Miles O'Neal
  33. Gimp Python Documentation James Henstridge
  34. script for GIMP by Michael J. Gruber
  35. Jak utworzyć skrypt w c
  36. How to write a GIMP plug-in in C
  37. GIMP Application Reference Manual Next Part XIII. Plug-Ins