title: PHP Resize image and save as transparent PNG
body: <p>What have I done wrong? It works with jpg and gif but not <strong>transparent</strong> png files. Checked some of the other questions but didn't understand since I am not that good with php. Would really appreciate if some one could fix this! </p>
  
  <pre><code>&lt;?php
     # ========================================================================#
     #  Requires : Requires PHP5, GD library.
     #  Usage Example:
     #                     include("resize_class.php");
     #                     $resizeObj = new resize('images/cars/large/input.jpg');
     #                     $resizeObj -&gt; resizeImage(150, 100, 0);
     #                     $resizeObj -&gt; saveImage('images/cars/large/output.jpg', 100);
     # ========================================================================#
  
  
          class resize
          {
              // *** Class variables
              private $image;
              private $width;
              private $height;
              private $imageResized;
  
              function __construct($fileName)
              {
                  // *** Open up the file
                  $this-&gt;image = $this-&gt;openImage($fileName);
  
                  // *** Get width and height
                  $this-&gt;width  = imagesx($this-&gt;image);
                  $this-&gt;height = imagesy($this-&gt;image);
              }
  
              ## --------------------------------------------------------
  
              private function openImage($file)
              {
                  // *** Get extension
                  $extension = strtolower(strrchr($file, '.'));
  
                  switch($extension)
                  {
                      case '.jpg':
                      case '.jpeg':
                          $img = @imagecreatefromjpeg($file);
                          break;
                      case '.gif':
                          $img = @imagecreatefromgif($file);
                          break;
                      case '.png':
                          $img = @imagecreatefrompng($file);
                          break;
                      default:
                          $img = false;
                          break;
                  }
                  return $img;
              }
  
              ## --------------------------------------------------------
  
              public function resizeImage($newWidth, $newHeight, $option="auto")
              {
                  // *** Get optimal width and height - based on $option
                  $optionArray = $this-&gt;getDimensions($newWidth, $newHeight, $option);
  
                  $optimalWidth  = $optionArray['optimalWidth'];
                  $optimalHeight = $optionArray['optimalHeight'];
  
  
                  // *** Resample - create image canvas of x, y size
                  $this-&gt;imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
                  imagecopyresampled($this-&gt;imageResized, $this-&gt;image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this-&gt;width, $this-&gt;height);
  
  
                  // *** if option is 'crop', then crop too
                  if ($option == 'crop') {
                      $this-&gt;crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
                  }
              }
  
              ## --------------------------------------------------------
  
              private function getDimensions($newWidth, $newHeight, $option)
              {
  
                 switch ($option)
                  {
                      case 'exact':
                          $optimalWidth = $newWidth;
                          $optimalHeight= $newHeight;
                          break;
                      case 'portrait':
                          $optimalWidth = $this-&gt;getSizeByFixedHeight($newHeight);
                          $optimalHeight= $newHeight;
                          break;
                      case 'landscape':
                          $optimalWidth = $newWidth;
                          $optimalHeight= $this-&gt;getSizeByFixedWidth($newWidth);
                          break;
                      case 'auto':
                          $optionArray = $this-&gt;getSizeByAuto($newWidth, $newHeight);
                          $optimalWidth = $optionArray['optimalWidth'];
                          $optimalHeight = $optionArray['optimalHeight'];
                          break;
                      case 'crop':
                          $optionArray = $this-&gt;getOptimalCrop($newWidth, $newHeight);
                          $optimalWidth = $optionArray['optimalWidth'];
                          $optimalHeight = $optionArray['optimalHeight'];
                          break;
                  }
                  return array('optimalWidth' =&gt; $optimalWidth, 'optimalHeight' =&gt; $optimalHeight);
              }
  
              ## --------------------------------------------------------
  
              private function getSizeByFixedHeight($newHeight)
              {
                  $ratio = $this-&gt;width / $this-&gt;height;
                  $newWidth = $newHeight * $ratio;
                  return $newWidth;
              }
  
              private function getSizeByFixedWidth($newWidth)
              {
                  $ratio = $this-&gt;height / $this-&gt;width;
                  $newHeight = $newWidth * $ratio;
                  return $newHeight;
              }
  
              private function getSizeByAuto($newWidth, $newHeight)
              {
                  if ($this-&gt;height &lt; $this-&gt;width)
                  // *** Image to be resized is wider (landscape)
                  {
                      $optimalWidth = $newWidth;
                      $optimalHeight= $this-&gt;getSizeByFixedWidth($newWidth);
                  }
                  elseif ($this-&gt;height &gt; $this-&gt;width)
                  // *** Image to be resized is taller (portrait)
                  {
                      $optimalWidth = $this-&gt;getSizeByFixedHeight($newHeight);
                      $optimalHeight= $newHeight;
                  }
                  else
                  // *** Image to be resizerd is a square
                  {
                      if ($newHeight &lt; $newWidth) {
                          $optimalWidth = $newWidth;
                          $optimalHeight= $this-&gt;getSizeByFixedWidth($newWidth);
                      } else if ($newHeight &gt; $newWidth) {
                          $optimalWidth = $this-&gt;getSizeByFixedHeight($newHeight);
                          $optimalHeight= $newHeight;
                      } else {
                          // *** Sqaure being resized to a square
                          $optimalWidth = $newWidth;
                          $optimalHeight= $newHeight;
                      }
                  }
  
                  return array('optimalWidth' =&gt; $optimalWidth, 'optimalHeight' =&gt; $optimalHeight);
              }
  
              ## --------------------------------------------------------
  
              private function getOptimalCrop($newWidth, $newHeight)
              {
  
                  $heightRatio = $this-&gt;height / $newHeight;
                  $widthRatio  = $this-&gt;width /  $newWidth;
  
                  if ($heightRatio &lt; $widthRatio) {
                      $optimalRatio = $heightRatio;
                  } else {
                      $optimalRatio = $widthRatio;
                  }
  
                  $optimalHeight = $this-&gt;height / $optimalRatio;
                  $optimalWidth  = $this-&gt;width  / $optimalRatio;
  
                  return array('optimalWidth' =&gt; $optimalWidth, 'optimalHeight' =&gt; $optimalHeight);
              }
  
              ## --------------------------------------------------------
  
              private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
              {
                  // *** Find center - this will be used for the crop
                  $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
                  $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );
  
                  $crop = $this-&gt;imageResized;
                  //imagedestroy($this-&gt;imageResized);
  
                  // *** Now crop from center to exact requested size
                  $this-&gt;imageResized = imagecreatetruecolor($newWidth , $newHeight);
                  imagecopyresampled($this-&gt;imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
              }
  
              ## --------------------------------------------------------
  
              public function saveImage($savePath, $imageQuality="100")
              {
                  // *** Get extension
                  $extension = strrchr($savePath, '.');
                     $extension = strtolower($extension);
  
                  switch($extension)
                  {
                      case '.jpg':
                      case '.jpeg':
                          if (imagetypes() &amp; IMG_JPG) {
                              imagejpeg($this-&gt;imageResized, $savePath, $imageQuality);
                          }
                          break;
  
                      case '.gif':
                          if (imagetypes() &amp; IMG_GIF) {
                              imagegif($this-&gt;imageResized, $savePath);
                          }
                          break;
  
                      case '.png':
                          // *** Scale quality from 0-100 to 0-9
                          $scaleQuality = round(($imageQuality/100) * 9);
  
                          // *** Invert quality setting as 0 is best, not 9
                          $invertScaleQuality = 9 - $scaleQuality;
  
                          if (imagetypes() &amp; IMG_PNG) {
                               imagepng($this-&gt;imageResized, $savePath, $invertScaleQuality);
                          }
                          break;
  
                      // ... etc
  
                      default:
                          // *** No extension - No save.
                          break;
                  }
  
                  imagedestroy($this-&gt;imageResized);
              }
  
  
              ## --------------------------------------------------------
  
          }
  ?&gt;
  </code></pre>