PHP

Пропорциональное уменьшение размеров изображения

<?php
 
/** Универсальный ресайз картинок
  *
  * Функция позволяет копировать изображение,
  * оставляя его исходные характеристики или
  * изменяя его размер и/или качество.
  * При изменении размера сохраняются пропорции.
  *
  * Функция умеет работать с изображениями
  * следующих форматов: JPG, PNG, GIF.
  *
  * Параметры:
  * @ $from     - путь к изображению, над которым будут выполняться операции
  * @ $to       - путь к результирующему изображению
  * @ $maxwidth - максимальная ширина изображения
  * @ $maxheight    - максимальная высота изображения
  * @ $quality  - качество картинки (0..100) (для JPG и PNG)
  *
  * Возвращаемые значения:
  * false   - во время выполнения произошла ошибка
  * true    - функция выполнилась успешно и без ошибок
  *
  * Автор:
  * @name   Валерий 'Figaroo' Киркиж
  * @url    http://blogfigaroo.ru/
  * @email  mail@figaroo.ru
*/
function figaroo_resize_image ($from, $to, $maxwidth, $maxheight, $quality = 80) {
        // защита от Null-байт уязвимости PHP
        $from = preg_replace('/\0/uis', '', $from);
        $to = preg_replace('/\0/uis', '', $to);
 
        // информация об изображении
        $imageinfo = @getimagesize($from);
        // если получить информацию не удалось - ошибка
        if (!$imageinfo) return false;
        // получаем параметры изображения
        $width = $imageinfo[0];     // ширина
        $height = $imageinfo[1];    // высота
        $format = $imageinfo[2];    // ID формата (число)
        $mime = $imageinfo['mime']; // mime-тип
 
        // определяем формат и создаём изображения
        switch ($format) {
            case 2: $img = imagecreatefromjpeg($from); break;   // jpg
            case 3: $img = imagecreatefrompng($from); break;    // png
            case 1: $img = imagecreatefromgif($from); break;    // gif
            default: return false; break;
        }
        // если создать изображение не удалось - ошибка
        if (!$img) return false;
 
        // меняем размеры изображения
        $newwidth = $newheight = 0;
        // требуется квадратная картинка
        if ($maxwidth == $maxheight) {
            // размеры картинки больше по X и по Y
            if ($width > $maxwidth && $height > $maxheight) {
                // пропорции картинки одинаковы
                if ($width == $height) {
                    $newwidth = $maxwidth;
                    $newheight = $maxheight;
                }
                // ширина больше
                elseif ($width > $height) {
                    $newwidth = $maxwidth;
                    $newheight = intval(((float)$newwidth / (float)$width) * $height);
                }
                // высота больше
                else {
                    $newheight = $maxheight;
                    $newwidth = intval(((float)$newheight / (float)$height) * $width);
                }
            }
            // размеры картинки больше только по X
            elseif ($width > $maxwidth) {
                $newwidth = $maxwidth;
                $newheight = intval(((float)$newwidth / (float)$width) * $height);
            }
            // размеры картинки больше только по Y
            elseif ($height > $maxheight) {
                $newheight = $maxheight;
                $newwidth = intval(((float)$newheight / (float)$height) * $width);
            }
            // в остальных случаях ничего менять не надо
            else {
                $newwidth = $width;
                $newheight = $height;
            }
        }
        // требуется горизонтальная картинка
        elseif ($maxwidth > $maxheight) {
            // размеры картинки больше по X и по Y
            if ($width > $maxwidth && $height > $maxheight) {
                // ширина больше
                if ($width > $height) {
                    $newwidth = $maxwidth;
                    $newheight = intval(((float)$newwidth / (float)$width) * $height);
                }
                // высота больше или равна ширине
                else {
                    $newheight = $maxheight;
                    $newwidth = intval(((float)$newheight / (float)$height) * $width);
                }
            }
            // размеры картинки больше только по X
            elseif ($width > $maxwidth) {
                $newwidth = $maxwidth;
                $newheight = intval(((float)$newwidth / (float)$width) * $height);
            }
            // размеры картинки больше только по Y
            elseif ($height > $maxheight) {
                $newheight = $maxheight;
                $newwidth = intval(((float)$newheight / (float)$height) * $width);
            }
            // в остальных случаях ничего менять не надо
            else {
                $newwidth = $width;
                $newheight = $height;
            }
        }
        // требуется вертикальная картинка
        elseif ($maxwidth < $maxheight) {
            // размеры картинки больше по X и по Y
            if ($width > $maxwidth && $height > $maxheight) {
                // ширина больше или равна высоте
                if ($width >= $height) {
                    $newwidth = $maxwidth;
                    $newheight = intval(((float)$newwidth / (float)$width) * $height);
                }
                // высота больше
                else {
                    $newheight = $maxheight;
                    $newwidth = intval(((float)$newheight / (float)$height) * $width);
                }
            }
            // размеры картинки больше только по X
            elseif ($width > $maxwidth) {
                $newwidth = $maxwidth;
                $newheight = intval(((float)$newwidth / (float)$width) * $height);
            }
            // размеры картинки больше только по Y
            elseif ($height > $maxheight) {
                $newheight = $maxheight;
                $newwidth = intval(((float)$newheight / (float)$height) * $width);
            }
            // в остальных случаях ничего менять не надо
            else {
                $newwidth = $width;
                $newheight = $height;
            }
        }
 
        // если изменений над картинкой производить не надо - просто копируем её
        if ($newwidth == $width && $newheight == $height && $quality == 80) {
            if (copy($from, $to)) return true;
            else return false;
        }
 
        // создаём новое изображение
        $new = imagecreatetruecolor($newwidth, $newheight);
        $black = imagecolorallocate($new, 0, 0, 0);
        $white = imagecolorallocate($new, 255, 255, 255);
        // копируем старое в новое с учётом новых размеров
        imagefilledrectangle($new, 0, 0, $newwidth - 1, $newheight - 1, $white);
        //imagecolortransparent($new, $white);
        imagecopyresampled($new, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
        // создаём файл с новым изображением
        switch ($format) {
            case 2: // jpg
                if ($quality < 0) $quality = 0;
                if ($quality > 100) $quality = 100;
                imagejpeg($new, $to, $quality);
            break;
            case 3: // png
                $quality = intval($quality * 9 / 100);
                if ($quality < 0) $quality = 0;
                if ($quality > 9) $quality = 9;
                imagepng($new, $to, $quality);
            break;
            case 1: // gif
                imagegif($new, $to);
            break;
        }
        return true;
}
Теги:
resize, images
Добавлено: 04 Апреля 2018 11:45:56 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...