5.7. Skládání obrazů¶
Kreslicí primitiva z předchozí stránky vykreslují do obrazu geometrické značky – čáru, obdélník, kus textu. To pokrývá většinu anotací, které algoritmus potřebuje zviditelnit, ale ne všechny. Někdy je anotace sama o sobě obrazem: zachycený referenční snímek zobrazený vedle aktuálního, náhled předchozího snímku v rohu náhledu nebo dříve uložená šablona vizualizovaná přes živý snímek pro účely kalibrace. Mechanismem pro vykreslení jednoho obrazu do druhého je jediná metoda – draw_image() – s dostatkem parametrů pro zvládnutí pozice, škálování, barevné palety a průhlednosti, které skutečné skládání vyžaduje.
5.7.1. Základní volání¶
Ve své nejjednodušší podobě přijímá draw_image další Image a pozici, na kterou jej má vykreslit:
reference = image.Image("/sdcard/reference.bmp")
img.draw_image(reference, x=10, y=10)
Cílem je img; zdrojem je reference; levý horní pixel zdroje dopadne na pozici (10, 10) v img a zbytek pixelů zdroje následuje odtud doprava a dolů. Pixely cíle, které zdroj překrývá, jsou přepsány odpovídajícími pixely zdroje; pixely mimo plochu zdroje zůstávají beze změny.
Pokud zdroj přesahuje za okraj cíle, části, které přesahují, jsou tiše oříznuty – stejné shovívavé chování, jaké set_pixel vykazuje pro pozice mimo rozsah. Aplikační kód nemusí předem omezovat pozici na rozměry obrazu; může předat pozici, kterou chce, a nechat ořezání na metodě.
5.7.2. Načtení souboru přímo ve volání¶
draw_image přijímá místo argumentu Image cestu k souboru a před skládáním soubor načte:
img.draw_image("/sdcard/reference.bmp", x=10, y=10)
Vypadá to jako zjednodušení – jeden řádek místo dvou – a také je, ale rozdíl je víc než jen syntaktický. Vytvoření objektu Image ze souboru alokuje buffer pro uložení dekódovaných pixelů a tento buffer existuje, dokud jej neuvolní sběr odpadků. Předání cesty přímo metodě draw_image umožňuje modulu dekódovat soubor do pomocného bufferu, složit z něj obraz a po návratu z volání buffer uvolnit, aniž by aplikační kód musel mezi snímky držet odkaz na samostatný objekt Image.
5.7.3. Škálování¶
Když mají zdroj a cíl různé velikosti – snímek v nízkém rozlišení skládaný na plátno s vyšším rozlišením nebo náhled, který je třeba zmenšit na určitou část snímku – postarají se o změnu velikosti zdroje při kreslení dva parametry škálování:
img.draw_image(reference, x=10, y=10, x_scale=2.0, y_scale=2.0)
x_scale a y_scale jsou nezávislé hodnoty typu float; předání stejné hodnoty u obou škáluje rovnoměrně a předání různých hodnot zdroj roztáhne nebo zmenší podél jedné osy. Škálování probíhá v okamžiku kreslení; zdroj reference se nemění.
Bitová maska příznaků typu hint rozhoduje o tom, jak škálování ve skutečnosti interpoluje mezi pixely. image.BILINEAR poskytuje hladší výsledky za cenu vyšší výpočetní náročnosti; image.BICUBIC poskytuje ještě hladší výsledky a stojí opět více; výchozí nastavení používá metodu nejbližšího souseda, která je nejlevnější a správnou volbou, když je zdroj již v pixelovém rozlišení cíle. Příznaky pro zacházení s poměrem stran – SCALE_ASPECT_KEEP, SCALE_ASPECT_EXPAND, SCALE_ASPECT_IGNORE – rozhodují o tom, co dělat, když poměr stran zdroje neodpovídá obdélníku, do kterého je vykreslován.
5.7.4. Alfa míchání¶
Ve výchozím nastavení draw_image nahrazuje pixely cíle pixely zdroje. Když je cílem průsvitný překryv – tedy aby cíl prosvítal skrz zdroj – parametr alpha řídí, jak se oba mísí. alpha=0 zobrazí pouze cíl (žádný zdroj); alpha=255 je výchozí hodnota a zobrazí pouze zdroj (úplné nahrazení); mezilehlé hodnoty oba poměrně mísí:
img.draw_image(overlay, x=0, y=0, alpha=128)
Samostatný argument alpha_palette je jediným mechanismem modulu pro alfa hodnotu na úrovni jednotlivých pixelů. Přijímá obraz typu GRAYSCALE, jehož hodnoty se používají jako alfa na odpovídající pozici ve zdroji – například teplotní mapa, jejíž alfa se mění s její intenzitou. Alfa musí být dodána jako tento samostatný argument ve stupních šedi; zdrojový obraz, který nese vlastní alfa kanál (řekněme PNG s průhledností), jej automaticky nepřenese.
5.7.5. Zdrojová ROI a paleta¶
Mechanismus skládání dotvářejí dva další parametry:
roi=(x, y, w, h)omezuje zdroj na svůj vlastní podobdélník, takže se na cíl složí pouze tento obdélník. Užitečné pro oříznutí v rámci stejného volání, bez přípravy oříznutého mezivýsledku.color_palettenahrazuje hodnotu každého pixelu zdroje před vykreslením pomocí vyhledávací tabulky – stejný mechanismus, jaký používajíto_rainbow()ato_ironbow(), zpřístupněný zde, aby překryv mohl být obarven paletou cestou na cíl bez samostatného převodního průchodu.
Oba se kombinují se vším ostatním ve volání: se škálováním, alfou, argumentem mask na straně cíle a parametrem roi na straně cíle, který omezuje zápis na obdélník cíle.