От автора: очень часто при создании веб-страниц необходимо работать с различными изображениями. К примеру, при добавлении статьи на сайт обычно необходимо прикрепить как минимум одно изображение к данной статье. При этом размеры загружаемых изображений, как правило, достаточно сильно отличаются от требуемых на сайте. Поэтому начиная с данного урока, мы с Вами будем учиться создавать собственный класс по ресайзу изображений, то есть класс у которого будут описаны методы и свойства, необходимые для изменения размеров изображений.
Введение
В данном уроке мы начинаем создание класса по ресайзу изображений, то есть класса, у которого определены методы, при помощи которых можно изменить размер исходного изображения. При этом обычно выполняется изменение размеров в меньшую сторону – то есть уменьшение размеров изображений, или если сказать проще создание миниатюры изображения из исходного.
Как Вы знаете для работы с изображениями, средствами PHP, применяется библиотека GD2, которая представляет собой расширение, поставляемое в комплекте с интерпретатором языка. Поэтому, обязательно убедитесь в том, что данное расширение подключено в Вашем интерепретаторе языка PHP. Для этого необходимо открыть главный конфигурационный файл php.ini и раскомментировать строку extension=php_gd2.dll. После этого необходимо перезапустить веб-сервер Apache.
Создание свойств будущего класса
Итак, первое, что необходимо сделать – это объявить будущий класс:
1 2 3 |
class resImg { } |
После этого давайте определимся с его свойствами, которые необходимы для хранения временных данных.
1 2 3 4 5 6 7 8 9 |
class resImg { private $img; private $type; private $width; private $height; private $imgRes; } |
Как Вы видите все свойства объявлены как закрытые (со спецификатором доступа private), так как они используются внутри класса. Теперь подробнее по каждому свойству:
$img – свойство для хранения дескриптора, полной копии исходного изображения. Для работы с изображениями, используя библиотеку GD2, необходимо, в начале, создать в памяти изображение, либо новое, либо копию, что в нашем случае, исходного изображения. И таким образом получить его дескриптор, затем используя полученный дескриптор, можно применять методы библиотеки по редактированию изображения.
$type – тип исходного изображения, которое подлежит ресайзу. Для того что бы создать полную копию изображения в памяти, необходимо использовать одну из стандартных функций, библиотеки GD2, в зависимости от типа изображения (jpg, png, gif и т.д).
$width – свойство для хранения ширины (в пикселях) исходного изображения.
$height– свойство для хранения высоты (в пикселях) исходного изображения.
$imgRes – свойство для хранения дескриптора будущей миниатюры.
Константы класса
Теперь давайте создадим несколько констант класса, которые будут использоваться в качестве настроек по умолчанию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class resImg { private $img; private $type; private $width; private $height; private $imgRes; //////////config//////////////////// const WIDTH = 150; const HEIGHT = 100; const IMAGEEXT = '.jpg'; const DIRSAVE = 'images'; //////////config//////////////////// } |
Подробнее по константам:
WIDTH – ширина по умолчанию, для создаваемых миниатюр;
HEIGHT – высота по умолчанию, для создаваемых миниатюр;
IMAGEEXT – расширение будущего файла миниатюры;
DIRSAVE – папка для сохранения миниатюр.
Создание метода конструктора
Далее, создадим конструктор будущего класса, который будет вызван в момент создания объекта класса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public function __construct($path) { if(!file_exists($path)) { throw new Exception("Данного файла нет"); } $this->type = $this->getType($path); switch($this->type) { case IMAGETYPE_JPEG : $img = imagecreatefromjpeg($path); break; case IMAGETYPE_GIF : $img = imagecreatefromgif($path); break; case IMAGETYPE_PNG : $img = imagecreatefrompng($path); break; case IMAGETYPE_BMP : $img = imagecreatefrombmp($path); break; default: $img = FALSE; } $this->img = $img; if(!$this->img) { throw new Exception("не удалось созждать дескриптор изображения"); } $this->width = imagesx($this->img); $this->height = imagesy($this->img); } |
Итак, для начала, необходимо создать полную копию исходного изображения в памяти. Для этого проверим, существует ли файл с исходным изображением, путь которого передается в качестве параметра конструктору. Если файл не существует, сразу же генерируем исключение, которое будет перехвачено в файле, где создается объект данного класса. Далее определяем тип исходного изображения, используя метод getType(), и в зависимости от типа создаем копию исходного изображения, дескриптор которой записываем в свойство $img. Константы, значения которых используются в операторе switch, возвращаются функцией exif_imagetype(), о которой мы поговорим в конце данного урока. При этом если в данное свойство попадет FALSE, значит, дальнейшая работа класса не возможна и необходимо сгенерировать исключение. После этого определяем ширину и высоту исходного изображения в пикселях и записываем в соответствующие свойства.
Определение типа изображения
Тип исходного изображения можно определить несколькими способами. Самый простой из них, это получить расширение файла и на его основе принять решение о типе файла. К примеру, определить расширение файла можно следующим образом:
1 |
$ext = strtolower(strrchr($file,'.')); |
То есть в строке $file ищем последнее вхождение символа “.”, и возвращаем часть строки, начиная с данного символа и до конца.
Следующий способ – использование расширения finfo. Начиная с версии PHP 5.3, данное расширение входит в комплект стандартных расширений интерпретатора. Данное расширение позволяет получить различную информацию по интересующим файлам. Для получения типа изображения, необходимо, использовать следующий код (при этом Вы должны убедиться, что расширение подключено в Вашем интерпретаторе):
1 2 |
$finfo = new finfo(FILEINFO_MIME_TYPE); $mimetype = $finfo->file($file); |
То есть создаем объект класса и передаем конструктору константу FILEINFO_MIME_TYPE, которая указывает, что необходимо получить mime-type файла. Далее вызываем метод file($file), параметром к которому передаем путь к интересующему файлу. При этом метод вернет mime-type.
Но в данном уроке, для определения типа изображения, мы будем использовать расширение exif, при помощи которого, вы можете работать с мета-данными изображений и соответственно определить его тип. Для этого создадим отдельный метод:
1 2 3 4 5 6 |
private function getType($path) { if(!function_exists('exif_imagetype')) { throw new Exception("Не подключено расширение exif"); } return exif_imagetype($path); } |
В данном методе, первым делом необходимо определить подключено ли расширение exif, для этого проверяем существование функции exif_imagetype. Если к функции нет доступа, значит, генерируем исключение.
Функция exif_imagetype($path) – определяет тип изображения и возвращает значение соответствующее одной из стандартных констант. Данные константы приведены на странице //php.net/manual/ru/function.exif-imagetype.php, и каждая из них соответствует определенному типу изображения. Которые мы используем в конструкторе класса resImg.
На данном этапе мы сделаем небольшой перерыв и продолжим в следующем уроке. Использовать данный класс мы будем следующим образом:
1 2 3 4 5 6 7 8 9 10 11 |
<?php require "resize.class.php"; try { $obj = new resImg('1.jpg'); } catch(Exception $e) { echo $e->getMessage(); } ?> |
Всего Вам доброго и удачного кодирования!!!