GIMP/Programowanie
Opracowane na podstawie GIMP 2.6.8 wersja polska /linux
Architektura gimpa
edytujW 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]
API
edytujWtyczki (ang. plugin), rozszerzenia, skrypty
edytujGimp 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
edytujSkrypty 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
edytujSzukaj w
Podział dodatków
edytujDodatki 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
edytujDodatki 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
edytujScheme 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
edytujMoż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
edytujLinux: 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
edytujEtapy tworzenia:
- utworzenie pliku z rozszerzeniem scm i odpowiednią zawartością
- zapisanie pliku w odpowiednim katalogu
- zarejestrować skrypt w gimpie
Nazwa skryptu
edytujNazwa skryptu powinna być:
script-fu-nazwa
ponieważ wtedy będzie dobrze widoczny w liście procedur [23]
Zawartość skryptu
edytujWzorce skryptu:
- Wzorzec nr 1 skryptu
- wzorzec demo.scm, który nic nie robi:[24]
(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
edytujOpis 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
edytujSkrypt 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
edytujDokumentacja [33]
Konsola
edytujMoż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- Skrypt do wizualizacji płaszczyzny zespolonej [34]
- Draw Mandelbrot fractals with GIMP scripting. Create complex mathematical images with GIMP's Script-Fu language. By Cristiano L. Fontana (Alumni) February 10, 2021
C
edytujJak 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:
- Mathmap
- PNM reading and writing (also pfm)
- littlecms i babl
Odnośniki
edytuj- ↑ pdbgen source
- ↑ How to write a GIMP plug-in Written By Dave Neary
- ↑ Earl Oliver, Jaime Ruiz, Steven She, and Jun Wang, The Software Architecture of the GIMP, December 2006.
- ↑ GIMP Library Reference Manual for GIMP 2.6.0
- ↑ GEGL
- ↑ van Gumster J, Shimonski Robert : GIMP Bible. John Wiley and Sons 2009, stron = 722 -04-16 | isbn = 978-0470523971
- ↑ Browse gimp code online
- ↑ Skrypty w gimpie - dokumentacja
- ↑ debug-plug-ins by
- ↑ gimp-scripts at Open Source Photography
- ↑ A repository of extensions for GIMP
- ↑ Script-FU by René Nyffenegger
- ↑ Gimp plug-in by Kevin Turner
- ↑ Gimp doc : Basic Perl
- ↑ updated Gimp doc for ver. 2.0 - perl
- ↑ Gimp tutorial : Perl Debugged
- ↑ gimp python doc
- ↑ Script-Fu and plug-ins for The GIMP by Simon Budig
- ↑ gimp-using-script-fu-tutorial-first-script at User Manual
- ↑ SCRIPT-FU IN GIMP 2.4
- ↑ tiny-fu-faq
- ↑ Generating GIMP Images with Script-Fu by Glimmer Labs
- ↑ GIMP Script-Fu Notes: JamCam Cleanup Plugins Submitted by johnk
- ↑ GIMP Script-Fu Notes: JamCam Cleanup Plugins Submitted by johnk
- ↑ Your First Script-Fu Script - gimp docs
- ↑ Opis script_fu_register - René Nyffenegger
- ↑ commit d4120fe1ab54812a805d920e5c5ca695ab60b956: Updated all scripts to use script-fu-menu-register and pass just the menu by Kevin Cozens 2004-11-22
- ↑ gimp-plugin-menu-register at GIMP Library Reference Manual
- ↑ A Scheme Tutorial for Gimp Users Updated for Gimp-1.2 by Dov Grobgeld
- ↑ A Scheme Tutorial for Gimp Users Updated for Gimp-1.2 by Dov Grobgeld
- ↑ Basic Batch at Gimp doc
- ↑ Script-Fu Questions by Miles O'Neal
- ↑ Gimp Python Documentation James Henstridge
- ↑ script for GIMP by Michael J. Gruber
- ↑ Jak utworzyć skrypt w c
- ↑ How to write a GIMP plug-in in C
- ↑ GIMP Application Reference Manual Next Part XIII. Plug-Ins