Kirjautuminen

Haku

Tehtävät

Koodit: PHP: Varjo kuvalle

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);
}
?>

Kommentit

jrantala [21.04.2004 07:27:39]

#

<?php ja ?> -merkit olis iha hyvä olla ;CC

Tempfile [21.04.2004 15:37:42]

#

juu, nyt löytyy. Luulin tarkistaneeni moneen kertaan mutta silti ne unohtui.

sooda [21.04.2004 17:31:43]

#

saisko demoo, en jaksaisi ite testata :D

T.M. [21.04.2004 20:08:37]

#

Tosiaankin tyhmä scripti.
Mutta kaikesta voi oppia jotain... :P

Tempfile [25.04.2004 20:03:52]

#

Päivitin funktion, nyt se piirtää varjon vain niille pikseleleille, jotka eivät ole taustaväriä.

T.M. [26.04.2004 20:02:38]

#

Laitappas demoa esille

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta