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_palettezamjenjuje vrijednost svakog izvornog piksela kroz tablicu za pretraživanje prije crtanja – isti mehanizam koji koristeto_rainbow()ito_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.