Создание собственного класса ресайза изображений. Часть 1

Создание собственного класса ресайза изображений

От автора: очень часто при создании веб-страниц необходимо работать с различными изображениями. К примеру, при добавлении статьи на сайт обычно необходимо прикрепить как минимум одно изображение к данной статье. При этом размеры загружаемых изображений, как правило, достаточно сильно отличаются от требуемых на сайте. Поэтому начиная с данного урока, мы с Вами будем учиться создавать собственный класс по ресайзу изображений, то есть класс у которого будут описаны методы и свойства, необходимые для изменения размеров изображений.

скачать исходникискачать урок

Введение

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

Как Вы знаете для работы с изображениями, средствами PHP, применяется библиотека GD2, которая представляет собой расширение, поставляемое в комплекте с интерпретатором языка. Поэтому, обязательно убедитесь в том, что данное расширение подключено в Вашем интерепретаторе языка PHP. Для этого необходимо открыть главный конфигурационный файл php.ini и раскомментировать строку extension=php_gd2.dll. После этого необходимо перезапустить веб-сервер Apache.

Создание свойств будущего класса

Итак, первое, что необходимо сделать – это объявить будущий класс:

После этого давайте определимся с его свойствами, которые необходимы для хранения временных данных.

Как Вы видите все свойства объявлены как закрытые (со спецификатором доступа private), так как они используются внутри класса. Теперь подробнее по каждому свойству:

$img – свойство для хранения дескриптора, полной копии исходного изображения. Для работы с изображениями, используя библиотеку GD2, необходимо, в начале, создать в памяти изображение, либо новое, либо копию, что в нашем случае, исходного изображения. И таким образом получить его дескриптор, затем используя полученный дескриптор, можно применять методы библиотеки по редактированию изображения.

$type – тип исходного изображения, которое подлежит ресайзу. Для того что бы создать полную копию изображения в памяти, необходимо использовать одну из стандартных функций, библиотеки GD2, в зависимости от типа изображения (jpg, png, gif и т.д).

$width – свойство для хранения ширины (в пикселях) исходного изображения.

$height– свойство для хранения высоты (в пикселях) исходного изображения.

$imgRes – свойство для хранения дескриптора будущей миниатюры.

Константы класса

Теперь давайте создадим несколько констант класса, которые будут использоваться в качестве настроек по умолчанию:

Подробнее по константам:

WIDTH – ширина по умолчанию, для создаваемых миниатюр;

HEIGHT – высота по умолчанию, для создаваемых миниатюр;

IMAGEEXT – расширение будущего файла миниатюры;

DIRSAVE – папка для сохранения миниатюр.

Создание метода конструктора

Далее, создадим конструктор будущего класса, который будет вызван в момент создания объекта класса:

Итак, для начала, необходимо создать полную копию исходного изображения в памяти. Для этого проверим, существует ли файл с исходным изображением, путь которого передается в качестве параметра конструктору. Если файл не существует, сразу же генерируем исключение, которое будет перехвачено в файле, где создается объект данного класса. Далее определяем тип исходного изображения, используя метод getType(), и в зависимости от типа создаем копию исходного изображения, дескриптор которой записываем в свойство $img. Константы, значения которых используются в операторе switch, возвращаются функцией exif_imagetype(), о которой мы поговорим в конце данного урока. При этом если в данное свойство попадет FALSE, значит, дальнейшая работа класса не возможна и необходимо сгенерировать исключение. После этого определяем ширину и высоту исходного изображения в пикселях и записываем в соответствующие свойства.

Определение типа изображения

Тип исходного изображения можно определить несколькими способами. Самый простой из них, это получить расширение файла и на его основе принять решение о типе файла. К примеру, определить расширение файла можно следующим образом:

То есть в строке $file ищем последнее вхождение символа “.”, и возвращаем часть строки, начиная с данного символа и до конца.

Следующий способ – использование расширения finfo. Начиная с версии PHP 5.3, данное расширение входит в комплект стандартных расширений интерпретатора. Данное расширение позволяет получить различную информацию по интересующим файлам. Для получения типа изображения, необходимо, использовать следующий код (при этом Вы должны убедиться, что расширение подключено в Вашем интерпретаторе):

То есть создаем объект класса и передаем конструктору константу FILEINFO_MIME_TYPE, которая указывает, что необходимо получить mime-type файла. Далее вызываем метод file($file), параметром к которому передаем путь к интересующему файлу. При этом метод вернет mime-type.

Но в данном уроке, для определения типа изображения, мы будем использовать расширение exif, при помощи которого, вы можете работать с мета-данными изображений и соответственно определить его тип. Для этого создадим отдельный метод:

В данном методе, первым делом необходимо определить подключено ли расширение exif, для этого проверяем существование функции exif_imagetype. Если к функции нет доступа, значит, генерируем исключение.

Функция exif_imagetype($path) – определяет тип изображения и возвращает значение соответствующее одной из стандартных констант. Данные константы приведены на странице //php.net/manual/ru/function.exif-imagetype.php, и каждая из них соответствует определенному типу изображения. Которые мы используем в конструкторе класса resImg.

На данном этапе мы сделаем небольшой перерыв и продолжим в следующем уроке. Использовать данный класс мы будем следующим образом:

Всего Вам доброго и удачного кодирования!!!

Метки: ,

Похожие статьи:

Комментарии Вконтакте: