Как изменить размер изображения перед загрузкой с помощью PHP?

Я хочу оптимизировать изображения при загрузке на сервер.

У меня есть класс изменения размера:

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

Открываю изображения с url:

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

И я попытался изменить размер изображений вот так:

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);

Но при этом загружаются изображения исходного размера и качества. Я бы хотел изменить размер изображений до 300x450, использовать качество 25% и сохранить их в формате jpg. Как я могу этого добиться?

Перед загрузкой? У вас есть PHP на стороне клиента? Используйте магию изображения

David Brossard 06.05.2018 12:36

Чтобы обрезать и / или изменить размер изображения перед загрузкой фактического изображения, вам нужно будет использовать подход на стороне клиента. Лучше всего использовать Javascript для изменения размера изображения перед его загрузкой.

Tom Udding 06.05.2018 13:04

хороший ответ уже существует здесь: stackoverflow.com/a/14649689/8508777

Yosef Tukachinsky 06.05.2018 13:28

Он также может изменить размер изображения на стороне сервера перед его сохранением ... как это дубликат того вопроса @MagnusEriksson ?!

Black 06.05.2018 13:32

@Black - Потому что OP конкретно спрашивает о том, как изменить размер изображения с помощью PHP перед загрузкой на сервер, а не перед сохранением. Этот вопрос показывает непонимание / недостаток знаний о серверной и клиентской сторонах. Поскольку PHP является серверным языком, PHP не может ничего сделать с каким-либо файлом до того, как он будет передан (загружен) на сервер.

Magnus Eriksson 06.05.2018 13:34

Извините за мой плохой английский. Итак, как мне изменить его размер перед сохранением?

user7425848 06.05.2018 14:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
1 370
0

Другие вопросы по теме