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_palette nahrazuje hodnotu každého pixelu zdroje před vykreslením pomocí vyhledávací tabulky – stejný mechanismus, jaký používají to_rainbow() a to_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.