5.6. Alakzatok és szöveg rajzolása¶
Egy algoritmusnak, amely valamit eldönt egy képről, gyakran láthatóvá kell tennie ezt a döntést. Egy foltdetektor megtalál egy területet, amely az alkalmazás számára fontos; az alkalmazás azt szeretné, ha a terület a képkockára lenne rajzolva, hogy egy kezelő – vagy a szkriptet futtató fejlesztő – láthassa, mit talált. Egy koordináta-transzformáció egy bemeneti pozíciót egy kimenetire képez le; ennek hibakeresése általában a két pozíció megjelölését jelenti ugyanazon a képen. Az IDE előnézete azt olvassa be, ami éppen a képkocka-pufferben van a lekérdezés pillanatában, így az algoritmus kimenetének láthatóvá tételének legegyszerűbb módja, ha magába a képkocka-pufferbe írunk feliratokat. A Image osztály rajzolási családja pontosan ehhez a munkához nyújt eszköztárat.
5.6.1. A primitívek¶
Minden rajzolási metódus egy adott fajta jelet helyez el a képen. A katalógus kicsi, és közel marad azokhoz a geometriai primitívekhez, amelyekre egy feliratozásnak valójában szüksége van:
draw_line()– egyenes vonalszakasz két végpont között.draw_rectangle()– tengelyekkel párhuzamos téglalap, üres vagy kitöltött.draw_circle()– kör egy középpont körül, üres vagy kitöltött.draw_ellipse()– tetszőleges elforgatású ellipszis.draw_cross()– pluszjel egy pontnál, a szokásos jelölés egy súlypont vagy egy kattintási célpont számára.draw_arrow()– nyíl egy kezdőponttól egy végpontig.draw_edges()– egy tetszőleges négyszög négy oldala, a négy sarokpont megadásával; a természetes mód egy észlelt kód vagy egy perspektivikusan torzított terület körvonalazására.draw_string()– szöveg egy beépített bitmap betűtípusból.
Mindegyik helyben módosítja a forrásképet, és láncoláshoz ugyanazt a képet adja vissza, a korábban kialakított operáló-metódus konvenciót követve.
A nyolc rajzolási primitív, panelenként egy. Minden metódus egyfajta jelet készít.¶
5.6.2. Szín¶
Minden rajzolási metódus egy color argumentumot vár, amely eldönti, milyen értéket írjon minden megfestett képpontba. Az argumentum formája a kép formátumától függ. Egy RGB565 kép esetén a természetes forma egy (r, g, b) rendezett hármas, ahol minden csatorna 0 – 255 között van; a modul ezt a 16 bites RGB565 szóba csomagolja, mielőtt kiírná. Egy szürkeárnyalatos kép esetén a természetes forma egyetlen egész fényerő-érték 0 (fekete) és 255 (fehér) között. A metódusok a formátum nyers tárolt értékét is elfogadják – egy 16 bites csomagolt szót RGB565 esetén, egy 8 bites egészt szürkeárnyalatos esetén –, ami a hatékony forma, amikor a színt máshol számították ki, és az már a tárolt formában van.
A color argumentum elhagyása fehérrel fest. Ez az alapértelmezés kényelmes szürkeárnyalatos munkához, ahol a fehér a maximális érték, és a legtöbb háttér ellen tisztán látszik. RGB565 hibakeresési rávetítésekhez szinte mindig helytelen: a zöld vagy a piros általában jobban látszik az olyan jelenet ellen, amelyet egy kamera valójában lát, és egy kifejezett szín közvetíti a szándékot.
5.6.3. Vastagság és kitöltés¶
A legtöbb geometriai metódus két jelzőt vár, amelyek eldöntik, hogyan rajzolódik a jel:
A
thickness=Nállítja be a vonalvastagságot képpontokban. Az alapértelmezés1, ami a legtöbb rávetítéshez megfelelő; egy nagyobb érték akkor hasznos, ha egy feliratnak láthatónak kell maradnia egy zsúfolt jelenet ellen, vagy miután a folyamat egy következő szakasza tovább módosítja a képet.A
fill=Truekörvonalból tömör jellé alakítja a jelet, minden belső képpontot a választott színnel megfestve. Az alapértelmezésFalse.
Ezek a jelzők nem vonatkoznak azokra a primitívekre, amelyeknek nincs kitölthető belsejük – a vonal, a kereszt, a nyíl, a négyszög –, ahol csak a thickness értelmes.
5.6.4. Szöveg rajzolása¶
A draw_string() karaktereket ír ki egy beépített 8x10 képpontos bitmap betűtípusból. Az x és az y az első karakter cellájának bal felső sarka, a text a rajzolandó karakterlánc, a color pedig ugyanazt a konvenciót követi, mint a geometriai metódusok. A betűtípus a teljes nyomtatható ASCII tartományt hordozza, és nincs alávágása (kerning) – minden karakter ugyanazt a 8 képpont széles cellát foglalja el –, ami megkönnyíti a kimenet pozicionálását.
img.draw_string(10, 10, "blobs: 3", color=(0, 255, 0))
A karakterlánc tartalmazhat újsorokat (\n); minden újsor a következő karaktert egy új sor elejére mozgatja, tíz képponttal az előző alatt. A scale argumentum minden karaktert egy lebegőpontos szorzóval nagyobb méretben rajzol, az x_spacing és az y_spacing pedig kitöltést ad minden karakter köré. Forgatási / tükrözési / átfordítási jelzők egy kis halmaza vagy az egész karakterláncra, vagy önállóan minden egyes karakterre alkalmazható – elegendő szabályozás ahhoz, hogy a szöveget egy szög mentén vagy egy nem vízszintes él ellen igazítsuk, ha az elrendezés ezt kívánja.
5.6.5. A vászon törlése¶
A család egyik metódusa nem rajzol semmilyen konkrét jelet. Csupán a kép minden képpontját nullára állítja vissza:
clear()– minden képpontot nulláz, opcionálisan egy ROI-ra korlátozva vagy egy maszkon keresztül hatókörözve.
A clear() a helyes válasz, amikor egy alkalmazás minden képkockánál a nulláról állít össze egy feliratot – kezdés egy fekete vászonnal, az új feliratok rajzolása, majd az eredmény átadása a kijelzőnek –, ahelyett hogy a rögzített képkockára rávetítene. Ez egyúttal a legolcsóbb mód egy ideiglenes kép előkészítésére maszkpufferként való használathoz.
Egy frissen lefoglalt kép a konstruktor révén már nulla, így a clear() kifejezetten a képkockák között újrafelhasznált pufferek esetén számít.