PGA - GIMP → Krita: migrační tahák (pro cvičení s pluginy)
PGA - GIMP → Krita: migrační tahák (pro cvičení s pluginy)
Autor kurzu: Šimon Taněv, Zdeněk Nejedlý, Radek Richtr
Cíl: zachovat didaktickou kostru GIMP cvičení (GUI, preview, blokové operace) a převést ji do PyKrita (Qt), s důrazem na BGRA, ROI (výběr) a bezpečný refresh.
Crosswalk (GIMP ↔ Krita)
| GIMP (Python-fu) | Krita (PyKrita) | Poznámky |
|---|---|---|
gimpplugin.plugin registrace | krita.Extension + createActions() | Akci vlož do tools/scripts, napoj triggered.connect(…). :contentReference[oaicite:0]{index=0} |
gimpui/gtk dialogy | PyQt5 (QtWidgets) | Dialogy, layouty, signály; stejné UX, jiná API. :contentReference[oaicite:1]{index=1} |
Shelf (gimpshelf) perzistence | QSettings / JSON soubor | Ukládej presety, last-used hodnoty. :contentReference[oaicite:2]{index=2} |
drawable.get_pixel_rgn(…) | node.pixelData(x,y,w,h) / setPixelData(…) | Práce s BGRA bytearray/memoryview; řádkově/blokově. :contentReference[oaicite:3]{index=3} |
RUN_* módy | neřeší se | Interaktivní běh přes akci v menu. :contentReference[oaicite:4]{index=4} |
| Preview: dočasná vrstva | Preview: dočasná kopie vrstvy | Vytvoř kopii/ROI, po OK aplikuj do cíle. :contentReference[oaicite:5]{index=5} |
Progress bar gimp.progress_* | QProgressDialog / jednoduchý status | Průběžně volat QApplication.processEvents(). :contentReference[oaicite:6]{index=6} |
Lab K-11: Hue-Map (přemapování odstínu přechodem) — Krita verze
Inspirace: GIMP „Hue Map“ ukázka (GUI, preview, blokové operace). :contentReference[oaicite:8]{index=8}
Cíl
- GUI s ColorRamp (náhrada: vlastní 256-bodový LUT), Preview na ROI, aplikace do vrstvy (BGRA).
Postup (stručně)
- Akce „Hue Map (Krita)“ do Tools/Scripts.
- Dialog (Qt): Slider „Hue Shift“ (–180..+180), „Strength“ (0..1), tlačítko Preview, OK, Cancel.
- Preview: zkopíruj ROI do dočasné vrstvy, převeď BGR→HSV, přemapuj H (otočení + LUT), zpět do BGR; alfu ponech.
- OK: zpracuj cílovou vrstvu v ROI;
doc.refreshProjection().
data = bytearray(node.pixelData(x, y, w, h))
mv = memoryview(data)
for i in range(0, len(mv), 4):
b,g,r,a = mv[i+0], mv[i+1], mv[i+2], mv[i+3]
# BGR -> HSV (rychlá integer approx. nebo QColor)
h,s,v = rgb_to_hsv_i(r,g,b)
h = (h + hue_shift_deg) % 360
r,g,b = hsv_to_rgb_i(h, s, v)
mv[i+0], mv[i+1], mv[i+2] = b,g,r
node.setPixelData(mv.tobytes(), x, y, w, h)
doc.refreshProjection()Checklist
- Náhled neovlivní zdrojovou vrstvu
- Alfa beze změny
- ROI pouze dle výběru
Bonus
QSettingspro uložení posledních hodnot; slider „LUT smoothness“.
Lab K-11b: Pixelizace (bloková) — Krita verze
Inspirace: „Samostatná práce: pixelizace“ (definované okolí → nová hodnota). :contentReference[oaicite:9]{index=9}
Cíl
- Parametr
blockSize(např. 4–32 px); průměr barvy v bloku → vyplnit blok; BGRA, bez zásahu do A.
Postup
- Rozděl ROI na mřížku
blockSize. - Načti podblok (řádkově), spočítej průměr B,G,R, alfu ponech.
- Vyplň blok průměrem a zapiš zpět; po řádcích kvůli paměti.
Poznámky
- Výběr mimo celočíselné násobky
blockSizeořež na nejbližší hranici.
Lab K-09: Posun kanálů (RGB/Gray) — Krita verze
Inspirace: GIMP #09 „posunutí kanálů“ s UI a dvěma variantami. :contentReference[oaicite:10]{index=10}
Cíl
- Tři slidery ΔR/ΔG/ΔB (–255..+255), přepínač „Luminance only“.
Schéma výpočtu
- RGB:
c' = clamp(c + Δc), alfa beze změny. - Luminance only:
Y = 0.2126 R + 0.7152 G + 0.0722 B→ posunout Y, upravit RGB poměrově.
UX a výkon (doporučení)
- Preview dělej na downsample kopii ROI (např. 256×256) a teprve OK na plné velikosti. :contentReference[oaicite:11]{index=11}
- QProgressDialog při dlouhých operacích; každých pár řádků
processEvents(). :contentReference[oaicite:12]{index=12} - Perzistence:
QSettings(org="fit.cvut.cz", app="pga-krita") nebo JSON v plugin složce.