Heips.
Oon varmaan tuhonnut aivosoluni ryypätessä viimeaikoina, kun en nyt millään keksi ratkaisua tälläiseen ongelmaan. Eli:
On yksi isompi kuva. Se voi olla kuten kuvat yleensä, leveämpi kuin korkea, korkeampi kuin leveä, tai sitten tasasivuinen. Otetaan esimerkkikuvaksi vaikka 2000 * 1000 pikselin kokoinen kuva. Tällöin kuvasuhde 2:1 (varmaankin..)
Nyt tästä kuvasta tarvisi leikata palanen. Voidaan asettaa keinotekoinen rajoitus, että "palasen" koko tarvii olla pienempi kuin alkuperäinen.
Leikitään että palan koko on 600 * 200 pikseliä, jolloin kuvasuhde on eri. Ideana tässä on, että isosta kuvasta ei varsinaisesti tuon kokoista palaa leikata, vaan molempien keskenäisen kuvasuhteen mukaan joko vasen/oikea reunasta jää ilmaa, korkeuden ollessa "täysi" tai vaihtoehtoisesti ylä/ala reunassa on tyhjää ja leveys "täysi".
Tarvitsen siis jonkin loogisen kaavan, miten aina selvitä kumpi suunta on "hallitseva" ja miten paljon alkuperäisestä kuvasta jää reunoille tyhjää. Kun virtuaalisesti voi ajatella, että tuo 200 pikseliä on 1000 pikseliä, niin paljonko "virtuaalisesti" 600 pikseliä on 2000:sta pikselistä? (Vai meneekö se toisinpäin?)
Toivottavasti tästä saa tolkkua..
Kiitos!
Kuvasuhde voi olla esim korkeus/leveys
Kuva1: 1000/2000 = 0.5
Kuva2: 200/600 = 0.333
Joten tuosta voi kai sanoa että Kuvaan 1 verrattuna Kuva2 "hallitsee" vaakasuunnassa koska sen suhdeluku on pienempi kuin Kuva1:n.
Jos haluat leikata kuvasta palasen, niin siihen ei mitään muuntokaavoja tarvitse. Leikkaat vain halutun kokoisen palan. Mikäli tarkoitus on skaalata kuva uuteen kokoon ja tarvittaessa cropata uuteen kuvasuhteeseen, niin se onnistuu ihan ala-asteen matematiikalla.
Pelkkä skaalaus rajoitettuun alaan, vanha kuvasuhde: r = min( width/maxWidth, height/maxHeight ) newWidth = width * r newHeight = height * r
Skaalaus & croppaus täsmälleen rajoitetun alan kokoiseksi, uusi kuvasuhde: r = max( width/newWidth, height/newHeight ) mLeft = (width * r - newWidth) / 2 mTop = (height * r - newHeight) / 2
Width ja height tarkoittavat lähdekuvan mittoja, maxWidth ja maxHeight uuden kuvan maksimikokoa ja newWidth ja newHeight uuden kuvan eksaktia kokoa. Tuo croppauskaava leikkaa molemmilta reunoilta yhtä suuret suikaleet pois eli croppaus tapahtuu kuvan keskelle. X- ja Y-koordinaatit löytyvät muuttujista mLeft ja mTop.
Jätän kaavojen tarkistusvastuun muille. Olen aika huono heittämään tuttujakin kaavoja kylmiltään oikein.
Aihe on jo aika vanha, joten et voi enää vastata siihen.