Kuvaleikkuri¶
Kuvien käsittely ohjelmoinnin kautta on ajoittain kätevämpää kuin kuvankäsittelyohjelmien käyttö. Joskus ihan vain senkin takia, että ei huvita asentaa massiivista ohjelmaa ja opetella sen käyttöä, kun tarkoitus on vain saada vaikkapa kuvasta leikeltyä muutama palanen jonkinlaisella säännöllisyydellä - ja mieluiten vielä helposti monelle kuvalle samoilla säädöillä. Sopivien asetusten löytäminen tämmöiseen leikkausoperaatioon onnistuu kuitenkin usein paremmin visuaalisesti kuin pikseleitä mittaamalla, joten jonkinlainen käyttöliittymä tähänkin tarvittaneen...
Tarkalleen ottaen tässä työssä tehdään ohjelma, jonka avulla käyttäjä voi asetella N kpl suorakaiteita ladatun kuvan päälle, ja tallentaa neliöiden alle osuvat palaset omiin tiedostoihinsa. Asettelu tapahtuu visuaalisessa editointikäyttöliittymässä näppäinkomennoilla ja/tai hiirellä, ja leikkausasetukset voidaan tallentaa tiedostoon, jotta ne voidaan helposti käyttää toiseen samanlaiseen kuvaleikkaukseen.
Ohjelmistoista¶
Tässä työssä käytetään kuvankäsittelyyn suunnattua Pillow-kirjastoa. Asennus onnistuu komentokehotteesta
pip install pillow
-komennolla. Kirjaston dokumentaatioon tutustuminen on osa työn suoritusta, joskaan kovin suurta osaa sen toiminnoista ei tulla käyttämään. Kaikki tarvittava tieto löytyy Image-moduulin dokumentaatiosta. Lisäksi graafisen käyttöliittymän tekemiseen käytetään haravasto-kirjastoa, josta lisää myöhemmin.
Tarkemmat vaatimukset¶
Ohjelman kaksi päätoimintoa ovat käyttöliittymä, jossa leikkausparametrit määritellään, ja toiminto, joka suorittaa leikkauksen ladatulle kuvalle.
Ohjelmaa tehdessä on hyvä pitää mielessä mitä sillä on tarkoitus tehdä. Esimerkkitapauksena vaikkapa, että on otettu päivittäin kuvaruutukaappaus Youtuben etusivusta, ja nyt halutaan tallentaa jokainen yksittäinen video-thumbnail omaksi kuvakseen. Koska etusivun asetelma on aina sama (ainakin parin ekan rivin suhteen), voidaan yhden kuvan avulla sovittaa suorakaiteet joiden alle halutut thumbnailit osuvat, ja sitten tallentaa tarvittavat koordinaatti- ja dimensio-tiedot, joilla sama leikkaus voidaan toistaa jokaiselle kuvakaappaukselle.
Muokkausnäkymä¶
Tässä näkymässä tarvitaan interaktiivinen käyttöliittymä, jossa valittu kuva on taustalla, ja jonka päälle piirretään jonkinlaiset indikaattorit siitä, mitkä kohdat siitä on valittu. Alla näkyvässä kuvassa on käytetty osittain läpinäkyviä valkoisia neliöitä. Koska tämä näkymä tehdään haravastolla, joka puolestaan käyttää Pygletiä, koordinaatiston origo on vasemmassa alakulmassa.

Leikkaus on säännöllinen ruudukko. Käyttäjän säädettävissä pitää olla seuraavat parametrit:
- Ruutujen määrä vaaka- ja pystysuunnissa (erikseen).
- Aloitusruudun vasemman alakulman x-koordinaatti ja y-koordinaatti. Jos näitä muutetaan, kaikki muut ruudut liikkuvat mukana.
- Ruutujen välinen etäisyys vaaka- ja pystysuunnissa. Näiden muutoksen pitäisi siirtää kaikkia ruutuja, paitsi alarivin (korkeutta säädettäessä) tai vasemman sarakkeen (leveyttä säädettäessä).
- Yhden ruudun leveys ja korkeus. Kaikkien ruutujen koko muuttuu näitä säädettäessä.
Täysiä pisteitä varten säädössä pitää olla sekä tarkka 1 pikselin kerrallaan tapahtuva säätö, että nopeampi säätö pitämällä nappia pohjassa. Esimerkiksi tämän voi tehdä niin, että ensimmäinen painallus siirtää pikselin, ja jos nappia pidetään sen jälkeen pohjassa tietyn ajan yli, arvon muutosta aletaan tehdään jatkuvasti, kunnes nappi päästetään irti.
Leikkaustoiminto¶
Leikkaustoiminto ottaa muokkaustoiminnon tuottamat parametrit, ja käyttää niitä otosten tallentamiseen omiin kuviinsa Pillow:n avulla. Leikkaustoiminnossa on syytä huomioida, että toisin kuin Pyglet, Pillow pitää origon vasemmassa yläkulmassa. Samaten suorakaiteet määritellään eri tavalla. Siinä missä Pyglet määrittelee suorakaiteen vasemman alakulman koordinaattien, leveyden ja korkeuden avulla, Pillow määrittelee suorakaiteen vasemman ja oikean sivun x-koordinaateilla sekä ylä- ja alalaiden y-koordinaateilla. Suorakulmioiden parameterit pitää siis tulkata Pillow:n ymmärtämään muotoon, jotta kuvasta saadaan juuri ne osat, jotka muokkausnäkymässä haluttiin otettavaksi.
Kuvan paloittelu pitää olla mahdollista ilman, että muokkausnäkymää on pakko ladata välissä. Eli samoilla asetuksilla pitäisi pystyä leikkaamaan osat monesta saman kokoisesta kuvasta. Jos tämä toiminto valitaan ja ladattuna on kuva, joka ei ole saman kokoinen kuin kuva, jolle parametrit on tehty, ohjelma antaa virheilmoituksen.
Muut toiminnot¶
Ohjelmalla on myös kolme muuta toimintoa.
- Kuvan lataaminen. Luonnollisesti kuva, josta osia halutaan leikata, pitää määrittää jotenkin. Lataustoiminto voi löytyä joko valikosta, tai se voidaan tehdä komentoriviltä ohjelmaa käynnistäessä. Jos kuva ladataan komentoriviparametrista, myös leikkausparametrit pitää pystyä lataamaan komentoriviparametrista.
- Leikkausparametrien tallentaminen. Muokkasnäkymässä luodut parametrit pitää voida tallentaa sopivaan datatiedostoon, jotta kerran luotuja parametreja voidaan käyttää kaikille samanlaisille kuville. Tallennustoiminto antaa käyttäjän syöttää kohdetiedoston nimen.
- Leikkausparametrien lataaminen. Luonnollisesti tallennuksen vastakappaleena pitää olla lataaminen. Käyttäjällä pitää olla mahdollisuus päätää ladataanko parametreja vai ei.
Testikuva¶
Voit käyttää oheista kuvaa testaamiseen. Kuvassa neliöt ovat 2 pikselin päässä reunoista, neliön leveys ja korkeus ovat 42 pikseliä, ja niiden väli 8 pikseliä.

Grafiikka¶
Koska suorakaiteiden asettelu tehdään interaktiivisesti, siihen kannattaa käyttää tässä kontekstissa valmista pelikirjastoa, joka hoitaa sekä syötteiden lukemisen, että grafiikan piirtämisen ikkunaan. Apuna toimii haravasto-niminen kirjasto, joka on alunperin miinantallaaja-lopputyötä varten tehty, mutta laajentunut myöhemmin palvelemaan muitakin aiheita - kuten tätä. Haravaston avulla grafiikan piirto peli-ikkunaan onnistuu jotakuinkin samoilla keinoilla kuin muutkin asiat kurssilla tähän asti - kutsumalla siis funktiota. Kirjastoa ei ole pakko käyttää, mutta ohjelmassa on oltava vastaava graafinen käyttöliittymä jollain tavalla toteutettuna.
Käyttöönotto¶
Lataa kirjasto yllä olevasta linkistä. Toisin kuin miinaharavan kohdalla, tässä työssä ei tarvita ladata mitään kuvapakettia, koska piirtämiseen käytetään käyttäjän valitsemaa taustakuvaa, ja dynaamisesti luotuja perusmuotoja.
Pelikirjastojen 101¶
Siinä missä tähän asti ohjelman käyttöliittymäsilmukka on koodattu kokonaan itse (yleensä
while True
:lla), pelikirjastoissa on tyypillisesti konepellin alle piilotettuna huomattavasti monimutkaisempi pääsilmukka. Se on piilotettu, jotta sillä ei tarvitse vaivata päätään. Kirjastoa käytettäessä määritellään tyypillisesti käsittelijäfunktioita, joita pääsilmukka kutsuu, kun funktioon liitetty asia tapahtuu. Esimerkiksi hiiren klikkaukseen voidaan kytkeä käsittelijäfunktio. Jos näin tehdään, tuota funktiota kutsutaan aina, kun käyttäjä painaa hiiren nappia. Toinen hyvin yleinen käsittelijä on grafiikan piirtofunktio, jota kutsutaan aina, kun ruudulla oleva näkymä pitää päivittää. Pelikoodissasi et siis määrittele omaa pääsilmukkaa, vaan toteutat tarvittavat käsittelijäfunktiot. Käsittelijäfunktiot tulee erikseen kytkeä tapahtumiin. Tämä onnistuu kirjastossa olevilla funktioilla (muotoa aseta_joku_kasittelija). Näiden funktioiden dokumenttimerkkijonoista ilmenee millainen käsittelijäfunktio niihin tulee liittää. Työjärjestys grafiikan piirtämisessä annetulla kirjastolla on kaiken kaikkiaan seuraavanlainen:
- lataa peligrafiikat (eli tässä tapauksessa taustalla oleva kuva)
- luo peli-ikkuna
- määrittele ja rekisteröi käsittelijäfunktiot
- käynnistä peli-ikkuna
Tästä eteenpäin peli-ikkuna pyörii käsittelijäfunktioiden varassa. Muotojen piirtämistä harjoiteltiin nelosharkassa, ja sieltä kerättyjä oppeja voi soveltaa sellaisenaan.
Koodin suunnittelussa on syytä huomoida, että koska käsittelijäfunktioita kutsuu ns. konepellin alla pyörivä pääsilmukka, et pysty vaikuttamaan siihen mitä argumentteja niille annetaan. Erityisesti pelin tila (kuten kenttä) täytyy hankkia käsittelijöiden tietoon jotain muuta kautta. Suositeltava lähestymistapa on tehdä tilaa varten sanakirja pääohjelmassa. Pääohjelmassa määriteltyä sanakirjaa voidaan muuntuvan luonteensa ansiosta lukea sekä muokata kaikissa funktioissa.
Palautus¶
Palautusaikaraja: 2025-08-31 23:59