Разработка класса для изменения изображения с помощью PHP и GD

Данная статья посвящена проблеме изменения размеров изображения с помощью программных средств языка PHP. В основном данная проблема распространена, когда возникает желание загрузить изображение на сервер с модифицированым размером, либо создать на его основе миниатюрную копию. Для решения этой проблемы был разработан специальный класс Image, который позволяет производить эти операции.

За основу была взята библиотека GD, которая входит в языка PHP. Язык программирования PHP позволяет использовать функции библиотеки для реализации класса.

Первым шагом разработки класса является создание конструктора, который принимал путь к изображению в качестве параметра.

function __construct($pathToImage)
{
$this->pathToImage = $pathToImage;
$this->srcImage = $this->createImage($this->pathToImage);
$this->widthLoadImage = imagesx($this->srcImage);
$this->heightLoadImage = imagesy($this->srcImage);
}

 На основе выбранного изображения создается канва размер, которой соответствует размеру изображения. Для определения ширины выбранного изображения используется функция imagesx (), для высоты imagesy ();
Создание канвы в зависимости от типа изображения происходит за счет функции createImage (); При создании канвы тип определяется в зависимости от расширения файла (*.png, *.jpg, *.gif).

private function createImage($pathToImage)
    {
        switch ($this->defTypeImage($pathToImage))
        {
            case ".jpg":
                $resImageSrc = @ImageCreateFromJPEG($pathToImage);
                break;
            case ".gif":
                $resImageSrc = @ImageCreateFromGIF($pathToImage);
                break;
            case ".png":
                $resImageSrc = @ImageCreateFromPNG($pathToImage);
                break;
            default:
                $resImageSrc = -1;
                break;
        }
        return $resImageSrc;
    }

Создание канвы выполняется с помощью функций ImageCreateFromJPEG (), ImageCreateFromGIF (), ImageCreateFromPNG ().

Класс Image имеет два метода изменения изображения симметричный (resizeImageRateably ()) и заданый (resizeImage ()). Выбор методов осуществляется за выбором.

Заданый метод позволяет изменять размер изображения на заданую ширину и высоту. В данном методе выполняется создание новой канвы заданого размера на которую будет скопировано изображение. Копирование канвы осуществляется с помощью функции imagecopyresampled ().

public function resizeImage($newWidth, $newHeight, $quality = 75)
    {
        $this->srcImage = $this->;createImage($this->pathToImage);
        $this->newImage = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($this->newImage, $this->srcImage, 0, 0, 0, 0, $newWidth, $newHeight, $this->widthLoadImage, $this->heightLoadImage);
    }

Метод симмеричного изменения изображения позволяет производить деформацию изображения в зависимости от поставленных условий:

  1. Если в исходном изображении ширина больше высоты то формат изображения пейзаж.
  2. Если в исходном изображении высота больше ширины то формат изображения портрет.
  3. Если в исходном изображении ширина равна высоте то формат изображения квадрат.

В зависимости от форматов производится вычисление оптимальной ширины или выосты (данные вычисления выполняются только для формата пейзаж и портрет так как размер ширины и высоты различен).

Для вычисления оптимального размера ширины и высоты были написаны следующие функции:

Для вычисления оптимальной ширины

private function getNewWidth($newHeight)
    {
        $ratio = $this->widthLoadImage / $this->heightLoadImage;
        $newWidth = $newHeight * $ratio;
        return $newWidth;
    }

Для вычисления оптимальной высоты

private function getNewHeight($newWidth)
    {
        $ratio = $this->heightLoadImage / $this->widthLoadImage;
        $newHeight = $newWidth * $ratio;
        return $newHeight;
    }

После вычисления оптимальных размеров, вызывается метод resizeImage (), где в качестве новых размеров изображения выступают оптимальные. Данный метод вызывается в методе resizeImageRateably ().

Метод saveNewImage () служит для сохранения нового измененного изображения на жестком диске, в качестве параметров принимются путь для сохранения, имя нового файла, качество изображения. Задавать качество можно только изображения формата jpeg и png.

Формат применения класса:
Изменение размера изображения будет выполняться при вызове метода resizeImageRateably с заданными параметрами.

include("Image.class.php");
$Image = new Image("Image.png");
$Image->resizeImageRateably(350, 350, 100);
$Image->saveNewImage("src/", "newImage");

Класс будет функционировать корректно, при условии если веб-серевер поддерживает язык программирования php и на нем установлена библиотека GD.

P.S. Работа над данным классом продолжается, планируется внедрить новые функции для модификации изображений.