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

317

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

Створення власного класу ресайза зображень. Частина 1Створення власного класу ресайза зображень. Частина 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.

На даному етапі ми зробимо невеличку перерву і продовжимо в наступному уроці. Використовувати даний клас ми будемо наступним чином:

getMessage();
}
?>

Всього Вам доброго і вдалого кодування!!!