Sivuillani on koodin pätkä, mikä toimii jpg- ja gif-kuville, mutta ei png:lle. Serverin php versio on 5.jotakin. Sama koodi toimii MBnetin palvelimella, jossa on php 4.jotakin. Missä voisi olla vika?
<?php $image_p = imagecreatetruecolor($uusileveys, $uusikorkeus); if (($paate == "jpg") || ($paate == "jpeg")){ $image = imagecreatefromjpeg($kansio.'/'.$kuvanimi); if (imagecopyresampled($image_p, $image, 0, 0, 0, 0, $uusileveys, $uusikorkeus, $tiedot[0], $tiedot[1])){ if (imagejpeg($image_p, $kansio.'/'.$kuvanimi, 100)){ echo "<br><br>Kuva <b>'$nimi'</b> siirretty ja muutettu kokoon $uusileveys x $uusikorkeus onnistuneesti!"; $valvoja = 2; } else echo "'imagejpeg' ei onnistunut kuvan tekemisessä."; } else echo "'imagecreatefromjpeg' ei onnistunut kuvan tekemisessä."; } else if ($paate == "gif"){ $image = imagecreatefromgif($kansio.'/'.$kuvanimi); if (imagecopyresampled($image_p, $image, 0, 0, 0, 0, $uusileveys, $uusikorkeus, $tiedot[0], $tiedot[1])){ if (imagegif($image_p, $kansio.'/'.$kuvanimi, 100)){ echo "<br><br>Kuva <b>'$nimi'</b> siirretty ja muutettu kokoon $uusileveys x $uusikorkeus onnistuneesti!"; $valvoja = 2; } else echo "'imagegif' ei onnistunut kuvan tekemisessä."; } else echo "'imagecreatefromgif' ei onnistunut kuvan tekemisessä."; } else if ($paate == "png"){ $image = imagecreatefrompng($kansio.'/'.$kuvanimi); if (imagecopyresampled($image_p, $image, 0, 0, 0, 0, $uusileveys, $uusikorkeus, $tiedot[0], $tiedot[1])){ if (imagepng($image_p, $kansio.'/'.$kuvanimi, 100)){ echo "<br><br>Kuva <b>'$nimi'</b> siirretty ja muutettu kokoon $uusileveys x $uusikorkeus onnistuneesti!"; $valvoja = 2; } else echo "'imagepng' ei onnistunut kuvan tekemisessä."; } else echo "'imagecreatefrompng' ei onnistunut kuvan tekemisessä."; }
Mod. lisäsi <?php:n koodin alkuun, jotta väritys toimisi.
Onkohan funktion imagepng kolmas parametri väärin? Manuaalin mukaan siinä kuuluisi olla luku 0:n ja 9:n välillä tai ei mitään. Koodi alkaa ehkä toimia, jos poistat funktion imagepng kolmannen parametrin.
Kokeileppa vaihtaa tämän tilalle:
imagepng($image_p, $kansio.'/'.$kuvanimi, 100)
Tämä:
imagepng($image_p, $kansio.'/'.$kuvanimi, 9)
Php.netin manuaali kertoo, että png:ssä quality annetaan 0-9 asteikoilla toisin kuin jpg, joissa se on 0-100.
edit: Antti ehtikin jo näköjään ensin. Noh..
edit2: Lisäksi vielä voi koittaa näin jos ei tuo quality parametrin muuttaminenkaan auta:
imagepng($image_p, $kansio.'/'.$kuvanimi, 9, null)
Sama koskee myös imagegif-funktiota, paitsi että sillä kolmatta parametria ei kuulu olla lainkaan eikä ylimääräistä arvoa siis huomioida.
Ja koodi toimii ehkä siksi MBnetissä, että aiemmin myöskään imagepng-funktiossa ei ollut lisäparametreja.
Kiitos paljon! Muutin molemmat ja pelitti hienosti.
Hmm, kuvan pienentäminen tiedostomuoto säilyttäen on mielestäni vähän niin ja näin. Jos kuvitellaan semmoinen hömelö tilanne, että kuvaa pienennetään syystä tai toisesta vain yhden pikselin verran, ja tiedostomuotona on GIF, niin pahimmillaan se pienennetty kuva on tiedostomuodoltaan paljon isompi kuin alkuperäinen kuva.
Sama ongelma voi olla myös PNG-kuvilla. Kuvia pienentäessä värimäärät yleensä kasvavat useamman pikselin sulautuessa pienemmälle alalle, vaikka pikselien kokonaismäärä vähenee. Kasvanut värimäärä tietää lisää haastetta pakkaamisen suhteen. Olin joskus optimoinut isohkon kuvan vaivaiselle 16 värille niin että se näytti silti ihan suht hyvältä, sitten muuten vain kokeilin mitä tapahtuu kun pienennän sitä. Lopputuloksena värejä oli kaksi tuhatta ja tiedostokoko oli kait noin kaksinkertainen, vaikka olin pienentänyt kuvan neljännekseen siitä mitä se oli.
Lisäksi yksi asia kannattaa huomioida nykyajan selaimista: ne osaavat näyttää pienennetyt ja suurennetutkin kuvat pehmeästi, enää ei tule pikselimössöjä. Jos vaikka kuvitellaan että sivustolla käytetään kahden eri koon avatareja, niin avatarit voidaan tallettaa isommalla koolla ja sitten näyttää sama avatar kahdessa eri koossa, normaalina ja pienennettynä. Tiedosto on silti sama. Vähemmän ladattavaa käyttäjälle ja lopputulos on silti hyvä tai jopa erinomainen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.