5.7. Slaganje slika

Crtaći primitivi s prethodne stranice oslikavaju geometrijske oznake na slici – liniju, pravokutnik, dio teksta. To pokriva većinu napomena koje algoritam treba učiniti vidljivima, ali ne sve. Ponekad je napomena i sama slika: snimljena referentna sličica koja se prikazuje uz trenutnu, sličica prethodne snimke prikazana u kutu pretpregleda ili prethodno pohranjeni predložak vizualiziran povrh žive sličice radi kalibracije. Mehanizam za crtanje jedne slike na drugu je jedna jedina metoda – draw_image() – s dovoljno parametara za obradu položaja, skaliranja, palete boja i prozirnosti koje stvarna kompozicija zahtijeva.

5.7.1. Osnovni poziv

U svom najjednostavnijem obliku, draw_image prima drugu Image i položaj na kojem će je nacrtati:

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

Odredište je img; izvor je reference; gornji lijevi piksel izvora dolazi na (10, 10) slike img, a ostali pikseli izvora slijede udesno i prema dolje od te točke. Pikseli odredišta koje izvor prekriva prepisuju se odgovarajućim pikselima izvora; pikseli izvan otiska izvora ostaju netaknuti.

Ako se izvor proteže preko ruba odredišta, dijelovi koji ispadaju tiho se izrezuju – isto velikodušno ponašanje koje set_pixel pokazuje za položaje izvan dosega. Aplikacijski kod ne mora unaprijed ograničavati položaj na dimenzije slike; može proslijediti željeni položaj i prepustiti metodi da obavi izrezivanje.

5.7.2. Učitavanje datoteke u tijeku

draw_image prihvaća putanju datoteke umjesto argumenta Image i učitava datoteku prije nego što je složi:

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

To izgleda kao pogodnost – jedan redak umjesto dva – i jest, ali razlika je više od sintakse. Konstruiranje objekta Image iz datoteke alocira međuspremnik za pohranu dekodiranih piksela, a taj međuspremnik postoji sve dok ga sakupljač smeća ne oslobodi. Prosljeđivanje putanje izravno u draw_image omogućuje modulu da dekodira datoteku u privremeni međuspremnik, složi je iz njega i oslobodi međuspremnik kada se poziv vrati, bez da aplikacijski kod mora držati referencu na zasebni Image između sličica.

5.7.3. Skaliranje

Kada su izvor i odredište različitih veličina – snimka niske razlučivosti koja se slaže na platno više razlučivosti ili sličica koju treba dimenzionirati na određeni dio sličice – dva parametra skaliranja brinu se o promjeni veličine izvora dok se crta:

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

x_scale i y_scale su neovisni decimalni brojevi; prosljeđivanje obaju s istom vrijednošću skalira ravnomjerno, a prosljeđivanje različitih vrijednosti rasteže ili steže izvor uzduž jedne osi. Skaliranje se događa u trenutku crtanja; izvor reference se ne mijenja.

Bitovna maska zastavica savjeta (hint) odlučuje kako skaliranje zapravo interpolira između piksela. image.BILINEAR daje glađe rezultate uz cijenu većeg računanja; image.BICUBIC daje još glađe rezultate i opet košta više; zadana postavka koristi metodu najbližeg susjeda, koja je najjeftinija i pravi izbor kada je izvor već u razlučivosti piksela odredišta. Zastavice za rukovanje omjerom slike – SCALE_ASPECT_KEEP, SCALE_ASPECT_EXPAND, SCALE_ASPECT_IGNORE – odlučuju što učiniti kada se omjer slike izvora ne podudara s pravokutnikom u koji se crta.

5.7.4. Alfa miješanje

Prema zadanom, draw_image zamjenjuje piksele odredišta pikselima izvora. Kada je cilj prozirni preklop – tako da odredište prosijava kroz izvor – parametar alpha upravlja načinom na koji se to dvoje miješa. alpha=0 prikazuje samo odredište (bez izvora); alpha=255 je zadana vrijednost i prikazuje samo izvor (potpuna zamjena); međuvrijednosti miješaju to dvoje proporcionalno:

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

Zaseban argument alpha_palette jedini je mehanizam modula za alfu po pikselu. Prima sliku GRAYSCALE čije se vrijednosti koriste kao alfa na odgovarajućem položaju u izvoru – na primjer, toplinska karta čija alfa varira s njezinim intenzitetom. Alfa se mora dostaviti kao taj zaseban argument sivih tonova; izvorna slika koja nosi vlastiti alfa kanal (recimo PNG s prozirnošću) ne prenosi ga automatski.

5.7.5. Izvorni ROI i paleta

Dva dodatna parametra zaokružuju mehanizam kompozicije:

  • roi=(x, y, w, h) ograničava izvor na njegov vlastiti potpravokutnik, tako da se samo taj pravokutnik slaže na odredište. Korisno za izrezivanje unutar istog poziva, bez pripreme izrezanog međurezultata.

  • color_palette zamjenjuje vrijednost svakog izvornog piksela kroz tablicu za pretraživanje prije crtanja – isti mehanizam koji koriste to_rainbow() i to_ironbow(), ovdje izložen tako da se preklop može paletizirati na svom putu na odredište bez zasebnog prolaza pretvorbe.

Oba se slažu sa svime ostalim u pozivu: sa skaliranjem, alfom, argumentom mask na strani odredišta i parametrom roi na strani odredišta koji ograničava upis na pravokutnik odredišta.