5.7. Képek összeállítása

Az előző oldal rajzolási primitívjei geometriai jeleket festenek egy képre – egy vonalat, egy téglalapot, egy szövegrészletet. Ez lefedi a legtöbb feliratozást, amelyet egy algoritmusnak láthatóvá kell tennie, de nem mindet. Néha maga a feliratozás egy kép: egy rögzített referencia-képkocka, amelyet az aktuális mellett kell megjeleníteni, egy korábbi felvétel bélyegképe az előnézet egyik sarkában, vagy egy korábban tárolt sablon, amelyet kalibráláshoz egy élő képkockára vetítve jelenítünk meg. Az egyik kép másikra rajzolásának mechanizmusa egyetlen metódus – draw_image() –, amely elegendő paraméterrel rendelkezik a pozíció, a méretezés, a színpaletta és az átlátszóság kezeléséhez, amelyekre a valódi összeállításnak szüksége van.

5.7.1. Az alapvető hívás

Legegyszerűbb formájában a draw_image egy másik Image objektumot és egy pozíciót vár, ahová rajzolja:

reference = image.Image("/sdcard/reference.bmp")
img.draw_image(reference, x=10, y=10)

A célkép az img; a forrás a reference; a forrás bal felső képpontja az img (10, 10) pozíciójára kerül, a forrás többi képpontja pedig innen jobbra és lefelé követi. A célkép azon képpontjai, amelyeket a forrás lefed, felülíródnak a forrás megfelelő képpontjaival; a forrás területén kívül eső képpontok érintetlenül maradnak.

Ha a forrás túlnyúlik a célkép szélén, a kilógó részek csendben levágódnak – ugyanaz az elnéző viselkedés, amelyet a set_pixel mutat a tartományon kívüli pozíciók esetén. Az alkalmazás kódjának nem kell előre a kép méreteihez igazítania a pozíciót; átadhatja a kívánt pozíciót, és a metódusra bízhatja a levágást.

5.7.2. Fájl beágyazott betöltése

A draw_image az Image argumentum helyén egy fájlútvonalat is elfogad, és az összeállítás előtt betölti a fájlt:

img.draw_image("/sdcard/reference.bmp", x=10, y=10)

Ez kényelmi megoldásnak tűnik – egy sor kettő helyett –, és az is, de a különbség több, mint puszta szintaxis. Egy Image fájlból való létrehozása lefoglal egy puffert a dekódolt képpontok tárolására, és ez a puffer addig fennmarad, amíg a szemétgyűjtő fel nem szabadítja. Az útvonal közvetlen átadása a draw_image metódusnak lehetővé teszi, hogy a modul egy ideiglenes pufferbe dekódolja a fájlt, abból állítsa össze, és a hívás visszatérésekor felszabadítsa a puffert, anélkül hogy az alkalmazás kódjának egy külön Image objektumra való hivatkozást kellene fenntartania a képkockák között.

5.7.3. Méretezés

Amikor a forrás és a célkép eltérő méretű – például egy alacsony felbontású felvételt egy nagyobb felbontású vászonra állítunk össze, vagy egy bélyegképet kell a képkocka bizonyos hányadára méretezni –, két méretezési paraméter gondoskodik a forrás átméretezéséről rajzolás közben:

img.draw_image(reference, x=10, y=10, x_scale=2.0, y_scale=2.0)

Az x_scale és az y_scale független lebegőpontos értékek; ha mindkettőt azonos értékkel adjuk meg, egyenletesen méretez, eltérő értékekkel pedig megnyújtja vagy összenyomja a forrást az egyik tengely mentén. A méretezés rajzolási időben történik; a forrás reference nem módosul.

Tipp (hint) jelzők egy bitmaszkja dönti el, hogyan interpolál ténylegesen a méretezés a képpontok között. Az image.BILINEAR simább eredményt ad nagyobb számítási költségen; az image.BICUBIC még simább eredményt ad, és még többe kerül; az alapértelmezett a legközelebbi szomszéd módszert használja, amely a legolcsóbb, és a megfelelő választás, ha a forrás már a célkép képpontfelbontásán van. A képarányt kezelő jelzők – SCALE_ASPECT_KEEP, SCALE_ASPECT_EXPAND, SCALE_ASPECT_IGNORE – döntik el, mi a teendő, ha a forrás képaránya nem egyezik azzal a téglalappal, amelybe rajzoljuk.

5.7.4. Alfa-keverés

Alapértelmezés szerint a draw_image kicseréli a célkép képpontjait a forrás képpontjaira. Amikor a cél egy áttetsző rávetítés – hogy a célkép átlátsszon a forráson –, az alpha paraméter szabályozza, hogyan keveredik a kettő. Az alpha=0 csak a célképet mutatja (forrás nélkül); az alpha=255 az alapértelmezés, és csak a forrást mutatja (teljes csere); a köztes értékek arányosan keverik a kettőt:

img.draw_image(overlay, x=0, y=0, alpha=128)

Egy külön alpha_palette argumentum a modul egyetlen képpontonkénti alfa-mechanizmusa. Egy GRAYSCALE képet vár, amelynek értékei a forrás megfelelő pozíciójában alfaként szolgálnak – például egy hőtérképé, amelynek alfája az intenzitásával változik. Az alfát ezen a külön szürkeárnyalatos argumentumon keresztül kell megadni; egy saját alfa-csatornát hordozó forráskép (mondjuk egy átlátszósággal rendelkező PNG) nem hozza azt át automatikusan.

5.7.5. Forrás-ROI és paletta

Két további paraméter teszi teljessé az összeállítási mechanizmust:

  • A roi=(x, y, w, h) a forrást egy saját al-téglalapjára korlátozza, így csak az a téglalap kerül a célképre összeállításra. Hasznos ugyanazon hívásban történő kivágáshoz, anélkül hogy kivágott köztes képet kellene előkészíteni.

  • A color_palette rajzolás előtt egy keresőtáblán keresztül helyettesíti minden forrás-képpont értékét – ugyanaz a mechanizmus, amelyet a to_rainbow() és a to_ironbow() használ, itt azért elérhetővé téve, hogy egy rávetítést palettázni lehessen a célképre vezető útján, külön átalakítási lépés nélkül.

Mindkettő együttműködik a hívás minden más elemével: a méretezéssel, az alfával, a célkép-oldali mask argumentummal és a célkép-oldali roi paraméterrel, amely az írást a célkép egy téglalapjára korlátozza.