5.6. Muotojen ja tekstin piirtäminen¶
Algoritmi, joka päättää jotakin kuvasta, tarvitsee usein tuon päätöksen näkyväksi. Blob-tunnistin löytää alueen, josta sovellus välittää; sovellus haluaa alueen piirrettynä kehykseen, jotta operaattori – tai skriptiä ajava kehittäjä – näkee, mitä löydettiin. Koordinaattimuunnos kuvaa syötesijainnin tulossijainniksi; sen vianjäljitys tarkoittaa yleensä molempien sijaintien merkitsemistä samaan kuvaan. IDE-esikatselu lukee sen, mitä kehyspuskurissa sattuu olemaan kyselyhetkellä, joten yksinkertaisin tapa tehdä algoritmin tulos näkyväksi on kirjoittaa merkinnät itse kehyspuskuriin. Image-luokan piirto-perhe on työkalupakki juuri tähän työhön.
5.6.1. Primitiivit¶
Kukin piirtometodi asettaa kuvaan yhden tietyn merkkityypin. Luettelo on pieni ja pysyy lähellä niitä geometrisia primitiivejä, joita merkintä todella tarvitsee:
draw_line()– suora viivasegmentti kahden päätepisteen välillä.draw_rectangle()– akselien suuntainen suorakulmio, ontto tai täytetty.draw_circle()– ympyrä keskipisteen ympärillä, ontto tai täytetty.draw_ellipse()– ellipsi mielivaltaisella kierrolla.draw_cross()– plusmerkki pisteessä, tavanomainen merkki keskipisteelle tai napsautuskohteelle.draw_arrow()– nuoli aloituspisteestä päätepisteeseen.draw_edges()– mielivaltaisen nelikulmion neljä sivua annettuna neljä kulmapistettä; luonteva tapa hahmotella tunnistettu tunniste tai perspektiivivääristetty alue.draw_string()– tekstiä sisäänrakennetulla bittikarttafontilla.
Jokainen näistä muokkaa lähdekuvaa paikallaan ja palauttaa saman kuvan ketjutusta varten noudattaen aiemmin vakiintunutta operoivien metodien käytäntöä.
Kahdeksan piirtoprimitiiviä, yksi paneelia kohden. Kukin metodi tekee yhdenlaisen merkin.¶
5.6.2. Väri¶
Jokainen piirtometodi ottaa vastaan color-argumentin, joka päättää, mikä arvo kirjoitetaan kuhunkin maalattuun pikseliin. Argumentin muoto riippuu kuvan formaatista. RGB565-kuvalle luonteva muoto on (r, g, b)-monikko, jossa kukin kanava on välillä 0 – 255; moduuli pakkaa sen 16-bittiseksi RGB565-sanaksi ennen kirjoittamista. Harmaasävykuvalle luonteva muoto on yksittäinen kokonaislukukirkkaus väliltä 0 (musta) 255 (valkoinen). Metodit hyväksyvät myös formaatin raa’an tallennetun arvon – 16-bittisen pakatun sanan RGB565:lle, 8-bittisen kokonaisluvun harmaasävylle – joka on tehokas muoto, kun väri on laskettu muualla ja on jo tallennetussa muodossa.
color-argumentin jättäminen pois maalaa valkoista. Tuo oletus on kätevä harmaasävytyössä, jossa valkoinen on maksimiarvo ja erottuu selvästi useimpia taustoja vasten. RGB565-vianjäljityspäällyksissä se on lähes aina väärin: vihreä tai punainen erottuu yleensä paremmin sellaista näkymää vasten, jonka kamera todella näkee, ja eksplisiittinen väri viestii tarkoituksen.
5.6.3. Paksuus ja täyttö¶
Useimmat geometrisista metodeista ottavat vastaan kaksi lippua, jotka päättävät, kuinka merkki piirretään:
thickness=Nasettaa viivan leveyden pikseleinä. Oletus on1, mikä sopii useimpiin päällyksiin; suurempi arvo on hyödyllinen, kun merkinnän on pysyttävä näkyvänä kiireistä näkymää vasten tai sen jälkeen, kun putken seuraava vaihe muokkaa kuvaa edelleen.fill=Truevaihtaa merkin ääriviivasta täytetyksi maalaten jokaisen sisäpikselin valitulla värillä. Oletus onFalse.
Nämä liput eivät koske primitiivejä, joilla ei ole täytettävää sisäosaa – viivaa, ristiä, nuolta, nelikulmiota – joissa vain thickness on merkityksellinen.
5.6.4. Tekstin piirtäminen¶
draw_string() kirjoittaa merkkejä sisäänrakennetusta 8 kertaa 10 pikselin bittikarttafontista. x ja y ovat ensimmäisen merkin solun vasen yläkulma, text on piirrettävä merkkijono, ja color noudattaa samaa käytäntöä kuin geometriset metodit. Fontti kattaa koko tulostettavan ASCII-alueen eikä siinä ole välistystä – kukin merkki vie saman 8 pikseliä leveän solun – mikä tekee tuloksen sijoittelusta helppoa.
img.draw_string(10, 10, "blobs: 3", color=(0, 255, 0))
Merkkijono voi sisältää rivinvaihtoja (\n); kukin rivinvaihto siirtää seuraavan merkin uuden rivin alkuun kymmenen pikseliä edellisen alapuolelle. scale-argumentti piirtää jokaisen merkin suuremmassa koossa liukulukukertoimella, ja x_spacing sekä y_spacing lisäävät täytettä kunkin merkin ympärille. Pieni joukko kierto- / peilaus- / kääntölippuja koskee joko koko merkkijonoa tai kutakin merkkiä erikseen – riittävästi hallintaa tekstin asetteluun kulman mukaisesti tai ei-vaakasuoraa reunaa vasten, kun asettelu sitä vaatii.
5.6.5. Kankaan tyhjentäminen¶
Yksi perheen metodeista ei piirrä mitään tiettyä merkkiä. Se vain nollaa jokaisen kuvan pikselin:
clear()– nollaa jokaisen pikselin, valinnaisesti rajattuna ROI:hin tai maskin kautta rajattuna.
clear() on oikea vastaus, kun sovellus kokoaa merkinnän alusta joka kehyksessä – aloita mustalla kankaalla, piirrä uudet merkinnät, luovuta tulos näytölle – sen sijaan että se päällystäisi tallennetun kehyksen päälle. Se on myös halvin tapa valmistella väliaikainen kuva käytettäväksi maskipuskurina.
Vasta varattu kuva on jo nollattu konstruktorista, joten clear() on merkityksellinen erityisesti kehysten välillä uudelleenkäytettäville puskureille.