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
1

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

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

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

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

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
4

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

$thumb = new Thumbs(__DIR__ . '/image.jpg');
$thumb->crop(650, 450, 250, 150);
$image->output();
PHP
Оригинал
Вырезать часть изображения - Оригинал
Результат
Вырезать часть изображения - Результат
5
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
6

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

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

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

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

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

7

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

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

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

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

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
Копирайт на фотографиях - внизу справа
9

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

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

$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
52631
Предыдущая запись Готовые CSS стили для таблиц
Следующая запись Показать/скрыть пароль

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

Yngvarr Yngvarr
12 июня 2020 в 21:17
Бомбезный сайт у вас, спасибо за материалы, ну прям вот самая годнота собрана!
Oleg Zinin Oleg Zinin
13 июня 2020 в 12:10
Огромное человеческое спасибо автору. Тема долго была актульной для меня, даже написал свой обработчик, но он получился очень громоздкий. А с помощью этой библиотеки, все просто и быстро.
Поставил ваш сайт себе в закладки.
Oleg Zinin Oleg Zinin
16 июня 2020 в 16:02
Столкнулся с непонятной проблемкой при наложении водяного знака. В файле PNG почему то прозрачный фон становится непрозрачным. Вот сам файлик:
Костя Малинкин Костя Малинкин
22 июня 2020 в 23:06
Та же самая проблема.В либе где-то теряются альфа слои видимо.Но не пойму где.
Snipp.ru Snipp.ru
23 июня 2020 в 13:26
Спасибо за комментарии! Баг с прозрачностью исправлен.
Костя Малинкин Костя Малинкин
24 июня 2020 в 19:02
Спасибо за быструю реакцию)Жаль что уже свой вариант данной либы сделал с прозрачностью от 0 до 100)
Radhab Magomedov Radhab Magomedov
7 мая 2022 в 16:18
При обработке webp делает чёрный фон. Хотелось бы сохранить прозрачность или хотя бы чтобы был белый фон
Niakitomi Nia Niakitomi Nia
15 июня 2021 в 15:53
Работает.
Пол дня блин потратил, а тут раз и всё заработало.
Radhab Magomedov Radhab Magomedov
28 сентября 2021 в 14:03
Огромное спасибо за годный скрипт. Просто охренел от удобства использования.
Отправил небольшую шабашку 😉
Дмитрий Светлов Дмитрий Светлов
12 ноября 2021 в 21:21
Спасибо за класс, было бы еще здорово функцию clone прикрутить.
Radhab Magomedov Radhab Magomedov
20 апреля 2022 в 13:13
Здравствуйте. Столкнулся с проблемой. При обработке некоторых изображений webp фон становится чёрным.
Обработку делаю следующим образом:
$image = new Image( "temp/{$name}" );

//Большое изображение
$image->reduce(1000, 1000);
$image->saveWEBP("uploads/{$name_webp}",90);

//Превьюшка
$image->thumb(270, 270);
$image->saveWEBP("uploads/thumbnails/{$name_webp}",90);

Помогите, пожалуйста, разобраться с проблемой. Спасибо.
Лена Симонова Лена Симонова
26 апреля 2022 в 21:19
Здравствуйте. Столкнулась с такой проблемой. Если на телефоне (в данном случае айфон, но, думаю, это не важно) фотография была сделана и к ней в exif добавлена информация об ориентации, то изображение после PHP Thumb выходит перевернутым. Я так понимаю, вся exif информация удаляется PHP Thumb, а в ней как раз и была информация о том, что изображение повернуто на 90 градусов. На хабре, вот здесь, https://qna.habr.com/q/267428 тоже поднимали этот вопрос и по итогу: "Дело 100% в EXIF. Сегодня как раз столкнулся с аналогом фотография повернута на 90 градусов, в EXIF стоит Orientation 90 СW." и там же есть предложили решение. Может как-то и в PHP Thumb сделать возможность это учитывать. Спасибо.
Oleg Zinin Oleg Zinin
23 ноября 2022 в 14:06
Еще вопросик. Подскажите, а если какой нибудь способ редиректа после выполнения данного скрипта. Я уже все перепробовал. И header Location PHP, и JS, и обычный HTML - ничего не помогло.
Дмитрий Иванов Дмитрий Иванов
14 января 2023 в 16:05
Что значит
$image->output();
в браузер выводит какие то кракозябры, а как в браузере увидеть получившееся изображение не сохраняя его на диск ?

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

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

Генерация превьюшек изображений на лету
В движках интернет магазинов, часто при добавлении товара и загрузке его фото, на сервере сразу генерируются превью...
6924
+4
Мануал по созданию и форматированию excel файлов в PHPExcel
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
141524
+36
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
70975
+35
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
242609
+22
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
30610
+7
Contenteditable – текстовый редактор
Если добавить атрибут contenteditable к элементу, его содержимое становится доступно для редактирования пользователю, а...
47473
+35