<?

set_time_limit(15);

$imgWidth=$_GET['width'];
$imgHeight=$_GET['height'];
$smoothing=$_GET['blur'];
$zoomfactor=$_GET['zoom'];
$blackwhite=$_GET['greyscale'];

header("Content-type: image/png");
$original=imagecreatetruecolor($imgWidth, $imgHeight);
$extra=imagecreatetruecolor($imgWidth, $imgHeight);

// random image generator
for ($i=0; $i<=$imgWidth; $i++){
	for ($j=0; $j<=$imgHeight; $j++){
		if(!$blackwhite)
		{
			imagesetpixel ($original,$i,$j,imagecolorallocate($original,rand(0,255),rand(0,255),rand(0,255)));
		}
		else
		{
			$color = rand(0,255);
			imagesetpixel ($original,$i,$j,imagecolorallocate($original,$color,$color,$color));
		}

	}
}

// smoothing
for ($smooth=1; $smooth<=$smoothing; $smooth++)
{
	for ($i=0; $i<=$imgWidth; $i++){
		for ($j=0; $j<=$imgHeight; $j++){
			imagesetpixel ($extra,$i,$j,setPixel($original,$extra,$i,$j,$imgWidth,$imgHeight));
		}
	}
	$original=$extra;
}

$extra = $original;

if($zoomfactor<=1)
{
	imagepng($extra);
	imagedestroy($extra);
}
else
{
	$newWidth=$imgWidth*$zoomfactor;
	$newHeight=$imgHeight*$zoomfactor;
	$upscale=imagecreatetruecolor($newWidth, $newHeight);
	imagecopyresized($upscale, $extra, 0, 0, 0, 0, $newWidth, $newHeight, $imgWidth, $imgHeight);
	imagepng($upscale);
	imagedestroy($upscale);
}

function setPixel($original, $extra, $i, $j, $width, $height)
{

	$smoothingoffset=5;

	// read all 8 pixels around current pixel
	$rgb[0] = imagecolorat($original, $i-1, $j-1);
	$rgb[1] = imagecolorat($original, $i-1, $j);
	$rgb[2] = imagecolorat($original, $i-1, $j+1);
	$rgb[3] = imagecolorat($original, $i, $j-1);
	$rgb[4] = imagecolorat($original, $i, $j+1);
	$rgb[5] = imagecolorat($original, $i+1, $j-1);
	$rgb[6] = imagecolorat($original, $i+1, $j);
	$rgb[7] = imagecolorat($original, $i+1, $j+1);

	// extract RGB values
	for($x=0; $x<8; $x++)
	{
		$r[$x] = ($rgb[$x] >> 16) & 0xFF;
		$g[$x] = ($rgb[$x] >> 8) & 0xFF;
		$b[$x] = $rgb[$x] & 0xFF;
	}

	// calculate average RGB values
	$ravg = array_sum($r)/8;
	$gavg = array_sum($g)/8;
	$bavg = array_sum($b)/8;

	return imagecolorallocate($extra,rand($ravg-$smoothingoffset,$ravg+$smoothingoffset),rand($gavg-$smoothingoffset,$gavg+$smoothingoffset),rand($bavg-$smoothingoffset,$bavg+$smoothingoffset));
}

?>