В php для работы с изображениями есть замечательная библиотека GD2. С помощью нее можно делать с изображениями различные манипуляции такие, как негатив, оттенки серого, ватермарка, яркость, контраст и др. Все это можно делать, но в самой библиотеке нет API для этого, всю обработку нужно описывать самому. Однако все подобные велосипеды давно написаны и один из лучших на этом поле является класс tulipIP. 

В этой статье я расскажу, как работать с данным пакетом на примерах. Для начала небольшая демонстрация работы. До:

.Великолепная Элизабет Душку до обработки беблиотекой tulipip php

И после

Великолепная Элизабет Душку после обработки беблиотекой tulipip php

Пакет TulipIP требует для работы библиотеку gd 2. Скачать его можно здесь Файл Класс tulipIP для работы с изображениями в php Посмотрим, что он умеет:

Возьмем исходное изображение Toyota'ы

Исходное изображение 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");

Обрезка изображения toyota при помощи php

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");

Flip изображения toyota при помощи php

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);

 resize изображения toyota при помощи php

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");

Поворот изображения toyota при помощи php

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");

 Ватермарка на изображении toyota при помощи php

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");

Надпись на изображении toyota при помощи php

Различные фильтры:

gray - оттенки серого

$image = tulipIP::loadImage('image.jpg');
$copy = tulipIP::gdClone($image);
tulipIP::gray($copy); // оттенки серого
tulipIP::saveImage('./', $copy, TIP_PNG, 'gray-filter');
imagedestroy($copy);

Оттенки серого изображения toyota при помощи php

negate - негатив фотографии

tulipIP::negate($copy);

Негатив изображения toyota при помощи php

gblur - размытие по Гаусу 

tulipIP::Gblur($copy, 15);// где 15 это степень размытия

Размытие по Гаусу изображения toyota при помощи php

Brightness - яркость изображения, где уровень меняется в диапазоне (-255 255)

tulipIP::brightness($copy, -100); // понизим яркость

Изменение яркости изображения toyota при помощи php gd

contrast - контрастность, диапазон (-100,100)

tulipIP::contrast($copy, -60);

Изменение контраста изображения toyota при помощи php gd

colorize - колоризация цветом 

$color = tulipIP::toRGB("#f00"); // вернет array(255,0,0)
tulipIP::colorize($copy, $color);

Колоризация изображения toyota при помощи php gd

gamma - Гамма-коррекция, где уровень коррекции в диапазоне (0.01,4.99)

tulipIP::gamma($copy, 0.40);

Фильтр gamma изображения toyota при помощи php gd

edge - выделение граней объектов

tulipIP::edge($copy);

Фильтр edge изображения toyota при помощи php gd

embos - выделение

$offset = 1; // смещение цветов в диапазоне (1,100) где 1 по умолчанию
$normalization = 127; // нормализация цвета в диапазоне (0,360) , 172 - по умолчанию
tulipIP::emboss($copy, $offset, $normalization);

Фильтр emboss изображения toyota при помощи php gd

Light - осветление

tulipIP::light($copy);

Фильтр light изображения toyota при помощи php gd

Почти у всех указанных выше методов (кроме 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)

Применение фильтра оттенки серого к фрагменту изображения toyota при помощи php gd

*_invert методы, работают точно также, только применяют эффект не к указанному фрагменту, а к той части изображения которая не входит во фрагмент, т.е. если выше в коде поменять part на invert то мы увидим такой результат

Применение фильтра оттенки серого к не выделенной части  изображения toyota при помощи php gd

Таким образом при помощи php можно производить интересные эффекты над изображениями без использования громоздких десктопных пакетов типа Photoshop.

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

Kostia
# Kostia 19.07.2012 12:36
Подобие TimThumb. Причём в худшем виде.

Вот посмотри, что делает TimThumb:

http://www.binarymoon.co.uk/demo/



http://www.binarymoon.co.uk/projects/timthumb/
Leroy
# Leroy 20.07.2012 00:43
Ну не сказал бы, что хуже. Не нашел ватермарки и вставки текста. Однако это всего лишь одна из альтернатив, я же не написал, что она лучшая. Просто я выбрал ее для обзора и для проекта