Kirjoittaja: Tempfile
Kirjoitettu: 20.04.2004 – 20.04.2004
Tagit: grafiikka, koodi näytille, vinkki
Päivitetty 25.4.04
Tämä nyt vähemmän tyhmä skripti lisää annettuun kuvaan halutun värisen varjon. Aiemmin se ei tajunnut kuvien taustasta mitään, joten se piirsi vain suorakulmion muotoisia varjoja, mutta reipastuin ja koodasin uuden, älykkäämmän version. Se toimii siten, että se piirtää jokaista ei-taustaväriä olevaa pikseliä kohden yhden varjon värisen pikselin uuteen kuvaan, ja kopioi sen jälkeen lähtökuvan vastaavat pikselit varjon päälle.
Funktiolle pitää määritellä parametreissä haluttu kuvatiedosto, varjon etäisyys kuvasta pikseleinä(x,y, voi olla negatiivinen), kuvan läpinäkyvä väri, jota käytetään myös uuden kuvan taustana, sekä varjon väri.
Kiitokset Irksomelle heksakoodin muunnosta rgb:ksi, laiskuuttani en jaksanut koodata itse.
<?php function shadow($file, $distancex, $distancey, $background, $shadow){ //luodaan kuvat ja selvitetään mitat $srcimage = imagecreatefrompng($file); $x = imagesx($srcimage); $y = imagesy($srcimage); $newx = $x + abs($distancex); $newy = $y + abs($distancey); $newimage = imagecreatetruecolor($newx, $newy); // Muutetaan annetut värit rgb:ksi, kiitokset Irksomelle $background = str_replace("#", "", $background); $shadow = str_replace("#", "", $shadow); $backgroundrgb = array(hexdec(substr($background, 0, 2)),hexdec(substr($background, 2, 2)),hexdec(substr($background, 4, 2))); $shadowrgb = array(hexdec(substr($shadow, 0, 2)),hexdec(substr($shadow, 2, 2)),hexdec(substr($shadow, 4, 2))); //asetetaan värit $bgcolor = imagecolorallocate($newimage, $backgroundrgb[0], $backgroundrgb[1], $backgroundrgb[2]); $swcolor = imagecolorallocate($newimage, $shadowrgb[0], $shadowrgb[1], $shadowrgb[2]); //piirretään tausta imagefilledrectangle($newimage, 0,0,$newx,$newy, $bgcolor); //piirretään varjo for($i = 0; $i <= $y; $i++){ for($j = 0; $j <= $x; $j++){ if(imagecolorat($srcimage, $j, $i) != imagecolorresolve($srcimage, $backgroundrgb[0], $backgroundrgb[1], $backgroundrgb[2])){ if($distancex >= 0 && $distancey >= 0){ imagesetpixel($newimage, $j+$distancex, $i+$distancey, $swcolor); } else if($distancex > 0 && $distancey < 0){ imagesetpixel($newimage, $j+$distancex, $i, $swcolor); } else if($distancex < 0 && $distancey < 0){ imagesetpixel($newimage, $j, $i, $swcolor); } else if($distancex < 0 && $distancey > 0){ imagesetpixel($newimage, $j, $i+$distancey, $swcolor); } } } } //kopioidaan kuva sen päälle for($i = 0; $i < $y; $i++){ for($j = 0; $j < $x; $j++){ if(imagecolorat($srcimage, $j, $i) != imagecolorresolve($srcimage, $backgroundrgb[0], $backgroundrgb[1], $backgroundrgb[2])){ if($distancex >= 0 && $distancey >= 0){ imagecopy($newimage, $srcimage, $j, $i, $j, $i, 1, 1); } else if($distancex > 0 && $distancey < 0){ imagecopy($newimage, $srcimage, $j, $i-$distancey, $j, $i, 1, 1); } else if($distancex < 0 && $distancey < 0){ imagecopy($newimage, $srcimage, $j-$distancex, $i-$distancey, $j, $i, 1, 1); } else if($distancex < 0 && $distancey > 0){ imagecopy($newimage, $srcimage, $j-$distancex, $i, $j, $i, 1, 1); } } } } // tulostetaan kuva varjoineen kaikkineen header("Content-type: image/png"); imagepng($newimage); //hävitetään kuvat muistista imagedestroy($srcimage); imagedestroy($newimage); } ?>
<?php ja ?> -merkit olis iha hyvä olla ;CC
juu, nyt löytyy. Luulin tarkistaneeni moneen kertaan mutta silti ne unohtui.
saisko demoo, en jaksaisi ite testata :D
Tosiaankin tyhmä scripti.
Mutta kaikesta voi oppia jotain... :P
Päivitin funktion, nyt se piirtää varjon vain niille pikseleleille, jotka eivät ole taustaväriä.
Laitappas demoa esille