В php для работы с изображениями есть замечательная библиотека GD2. С помощью нее можно делать с изображениями различные манипуляции такие, как негатив, оттенки серого, ватермарка, яркость, контраст и др. Все это можно делать, но в самой библиотеке нет API для этого, всю обработку нужно описывать самому. Однако все подобные велосипеды давно написаны и один из лучших на этом поле является класс tulipIP.
В этой статье я расскажу, как работать с данным пакетом на примерах. Для начала небольшая демонстрация работы. До:
.
И после
Пакет TulipIP требует для работы библиотеку gd 2. Скачать его можно здесь Файл Класс tulipIP для работы с изображениями в php Посмотрим, что он умеет:
Возьмем исходное изображение Toyota'ы
Пакет из коробки позволяет применять следующие эффекты к изображению:
crop - обрезание изображения по заданному прямоугольнику
require_once '/tulipIP/tulipIP.class.php'; $image = tulipIP::loadImage('image.jpg'); /*Примечание: метод crop возвращения новый GD ресурс и не оказывает влияние начальное изображение*/ $croped_image= tulipIP::crop($image, $x, $y, $width, $height); /* где $x, $y - координаты верхнего левого угла области, и $width, $height это ее ширина и высота */ /* можно вывести изображение прямо в браузер, не сохраняя его*/ header('Content-type:'.TIP_PNG); tulipIP::saveImage(null, $croped_image); /*а можно и сохранить в файл ./croped-image.jpg */ tulipIP::saveImage('./', $croped_image, TIP_JPG, "croped-image");
flip - отражение по вертикали по горизонтали
$image = tulipIP::loadImage('original.jpg'); $flip_horizental = tulipIP::flip($image, TIP_FLIP_HORIZONTAL); // также доступны TIP_FLIP_VERTICAL и TIP_FLIP_BOTH tulipIP::saveImage('./', $flip_horizental, TIP_PNG, "flp-horizental");
resize - изменение размеров изображения
$image = tulipIP::loadImage('image.jpg'); $resized = tulipIP::resize($image, 100, 100); // простое масштабирование без соблюдения пропорций $resized = tulipIP::resize($image, 100, TIP_FIXED); // масштабирование по ширине, при этом высота будет выбираться пропорционально $resized = tulipIP::resize($image, TIP_FIXED, 150); // масштабирование по высоте см. выше $resized = tulipIP::resize($image, TIP_CURRENT, 150); // оставить ширину прежней tulipIP::saveImage('./', $resized, TIP_PNG, "new"); imagedestroy($resized);
rotate - вращение изображения
$image = tulipIP::loadImage($path); $rotate_image= tulipIP::rotate($image, TIP_ROTATE_LEFT); // вращение против часовой на 90 градусов $rotate_image = tulipIP::rotate($image, TIP_ROTATE_RIGHT);// по часовой $rotate_image_down = tulipIP::rotate($image, TIP_ROTATE_UPSIDE_DOWN);// на 180 градусов tulipIP::saveImage('./', $rotate_image, TIP_PNG, "new");
watermark - добавление ватермарки
$image = tulipIP::loadImage('image.jpg'); $watermark = "../../watermark.png"; // файл ватермарки /** * Вы можете выбрать поддерживаемые положения ватермарки * TIP_TOP_LEFT - верхний левый * TIP_TOP_CENTER - верх по середине * TIP_TOP_RIGHT - верхний правый * * TIP_LEFT_CENTER -- тоже только по середине по выысоте * TIP_CENTER * TIP_RIGHT_CENTER * * TIP_BOTTOM_LEFT - внизу * TIP_BOTTOM_CENTER * TIP_BOTTOM_RIGHT * * TulipIP: не проверяет размеры ватермарки, так что она может даже не влезть в оригинальное изображение */ tulipIP::addWatermark($image, $watermark, TIP_BOTTOM_RIGHT, 0);// где 0 это смещение по ширине tulipIP::saveImage( './', $image, TIP_JPG, "Watermark");
writeTexts - вставка произвольных текстов в изображение
$image = tulipIP::loadImage('image.jpg'); //файл шрифтов в формате TTF или OTF $fontFile = "Comic_Sans_MS.ttf"; // обратите внимание, что если вы хотите писать на русском языке то и шрифт должен поддерживать криллицу // текст который будет записан $text = "Блог разработчик xdan.ru"; $position = TIP_BOTTOM_RIGHT; // позиции поддерживает те же что и на ватермарке $fontSize = 20; // шрифт $angle = 30; // угол надписи $margin = 5; // отступ $color = tulipIP::toRGB("#000"); // цвет tulipIP::addText($image, $fontFile, $text, $position, $margin, $color, $fontSize, $angle); tulipIP::saveImage('./', $image, TIP_JPG, "Watermark");
Различные фильтры:
gray - оттенки серого
$image = tulipIP::loadImage('image.jpg'); $copy = tulipIP::gdClone($image); tulipIP::gray($copy); // оттенки серого tulipIP::saveImage('./', $copy, TIP_PNG, 'gray-filter'); imagedestroy($copy);
negate - негатив фотографии
tulipIP::negate($copy);
gblur - размытие по Гаусу
tulipIP::Gblur($copy, 15);// где 15 это степень размытия
Brightness - яркость изображения, где уровень меняется в диапазоне (-255 255)
tulipIP::brightness($copy, -100); // понизим яркость
contrast - контрастность, диапазон (-100,100)
tulipIP::contrast($copy, -60);
colorize - колоризация цветом
$color = tulipIP::toRGB("#f00"); // вернет array(255,0,0) tulipIP::colorize($copy, $color);
gamma - Гамма-коррекция, где уровень коррекции в диапазоне (0.01,4.99)
tulipIP::gamma($copy, 0.40);
edge - выделение граней объектов
tulipIP::edge($copy);
embos - выделение
$offset = 1; // смещение цветов в диапазоне (1,100) где 1 по умолчанию $normalization = 127; // нормализация цвета в диапазоне (0,360) , 172 - по умолчанию tulipIP::emboss($copy, $offset, $normalization);
Light - осветление
tulipIP::light($copy);
Почти у всех указанных выше методов (кроме watermark, writetext, crop, resize, rotate) есть аналогичные функции для работы с фрагментом изображения. При этом есть два класса функций: первые применяют эффект к указанному фрагменту изображения, 2-ые к той области, которая не входит в указанный фрагмент. Вот таблица поддерживаемых методов:
/* Фильтр Фильтр фрагмента Фильтр для не выделенной области * ======== =============== ======================= * gray() gray_part() gray_invert() * negate() negate_part() negate_invert() * brightness() brightness_part() brightness_invert() * contrast() contrast_part() contrast_invert() * colorize() colorize_part() colorize_invert() * Gblur() Gblur_part() Gblur_invert() * gamma() gamma_part() gamma_invert() * edge() edge_part() edge_invert() * emboss() emboss_part() emboss_invert() * light() light_part() light_invert() * flip() flip_part() flip_invert() */
В методы *_part и *_invert помимо основных параметров подаются еще 4
$x,$y - координаты верхнего левого угла фрагмента
$width,$height - ширина и высота фрагмента
К примеру применим фильтр - оттенки серого к половине изображения
$image = tulipIP::loadImage('image.jpg'); $x = floor(tulipIP::getWidth($image) / 2); $y = 0; $width = $x; // оставшуюся часть $height = tulipIP::getHeight($image); $copy = tulipIP::gdClone($image); tulipIP::gray_part($copy, $x, $y, $width, $height); tulipIP::saveImage('./', $copy, TIP_PNG, 'gray_part'); imagedestroy($copy)
*_invert методы, работают точно также, только применяют эффект не к указанному фрагменту, а к той части изображения которая не входит во фрагмент, т.е. если выше в коде поменять part на invert то мы увидим такой результат
Таким образом при помощи php можно производить интересные эффекты над изображениями без использования громоздких десктопных пакетов типа Photoshop.
Комментарии
Вот посмотри, что делает TimThumb:
http://www.binarymoon.co.uk/demo/
http://www.binarymoon.co.uk/projects/timthumb/