9. Zásuvné moduly pro GIMP (C++, Python)
Cíl cvičení
Cílem cvičení je demonstrovat tvorbu zásuvného modulu do aplikace GIMP s využitím jazyka C/C++ Cílem cvičení je demonstrovat tvorbu zásuvného modulu do aplikace GIMP s využitím jazyka Python
Osnova
- Demonstrace zásuvného modulu Negace (verze 1) bez UI
- Demonstrace zásuvného modulu Negace (verze 2) bez UI
- Demonstrace zásuvného modulu add-color s UI
- Procvičení - úprava add-color
- Instalace vývojového prostředí a nástrojů
- Zdroje a příklady
- Ukázkové příklady
Vývojové prostředí
C/C++
OS Linux
- Nainstalovat GIMP
- Naistalovat gimptool-2.0 apt install libgimp2.0-dev
- Naistalujte Editor gedit, nano, Netbeans nebo co chcete
OS Windows
Varování:
Složitá instalace kompilátoru, doporučujeme použít VirtualBox a dál postupovat dle Linuxu
- Image se systémem pro Virtualbox
- viz bod 1. Linux
Python
OS Linux a OS Windows
- v principu je potřeba jen textový editor
- není potřeba kompilovat
Demonstrace zásuvného modulu Inverze bez UI (fragmenty z přednášky)
- Stáhněte Demo1
- Zkompilujte a naistalujte
- Oveřte funkcionalitu
- Zamyslete se nad následujícím
- Proč je modul tak pomalý?
- V procesu inverze je chyba, odhalte ji.
- Jak je řešen progress bar?
Úkol na zbytek hodiny a do přístě
- Zrychlete modul
- Kompilace hlásí warningy - opravte kód
- Opravte chybu v inverzi
- Upravte zdroje (lokace, svoje údaje)
Zdroje a příklady
Objektový přístup
class filter_plugin(gimpplugin.plugin):
def start(self):
gimp.main(self.init, self.quit, self.query, self._run)
def init(self):
pass
def quit(self):
pass
def query(self):
gimp.install_procedure(
"filter_plugin_main",
"Popis ..",
"Help ..",
"Jiří Chludil",
"Jiří Chludil",
"2020",
"<Image>/Filters/My filter",
"RGB*, GRAY*",
PLUGIN,
[ # next three parameters are common for all scripts that are inherited from gimpplugin.plugin
(PDB_INT32, "run_mode", "Run mode"),
(PDB_IMAGE, "image", "Input image"),
(PDB_DRAWABLE, "drawable", "Input drawable"),
],
[]
)
def filter_plugin_main(self, run_mode, image, drawable):
...
if __name__ == '__main__':
color_filter_plugin().start()
GUI - vlastní design
def create_dialog(self):
self.dialog = gimpui.Dialog("filter", "filters_dialog")
# 3x9 non-homogenous table
self.table = gtk.Table(9, 3, True)
self.table.set_row_spacings(10)
self.table.set_col_spacings(10)
self.table.show()
# checkbox
self.myCheck = gtk.CheckButton("Active")
self.myCheck.show()
self.myCheck.connect("clicked",self.checkboxClicked)
self.table.attach(self.yCheck, 1, 2, 0, 1)
# adjustment
self.myAdj = gtk.Adjustment(0.0, -255.0, 255.0, 1.0, 1.0, 0)
self.myAdjScale = gtk.HScale(self.myAdj)
self.myAdjScale.set_digits(0)
self.myAdjScale.set_value(0)
self.myAdjScale.connect("value_changed", self.adjScaleChangeValue)
self.table.attach(self.myAdjScale, 2, 3, 1, 2)
...
def checkboxClicked(self,widget):
...
def radiusChangeValue(self,widget):
...
Demonstrace
Zadání
Vytvořte modul posunutí kanálů, který provede posun (přičtení parametru) všech obrazových kanálů. Modul bude mít nastavitelné parametr určující posunutí hodnoty všech kanálu a bude fungovat pro režimy RGB* a GRAY*
Řešení
Samostatná práce
Zadání
Vytvořte modul posunutí kanálů, který provede posun (přičtení parametru) jednotlivých obrazových kanálů. Modul bude mít nastavitelné parametry určující posunutí hodnoty jednotlivých kanálu a bude fungovat pro režimy RGB* a GRAY*