PHP-класс для создания миниатюр изображений

PHP Thumb – это библиотека, основанная на PHP GD и предназначена для создания превью изображений для каталогов, товаров и т.д. В ней есть возможность изменять и ограничивать размер, подгонять изображения под нужный формат, поворачивать изображения и накладывать водяные знаки.

Быстрый старт

Ограничение размера до 2000px и наложение копирайта:

require_once __DIR__ . '/thumbs.php';

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->reduce(2000, 2000);
$image->watermark(__DIR__ . '/watermark.png', 'center');
$image->save();
PHP

Создание превью 300x200 и отдача в браузер:

require_once __DIR__ . '/thumbs.php';

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->thumb(300, 200);
$image->output();
PHP

Для отлова ошибок доступны исключения:

try {
	$image = new Thumbs(__DIR__ . '/файл');
	$image->thumb(300, 300);
	$image->save();	
} catch (Exception $error) {
	echo $error; // Выведет: файл не найден
}
PHP

$img->resize($width, $height) – изменяет размер изображения. Один из параметров может быть нулевым, так картинка не растянется, сохранив свои пропорции.

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->resize(250, 0);
$image->output();
PHP
Оригинал
640x426px
Пример изменения размера изображения - оригинал
Результат
250x167px
Пример изменения размера изображения - результат

reduce($max_width, $max_height) – метод для пропорционально уменьшения изображений до заданных размеров. Если высота или ширина меньше установленных рамок, то фото остается без изменений.

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->reduce(2000, 0);
$image->output();
PHP

resizeCanvas($width, $height, $bg) – метод для изменения размера холста изображения.

Параметр $bg устанавливает RGB-цвет фона в виде массива, для PNG-изображений пустой $bg оставит фон прозрачным.

Пример №1:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->resizeCanvas(640, 640, array(255, 255, 255));
$image->output();
PHP

Пример №2:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->resizeCanvas(1000, 1000, array(0, 0, 0));
$image->output();
PHP
Оригинал
640x426px
Изменение размера холста - оригинал
Пример №1
640x640px
Изменение размера холста - Пример №1
Пример №2
1000x1000px
Изменение размера холста - Пример №2

crop($x, $y, $width, $height) – вырезает часть изображения с отступом $x и $y от верхнего левого края с размером $width и $height.

$thumb = new Thumbs(__DIR__ . '/image.jpg');
$thumb->crop(650, 450, 250, 150);
$image->output();
PHP
Оригинал
Вырезать часть изображения - Оригинал
Результат
Вырезать часть изображения - Результат
cut($width, $height) – метод «вписывает» изображение в заданную область, уменьшая или увеличивая его и отрезает то что не вошло.

Пример №1:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->cut(300, 200);
$image->output();
PHP

Пример №2:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->cut(300, 300);
$image->output();
PHP
Оригинал
640x320px
Вписать изображение в область - Оригинал
Пример №1
300x200px
Вписать изображение в область - Пример №1
Пример №2
300x300px
Вписать изображение в область - Пример №2

thumb($width, $height) – основной метод для создание превью, уменьшает изображение, пытаясь вписать его в заданную область. Если у картинки однородный фон, то пытается его дорисовать, в противном случаи идет обрезка по краям.

Работает не всегда корректно из-за градиента цветов в фоне изображения, и не подходит для изображений с нарисованными линиями по краям.

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->thumb(300, 200);
$image->save(__DIR__ . '/new.png');
PHP

Оригинальные изображения:

После метода thumb:

Поворот на 90° по часовой стрелки:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->rotateRight();
$image->output();
PHP

Поворот на 90° против часовой стрелки:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->rotateLeft();
$image->output()
PHP
Оригинал
Поворот изображения - оригинал
По часовой стрелки
Поворот изображения - по часовой стрелки
Против часовой стрелки
Поворот изображения - против часовой стрелки

watermark($file, $position, $transparency) – накладывает изображение копирайта на исходное изображение.

  • $file – путь до файла водяного знака.
  • $position – позиция (center, top-left, top, top-right, right, bottom-right, bottom, bottom-left, left).
  • $transparency – уровень прозрачности, 0 - прозрачный, 1 - полностью виден.

В центре:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->watermark(__DIR__ . '/watermark.png', 'center', 50);
$image->output();
PHP

Внизу слева:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->watermark(__DIR__ . '/watermark.png', 'bottom-left', 50);
$image->output();
PHP

Внизу справа:

$image = new Thumbs(__DIR__ . '/image.jpg');
$image->watermark(__DIR__ . '/watermark.png', 'bottom-right', 50);
$image->output();
PHP
Оригинальное изображение
Копирайт на фотографиях - оригинал
Изображение копирайта
Копирайт на фотографиях - изображение копирайта
center
Копирайт на фотографиях - в центре
bottom-left
Копирайт на фотографиях - внизу слева
bottom-right
Копирайт на фотографиях - внизу справа

В классе есть несколько методов для сохранения результата.

Сохранение в открытый файл:

$image->save();
PHP

Сохранение в файл JPG:

$image->saveJpg(__DIR__ . '/new.jpg', 90);
PHP

Сохранение в файл PNG:

$image->savePNG(__DIR__ . '/new.png');
PHP

Сохранение в файл GIF:

$image->saveGIF(__DIR__ . '/new.gif');
PHP

Сохранение в файл WEBP:

$image->saveWEBP(__DIR__ . '/new.webp', 90);
PHP

Вывод изображения в браузер

$image->output();
PHP

Также есть метод, который одновременно сохранит результат в новый файл и отправит его в браузер.

$image->saveOut(__DIR__ . '/new.jpg', 90);
PHP
05.04.2020, обновлено 23.06.2020
25943
Предыдущая запись Готовые CSS стили для таблиц
Следующая запись Показать/скрыть пароль

Комментарии 9

Yngvarr Yngvarr
12 июня 2020 в 21:17
0
Бомбезный сайт у вас, спасибо за материалы, ну прям вот самая годнота собрана!
Oleg Zinin Oleg Zinin
13 июня 2020 в 12:10
0
Огромное человеческое спасибо автору. Тема долго была актульной для меня, даже написал свой обработчик, но он получился очень громоздкий. А с помощью этой библиотеки, все просто и быстро.
Поставил ваш сайт себе в закладки.
Oleg Zinin Oleg Zinin
16 июня 2020 в 16:02
0
Столкнулся с непонятной проблемкой при наложении водяного знака. В файле PNG почему то прозрачный фон становится непрозрачным. Вот сам файлик:
Костя Малинкин Костя Малинкин
22 июня 2020 в 23:06
0
Та же самая проблема.В либе где-то теряются альфа слои видимо.Но не пойму где.
Snipp.ru Snipp.ru
23 июня 2020 в 13:26
+1
Спасибо за комментарии! Баг с прозрачностью исправлен.
Костя Малинкин Костя Малинкин
24 июня 2020 в 19:02
0
Спасибо за быструю реакцию)Жаль что уже свой вариант данной либы сделал с прозрачностью от 0 до 100)
Niakitomi Nia Niakitomi Nia
15 июня 2021 в 15:53
0
Работает.
Пол дня блин потратил, а тут раз и всё заработало.
Radhab Magomedov Radhab Magomedov
28 сентября 2021 в 14:03
+1
Огромное спасибо за годный скрипт. Просто охренел от удобства использования.
Отправил небольшую шабашку 😉
Дмитрий Светлов Дмитрий Светлов
12 ноября 2021 в 21:21
0
Спасибо за класс, было бы еще здорово функцию clone прикрутить.

, чтобы добавить комментарий.

Другие публикации

Генерация превьюшек изображений на лету
В движках интернет магазинов, часто при добавлении товара и загрузке его фото, на сервере сразу генерируются превью...
3437
+2
Мануал по созданию и форматированию excel файлов в PHPExcel
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
68390
+22
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
39832
+25
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
115599
+16
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
15871
+8
Contenteditable – текстовый редактор
Если добавить атрибут contenteditable к элементу, его содержимое становится доступно для редактирования пользователю, а...
21991
+25