Jdi na navigaci předmětu

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

  1. Nainstalovat GIMP
  2. Naistalovat gimptool-2.0 apt install libgimp2.0-dev
  3. 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

  1. Image se systémem pro Virtualbox
  2. 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)

  1. Stáhněte Demo1
  2. Zkompilujte a naistalujte
  3. Oveřte funkcionalitu
  4. 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ě

  1. Zrychlete modul
  2. Kompilace hlásí warningy - opravte kód
  3. Opravte chybu v inverzi
  4. 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*

zdroj

Ř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*

Řešení