Resizing the image in php for viewing purposes only

后端 未结 15 1715
面向向阳花
面向向阳花 2020-12-14 13:09

Okay, the reason I posted this is because I wasn\'t sure what to search for. I\'ll try to explain it as clearly as I can.

Say, I have an image sized 800x600. The box

15条回答
  •  借酒劲吻你
    2020-12-14 13:36

    I use a simple PHP class which has several options for resizing. You can easily store the thumbnails via this class. As @jeroen said, you only have to do it once and they can be cached. It just requires PHP5 and GD library. Here is usage example:

    // *** Include the class
    include("resize-class.php");
    
    // *** 1) Initialise / load image
    $resizeObj = new resize('sample.jpg');
    
    // *** 2) Resize image (options: exact, portrait, landscape, auto, crop)
    $resizeObj -> resizeImage(150, 150, 'crop');
    
    // *** 3) Save image ('image-name', 'quality [int]')
    $resizeObj -> saveImage('sample-resized.jpg', 100);
    

    And this is that class:

    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);
                }
    
                ## --------------------------------------------------------
    
                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);
                }
    
    
                ## --------------------------------------------------------
    
            }
    ?>
    

提交回复
热议问题