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

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

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

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

Введение

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

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

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

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

class resImg {

}

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

class resImg {
private $img;
	private $type;
	
	private $width;
	private $height;
	
	private $imgRes;
}

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

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

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

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

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

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

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

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

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 – папка для сохранения миниатюр.

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

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

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, значит, дальнейшая работа класса не возможна и необходимо сгенерировать исключение. После этого определяем ширину и высоту исходного изображения в пикселях и записываем в соответствующие свойства.

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

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

$ext = strtolower(strrchr($file,'.'));

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

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

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimetype = $finfo->file($file);

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

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

private function getType($path) {
		if(!function_exists('exif_imagetype')) {
			throw new Exception("Не подключено расширение exif");
		}
		return exif_imagetype($path);
	}

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

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

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

<?php
require "resize.class.php";

try {
	$obj = new resImg('1.jpg');
}
catch(Exception $e) {
	echo $e->getMessage();
}
	
?>

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

Фреймворк YII2: теория и первая практика

Овладейте азами фреймворка Yii2 за 5 дней!

Получить

Метки: ,

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

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree