PHP Resize image and save as transparent PNG
<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>