0

I would like to optimize images when I upload them to the server.

I have a resizing class:

<?php

        Class resize
        {
            // *** Class variables
            private $image;
            private $width;
            private $height;
            private $imageResized;
            function __construct($fileName)
            {
                // *** Open up the file
                $this->image = $this->openImage($fileName);
                // *** Get width and height
                $this->width  = imagesx($this->image);
                $this->height = imagesy($this->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->getDimensions($newWidth, $newHeight, $option);
                $optimalWidth  = $optionArray['optimalWidth'];
                $optimalHeight = $optionArray['optimalHeight'];
                // *** Resample - create image canvas of x, y size
                $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
                imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);
                // *** if option is 'crop', then crop too
                if ($option == 'crop') {
                    $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
                }
            }
            ## --------------------------------------------------------

            private function getDimensions($newWidth, $newHeight, $option)
            {
               switch ($option)
                {
                    case 'exact':
                        $optimalWidth = $newWidth;
                        $optimalHeight= $newHeight;
                        break;
                    case 'portrait':
                        $optimalWidth = $this->getSizeByFixedHeight($newHeight);
                        $optimalHeight= $newHeight;
                        break;
                    case 'landscape':
                        $optimalWidth = $newWidth;
                        $optimalHeight= $this->getSizeByFixedWidth($newWidth);
                        break;
                    case 'auto':
                        $optionArray = $this->getSizeByAuto($newWidth, $newHeight);
                        $optimalWidth = $optionArray['optimalWidth'];
                        $optimalHeight = $optionArray['optimalHeight'];
                        break;
                    case 'crop':
                        $optionArray = $this->getOptimalCrop($newWidth, $newHeight);
                        $optimalWidth = $optionArray['optimalWidth'];
                        $optimalHeight = $optionArray['optimalHeight'];
                        break;
                }
                return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
            }
            ## --------------------------------------------------------
            private function getSizeByFixedHeight($newHeight)
            {
                $ratio = $this->width / $this->height;
                $newWidth = $newHeight * $ratio;
                return $newWidth;
            }
            private function getSizeByFixedWidth($newWidth)
            {
                $ratio = $this->height / $this->width;
                $newHeight = $newWidth * $ratio;
                return $newHeight;
            }
            private function getSizeByAuto($newWidth, $newHeight)
            {
                if ($this->height < $this->width)
                // *** Image to be resized is wider (landscape)
                {
                    $optimalWidth = $newWidth;
                    $optimalHeight= $this->getSizeByFixedWidth($newWidth);
                }
                elseif ($this->height > $this->width)
                // *** Image to be resized is taller (portrait)
                {
                    $optimalWidth = $this->getSizeByFixedHeight($newHeight);
                    $optimalHeight= $newHeight;
                }
                else
                // *** Image to be resizerd is a square
                {
                    if ($newHeight < $newWidth) {
                        $optimalWidth = $newWidth;
                        $optimalHeight= $this->getSizeByFixedWidth($newWidth);
                    } else if ($newHeight > $newWidth) {
                        $optimalWidth = $this->getSizeByFixedHeight($newHeight);
                        $optimalHeight= $newHeight;
                    } else {
                        // *** Sqaure being resized to a square
                        $optimalWidth = $newWidth;
                        $optimalHeight= $newHeight;
                    }
                }
                return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
            }
            ## --------------------------------------------------------
            private function getOptimalCrop($newWidth, $newHeight)
            {
                $heightRatio = $this->height / $newHeight;
                $widthRatio  = $this->width /  $newWidth;
                if ($heightRatio < $widthRatio) {
                    $optimalRatio = $heightRatio;
                } else {
                    $optimalRatio = $widthRatio;
                }
                $optimalHeight = $this->height / $optimalRatio;
                $optimalWidth  = $this->width  / $optimalRatio;
                return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $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->imageResized;
                //imagedestroy($this->imageResized);
                // *** Now crop from center to exact requested size
                $this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
                imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
            }
            ## --------------------------------------------------------

            /*
             * ->showImage($imageQuality="100")
             * 
             * August 2012, Leonel Rocha (@leonelsr)
             * 
             */
            public function showImage($imageQuality="100")
            {
                header('Content-Type: image/jpeg');
                imagejpeg($this->imageResized, NULL, $imageQuality);
                imagedestroy($this->imageResized);
            }

            ## --------------------------------------------------------

            public function saveImage($savePath, $imageQuality="100")
            {
                // *** Get extension
                $extension = strrchr($savePath, '.');
                $extension = strtolower($extension);
                switch($extension)
                {
                    case '.jpg':
                    case '.jpeg':
                        if (imagetypes() & IMG_JPG) {
                            imagejpeg($this->imageResized, $savePath, $imageQuality);
                        }
                        break;
                    case '.gif':
                        if (imagetypes() & IMG_GIF) {
                            imagegif($this->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() & IMG_PNG) {
                             imagepng($this->imageResized, $savePath, $invertScaleQuality);
                        }
                        break;
                    // ... etc
                    default:
                        // *** No extension - No save.
                        break;
                }
                imagedestroy($this->imageResized);
            }
            ## --------------------------------------------------------
        }
?>

I open images from url:

$data = file_get_contents('https://image.tmdb.org/t/p/w600_and_h900_bestv2/7a5md4Co0R1lbTrZJO8NeXbUEiw.jpg');

And I tried to resize images like this:

include("resize-class.php");

$resizeObj = new resize($data);
$resizeObj -> resizeImage(300, 450, 0);
$resizeObj -> saveImage($title, 25);
$title = $mtitle.'-'.$year.'.jpg';
file_put_contents('images/'.$title, $data);

But this way is uploads the original size and quality of images. I wold like to resize the images to 300x450 and use 25% quality and save them as jpg format. How can I achieve this?

Black
  • 12,789
  • 26
  • 116
  • 196
  • 1
    Before you upload? Do you have PHP on the client side? Use image magic – David Brossard May 06 '18 at 10:36
  • 1
    To crop and/or resize the image before uploading the actual image you will need to use a client side approach. Your best bet is using Javascript to resize the image before uploading it. – Tom Udding May 06 '18 at 11:04
  • 1
    Possible duplicate of [What is the difference between client-side and server-side programming?](https://stackoverflow.com/questions/13840429/what-is-the-difference-between-client-side-and-server-side-programming) – Magnus Eriksson May 06 '18 at 11:15
  • good answer already exist here: https://stackoverflow.com/a/14649689/8508777 – Yosef Tukachinsky May 06 '18 at 11:28
  • He can also resize the picture on server side before storing it... how is this a duplicate of that question @MagnusEriksson ?! – Black May 06 '18 at 11:32
  • @Black - Because the OP specifically asks about how to resize the image using PHP before uploading it to the server, not before storing it. That question shows a misunderstanding/lack of knowledge about server-side and client-side. Since PHP is a server side language, PHP can't do anything with any file before it's been transferred (uploaded) to the server. – Magnus Eriksson May 06 '18 at 11:34
  • Sorry for my bad english. So how can I resize it before I store it? – user7425848 May 06 '18 at 12:12

0 Answers0