Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Kuvasuhteista

runeberg [19.04.2011 06:46:04]

#

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!

User137 [19.04.2011 07:23:36]

#

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.

The Alchemist [19.04.2011 07:24:36]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta