PHP Code:
function pown($base, $power) {
if ($power < 0) {
return 1 / pow($base, -$power);
}
else {
return pow($base, $power);
}
}
function setpx(&$im,$x,$y,$color) { //image, x coord, y coord, rgba color array; changes image, no return
if ($x>=imagesx($im)||$y>=imagesy($im)||$x<0||$y<0) { return FALSE; }
imagesetpixel($im,$x,$y,imagecolorallocatealpha($im,$color['r'],$color['g'],$color['b'],$color['a']));
}
function applygradientpx($im,$x,$y,$c1,$c2,$dr,$intensity,$repeat=0) {
$dr = gradientrepeat($dr,$repeat);
if($dr>1){$dr=1;}
if($dr<0){$dr=0;}
$dr = (pow($dr,pown(2,$intensity))+(1-pow(1-$dr,pown(2,-$intensity))))/2;
if($dr>1){$dr=1;}
if($dr<0){$dr=0;}
$cdiff = array($c1['r']-$c2['r'],$c1['g']-$c2['g'],$c1['b']-$c2['b'], $c1['a']-$c2['a']);
$r = round($c1['r']-$cdiff[0]*$dr);
$g = round($c1['g']-$cdiff[1]*$dr);
$b = round($c1['b']-$cdiff[2]*$dr);
$a = round($c1['a']-$cdiff[3]*$dr);
$c = array('r'=>$r,'g'=>$g,'b'=>$b,'a'=>$a);
setpx($im,$x,$y,$c);
}
function lineargradient($im,$x1,$y1,$x2,$y2,$c1,$c2,$intensity=0,$repeat=0) {
$len = sqrt((($x1-$x2)*($x1-$x2))+(($y1-$y2)*($y1-$y2)));
$m = -($x1-$x2)/($y1-$y2);
$offset = $y1-$m*$x1;
if ($y1<$y2) { $len = -$len; }
for ($x=0;imagesx($im)>$x;$x++) {
for ($y=0;imagesy($im)>$y;$y++) {
$dist = (($m*$x)-$y+$offset)/sqrt(($m*$m)+1);
$dr = $dist/$len;
applygradientpx($im,$x,$y,$c1,$c2,$dr,$intensity,$repeat);
}
}
return $im;
}
Used within a fairly complex system, so it would need some setup before use.
Bookmarks