Vzhledem k době svého vzniku obsahuje tkinter i podporu pro dvoubarevné obrázky s průhledností ve formátu XBM ze systému X11.
Tak ne že byste je asi dnes nějak urputně potřebovali, ale jelikož je to zase v podstatě textový formát (navíc určený pro vložení do céčkovských zdrojáků), třeba byste je mohli někdy chtít generovat. Nehledě na to, že export do tohoto formátu pořád umí každý slušný obrázkový editor.
Máte-li k dispozici XBM-obrázek v souboru, je jeho načtení a zobrazení triviální – stačí použít atribut file:
Stejně dobře ho ale můžete připravit jako řetězec a použít atribut data:
To pravé ořechové se ovšem v oficiální dokumentaci k tkinteru už nedozvíte. Podíváte-li se však na vlastnosti třídy bitmap
u dokumentace Tk nebo ještě lépe u effbota, zjistíte mimo jiné, že bitmapové obrázky umí dokonce práci s maskami!
A zrovna v tomto případě je API tkinteru napsané dobře, takže ani nebudeme potřebovat „překládat“ dokumentaci pro jazyk Tcl na dokumentaci pro jazyk Python.
Ve výchozím nastavení se vykreslují pixely na popředí (tedy ty s nenulovou hodnotou) jako černé a pixely na pozadí (tedy nulové) jako bílé. Ale za pomoci atributů foreground a background to můžete změnit na libovolnou barevnou kombinaci:
Jako hodnoty barev přichází do úvahy všechny tkinterem (tedy Tkáčkem) rozeznávané tvary. U atributu background navíc můžete dokonce dosadit prázdný řetězec (jak ukazuje příklad), čímž způsobíte průhlednost (zdrojová bitmapa bude totiž použita jako maska bez ohledu na nastavení maskdata a maskfile, ale o těch až na dalším slajdu).
Knihovna tkinter umožňuje u XBM-obázků použití masek. Maska je přitom XBM-soubor o stejném rozměru jako obrázek, na nějž se aplikuje, a její vyhodnocení je následující:
Masky pak můžete s obrázkem spojit v době jeho zavedení konstruktorem BitmapImage()
, a to buď ze souboru pomocí atributu maskfile, nebo z řetězcových dat pomocí atributu maskdata.
Aplikace masky na obrázek je jednoduchá, problémem je pouze vyrobit správnou masku (zvlášť když váš obrázek nemá rozměry 8×8 pixelů, kde se to všechno počítá snadno ;-):
PS: Při aplikaci masky nezapomeňte, že její jednotlivé bajty se vyhodnucují ve stejném – tedy opačném – pořadí jako bajty obrázku.