eXorithm – Execute Algorithm: View / Run Algorithm constrain_image

Logo Beta

function constrain_image ($image, $width, $height, $mode, $border_color, $transparent_border, $never_scale_up

{

  if (!$image

    throw new Exception'Invalid image');

  

  $iwidth = imagesx$image);

  $iheight = imagesy$image);

  

  if ($never_scale_up) {

    if ($width$iwidth && $height$iheight) {

      $mode = 'crop'

    }

    if ($width$iwidth || $height$iheight) {

      if (($mode=='scale') || ($mode=='scale_crop'))

        $mode = 'crop'

    }

  }

  

  // scaling phase

  switch ($mode) {

  

    case 'scale_crop': // scale and crop

      if ($width$iwidth > $height$iheight) {

        $iheight = round$iheight$width$iwidth);

        $iwidth =  $width

      } else {

        $iwidth =  round$iwidth$height$iheight);

        $iheight = $height

      }

      $image2 = image_create_alpha$iwidth, $iheight);

      imagecopyresampled$image2, $image, 0, 0, 0, 0, $iwidth, $iheight, imagesx$image), imagesy$image));

      break

     

    case 'scale_border': // scale and add borders

      if ($width$iwidth < $height$iheight) {

        $iheight = round$iheight$width$iwidth);

        $iwidth =  $width

      } else {

        $iwidth =  round$iwidth$height$iheight);

        $iheight = $height

      }

      $image2 = image_create_alpha$iwidth, $iheight);

      imagecopyresampled$image2, $image, 0, 0, 0, 0, $iwidth, $iheight, imagesx$image), imagesy$image));

      break

      

    case 'scale': // scale

      $image2 = image_create_alpha$width, $height);

      imagecopyresampled$image2, $image, 0, 0, 0, 0, $width, $height, imagesx$image), imagesy$image));

      break

  

    default

      $image2 = $image

  }

  

  // crop / borders phase

  switch ($mode) {

    case 'crop': 

    case 'scale_crop': 

    case 'scale_border': 

      

      $image3 = image_create_alpha$width, $height);

      

      $r  = hexdecsubstr$border_color, 0, 2));

      $g  = hexdecsubstr$border_color, 2, 2));

      $b  = hexdecsubstr$border_color, 4, 2));

      if ($transparent_border

        $border_color = imagecolorallocatealpha$image3, $r, $g, $b, 127);

      else

        $border_color = imagecolorallocatealpha$image3, $r, $g, $b, 0);

      imagefilledrectangle$image3, 0, 0, $width, $height, $border_color);

      

      // x,y to paste to

      $px = ($iwidth$width)   ? round(($width - $iwidth)/2) : 0;

      $py = ($iheight$height) ? round(($height - $iheight)/2) : 0;

      // x,y to start cut from

      $sx = ($iwidth$width)   ? 0 : round(($iwidth - $width)/2);

      $sy = ($iheight$height) ? 0 : round(($iheight - $height)/2);

      // x,y to end cut at

      $ex = ($iwidth$width)   ? $iwidth : $sx$width

      $ey = ($iheight$height) ? $iheight : $sy$height

      imagecopy$image3, $image2, $px, $py, $sx, $sy, $ex, $ey);

      break

      

    default

      $image3 = $image2

  }

  

  return $image3

}