PHP. Новая библиотека для работы с изображениями
PHP

Представляю новую версию библиотеки imgresize!

Скачать и попробовать!

Класс написан на PHP и является оберткой для GD. Перед использованием убедитесь, что ваша инсталляция PHP поддерживает GDlib. А та, в свою очередь, необходимые форматы изображений. Обычно PNG, JPEG (JPG) и GIF.

Со времен публикации предыдущей статьи уже много воды утекло. Библиотека стала более «взрослой» и обзавелась новыми интересными функциями. Кроме того, было исправлено множество недочетов и багов. Итак, что же новенького? Сначала просто списком, потом остановлюсь на каждом пункте подробно:

1. Изменить размер картинки, чтобы не выходила за границы прямоугольника.
2. Ватермарки теперь можно накладывать на gif и png
3. Сохранение прозрачности при работе с gif и png.
4. Появился метод склеивания нескольких картинок по горизонтали
5. Тоже самое, что и п.4, только по вертикали
6. Исправлен метод sharpen, теперь работает корректно

Ну и старые методы, которые остались:
1. Изменить размер по вертикали с сохранением пропорций
2. Тоже самое по горизонтали
3. Автоматический разворот фотографии по данным из exif

Пункт 1. Изменяем размер картинок, чтобы те не выходили за рамки воображаемого прямоугольника. Допустим у нас на страничке есть место под аватар. Пусть 100x150px. Мы загружаем исходную картинку в библиотеку и выполняем метод resampleToRectangle(100, 150). Скрипт находит у картинки наибольшую сторону, допустим это оказалась ширина. Затем, уже внутри, применяется метод resampleToWidth(100). Таким образом сохраняя пропорции, мы изменяем размер методом экстраполяции (со сглаживанием) и можем смело сохранять полученный результат в файл. Теперь наш аватар не выйдет за рамки отведенного под него размера на страничке.

Пункт 2. Раньше при наложении ватермарков на изображения типа PNG появлялись очень неприятные артефакты. Прозрачная ватермарка накладывалась с фоном и закрывала напрочь часть изображения. Конкретно об этой проблеме можно почитать здесь. Теперь же нет ограничений по типу файлов. Единственное, что библиотека не умеет, так это накладывать ватермарки и сохранять прозрачность исходной картинки. Прозрачность пропадает, к сожалению. А к счастью то, что подобная потребность крайне редка. Обычно ватермарки на полупрозрачные изображения никто не клеит.

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

Пункт 4 и 5. Иногда нужно взять несколько изображений и склеить их в одно. Либо по горизонтали, либо по вертикали. Никаких проблем! Используйте методы joinHorizontal() и joinVertical().

Пункт 6. В новых версиях GD из-за путаницы с типами данных, на старой версии стали появляться досадные искажения. Теперь проблема полностью устранена.

Заинтересовались? Прекрасно! Тогда предлагаю перейти от слов к делу и рассмотреть несколько примеров использования. В конце статьи вы найдете архив, специально подготовленный для того, чтобы вы без труда могли опробовать интересующие вас возможности, не прилагая практически никаких усилий. Помимо самой библиотеки и примеров использования, вы найдете несколько картинок. Просто распакуйте и вперед! =)

Подключаем библиотеку:

require_once 'lib/imgresize.php';

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

$img = new imgresize();
$img->load('images/2.jpg'); //Метод вернет true или false
$img->resampleToHeight(200); //Размер в пикселях
$img->sharpen(); //Убирем мыло от ресайза. Не обязательно.
$img->save('images/result.jpg');

resampleToHeight

Тоже самое, только без экстраполяции. Работает очень быстро, но появляются неприятные кубики (песок) по контурам объектов. Подойдет для первичной обработки изображения, либо для обработки не очень важного материала.

$img = new imgresize();
$img->load('images/3.jpg'); //Метод вернет true или false
$img->resizeToHeight(200); //Размер в пикселях
//$img->sharpen(); //Здесь не нужен. Картинка итак слишком резкая
$img->save('images/result.jpg');

Предусмотрен точно такой же набор для уменьшения картинки по ширине resizeToWidth(), resampleToWidth(). Примеров приводить не буду, все тоже самое.

Уменьшаем изображение, чтобы оно не выходило за рамки воображаемого прямоугольника. Очень удобный метод, кроме него по сути редко когда что-то нужно. Уменьшение идет только методом экстраполяции (resample).

$img = new imgresize();
$img->load('images/1.jpg');
//ширина, высота. Можно указать третьим параметром true, тогда картинка будет УВЕЛИЧЕНА
//до приведенных размеров, если исходник окажется меньше. По умолчанию false, то есть 
//изображение останется таким же как было.
$img->resampleToRectangle(200, 200);
$img->sharpen();
$img->save('images/result.jpg');

resampleToRectangle

Теперь давайте наложим на изображение водяной знак (или ватермарк). В папке images лежит уже подготовленный PNG файл и прозрачным фоном. Перед этим можно уменьшить изображение до требуемого размера. Но не после, иначе ватермарк исчезнет. Есть возможность наложить знак на исходник. Тогда последующие преобразования будут происходить уже вместе, как с единой картинкой. Просто передайте ture вторым параметром методу watermark. (Не рекомендуется).

$img = new imgresize();
$img->load('images/2.jpg');
//$img->resampleToRectangle(600, 500); //Если нужно. Либо любой другой метод.
$img->watermark('images/water.png');
//или ватермарку на исходник.
//$img->watermark('images/water.png', true);
$img->save('images/result.png', IMAGETYPE_PNG); //Давайте сохраним в формат PNG.

watermark

Соединим две картинки по горизонтали. Очередность будет зависеть от того в каком порядке загружаются исходники.

$img[0] = new imgresize();
$img[1] = new imgresize();

$img[0]->load('images/2.jpg');
$img[1]->load('images/3.jpg');

$result = new imgresize();
$result->joinHorizontal($img);
//Тут указали тип и качество. По умолчанию 95. Чем выше, тем лучше.
//Только для типа JPEG.
$result->save('images/result.jpg', IMAGETYPE_JPEG, 10);

joinHorizontal

Тоже самое, но по вертикали. Соединим три картинки, сделаем ресайз и склеим с ватермарочкой.

$img[0] = new imgresize();
$img[1] = new imgresize();
$img[2] = new imgresize();

$img[0]->load('images/2.jpg');
$img[1]->load('images/3.jpg');
$img[2]->load('images/1.jpg');

//Можно и вот так, взяв любой экземпляр, но лучше отдельным объектом, 
//как в примере выше
$img[0]->joinVertical($img);
$img[0]->resampleToRectangle(1280, 1024);
$img[0]->watermark('images/water.png');
$img[0]->save('images/result.jpg');

joinVertical

Ватермарка у нас PNG и прозрачная. Давайте ее уменьшим, чтобы убедиться в сохранении прозрачности, вместо появления черного фона.

$img->load('images/water.png');
$img->resampleToWidth(200);
$img->save('images/result.png', IMAGETYPE_PNG);

Забрать библиотеку с примерами!

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