eXorithm – Execute Algorithm: View / Run Algorithm pixelate

Logo Beta

function pixelate ($image$blocksize

{

  // Based on http://www.tuxradar.com/practicalphp/11/2/24

  

  $imagex = imagesx$image);

  $imagey = imagesy$image);

  

  $image2 = imagecreatetruecolor$imagex$imagey);

  imagesavealpha$image2, true);

  imagealphablending$image2, false);

  

  if ($blocksize<1) {

    $blocksize = 1;

  }

  

  for ($x = 0; $x < $imagex$x += $blocksize) {

    for ($y = 0; $y < $imagey$y += $blocksize) {

      // get the pixel colour at the top-left of the square

      $colour = imagecolorat$image$x$y);

      

      // set the new red, green, blue and alpha values to 0

      $newr = 0;

      $newg = 0;

      $newb = 0;

      $newt = 0;

      

      // create an empty array for the colours

      $colours = array();

      

      // cycle through each pixel in the block

      for ($k = $x$k < $x + $blocksize; ++$k) {

        for ($l = $y$l < $y + $blocksize; ++$l) {

          // if we are outside the valid bounds of the image, use a safe colour

          if ($k < 0) { $colours[] = $colourcontinue; }

          if ($k >= $imagex) { $colours[] = $colourcontinue; }

          if ($l < 0) { $colours[] = $colourcontinue; }

          if ($l >= $imagey) { $colours[] = $colourcontinue; }

          

          // if not outside the image bounds, get the colour at this pixel

          $colours[] = imagecolorat$image$k$l);

        }

      }

      

      // cycle through all the colours we can use for sampling

      foreach$colours as $colour) {

        $colour = imagecolorsforindex$image$colour);

        // add their red, green, and blue values to our master numbers

        $newr += $colour'red'];

        $newg += $colour'green'];

        $newb += $colour'blue'];

        $newt += $colour'alpha'];

      }

      

      // now divide the master numbers by the number of valid samples to get an average

      $numelements = count$colours);

      $newr /= $numelements

      $newg /= $numelements

      $newb /= $numelements

      $newt /= $numelements

      

      // and use the new numbers as our colour

      $newcol = imagecolorallocatealpha$image2$newr$newg$newb$newt);

      imagefilledrectangle$image2$x$y$x + $blocksize - 1, $y + $blocksize - 1, $newcol);

    }

  }

  

  return $image2