<?

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$extra0000$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));
}

?>