В прошлой статье я уже писал о том, как устанавливать библиотеку Imagick. Сейчас рассмотрим несколько примеров, показывающих, что данная библиотека может сделать с изображением.
Базовый пример использования
try{
$image = new \Imagick();
$file = 'gallery/IMG_0001.JPG';
$image->readImage($file);
echo '<img src="./Manipulating-Images-with-PHP-and-GraphicsMagick/' . $file
. '" width="200" height="150" /> <br/>';
// get image height and width
echo 'Image dimensions: ' . $image->getImageWidth() . ' x ' . $image->getImageHeight() . '<br/>';
// get image format
echo 'Image format: ' . $image->getImageFormat() . '<br/>';
// get image depth
echo 'Image depth: ' . $image->getImageDepth() . '<br/>';
// get number of unique image colors
echo 'Image colors: ' . $image->getImageColors() . '<br/>';
// get image resolution
$r = $image->getImageResolution();
echo 'Image resolution: ' . $r['x'] . 'x' . $r['y'] . '<br/>';
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Создание превью-изображений
$thumb = new Imagick();
//читаем картинку по полному пути
$thumb->readImage($fullpath)
//создаем белый фон
$canvas = new Imagick();
$canvas->newImage($width, $height, new ImagickPixel("white"));
//делаем превью, размер меньше, чем у фона, чтобы было куда впихнуть тень
$thumb->thumbnailImage($width-10, $height-10);
//наводим резкость, если превью мелкое
if ($width < 300)
$thumb->sharpenImage(4, 1);
//закругляем углы
$thumb->roundCorners(5, 5);
//делаем копию превьюхи, чтобы сделать тень
$shadow = $thumb->clone();
//цвет тени
$shadow->setImageBackgroundColor(new ImagickPixel('black'));
//собственно, делаем тень
$shadow->shadowImage(80, 2.5, 5, 5);
//накладываем тень на фон
$canvas->compositeImage($shadow, $shadow->getImageCompose(), 0, 0);
//накладываем превью на фон
$canvas->compositeImage($thumb, $thumb->getImageCompose(), 0, 0);
//убираем комменты и т.п. из картинки
$canvas->stripImage();
//записываем картинку
$canvas->writeImage($writeTo);
//подчищаем за собой
$canvas->destroy();
$shadow->destroy();
$thumb->destroy();
Наложение водяного знака
$image = new Imagick("path_to_img");
//Watermark текст
$text = 'watermark';
//Создаем палитру
$draw = new ImagickDraw();
//Устанавливаем свойства Watermark текста
$draw->setFont('Arial');
$draw->setFontSize(14);
$draw->setFillColor('black');
//Текст позиционируем в правом нижнем углу изображения
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);
//Рисуем текст на картинке
$image->annotateImage($draw, 10, 12, 0, $text);
//Рисуем текст на картинке с небольшим смещением и уже белым цветом
$draw->setFillColor('white');
$image->annotateImage($draw, 11, 11, 0, $text);
$image->writeImage("path_to_img");
$image->destroy();
Масштабирование
Для примера просто увеличим изображение в 1,5 раза:
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// set height and width as 150% of original
$height = $image->getImageHeight() * 1.5;
$width = $image->getImageWidth() * 1.5;
// resize image
$image->resizeImage($width, $height, null, 1);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Повернуть изображение
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// rotate image
$image->rotateImage('red', -45);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Зеркальное отражение
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// flip image vertically
$image->flipImage();
// write new image file
$image->writeImage('gallery/new_1.jpg');
// revert
$image->flipImage();
// flip image horizontally
$image->flopImage();
// write new image file
$image->writeImage('gallery/new_2.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Вырезать часть изображения
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// crop image
$image->cropImage(122, 70, 76, 138);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Увеличение/уменьшение изображения вдвое
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// magnify image 2x
$image->magnifyImage();
// write new image file
$image->writeImage('gallery/new_1.jpg');
// revert
$image->minifyImage();
// scale image to half
$image->minifyImage();
// write new image file
$image->writeImage('gallery/new_2.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Преобразование типа изображения
Иногда бывает так, что изображение загружено в неугодном формате и нужно формат сменить. Для этого существует специальная функция
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// switch to GIF format
$image->setImageFormat('GIF');
// write new image file
$image->writeImage('gallery/new.gif');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Добавить рамку к изображению
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// add border to image
$image->borderImage('blue', 4, 15);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
3D-рамка
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// add 3D border to image
$image->frameImage('silver', 20, 20, 5, 5);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Размыть изображение
Для размытия используется метод blurImage, а для добавления резкости - метод sharpenImage
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// blur image
$image->blurImage(8, 3);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Стилизировать углем изображение
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// add charcoal drawing effect
$image->charcoalImage(5, 0.2);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Эффект живописи маслом на изображении
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// add oil paint effect
$image->oilPaintImage(2.5);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Эффект темной комнаты на изображении
try {
// initialize object
$image = new Gmagick();
// read image file
$image->readImage('gallery/original.jpg');
// solarize image
$image->solarizeImage(100);
// write new image file
$image->writeImage('gallery/new.jpg');
// free resource handle
$image->destroy();
} catch (Exception $e) {
die ($e->getMessage());
}
Наложение одного изображения на другое
$image1 = new \Imagick('image1.jpg');
$image2 = new \Imagick('image2.png');
$offsetX = 100; // смещение по оси X
$offsetY = 10; // смещение по оси Y
$image1->compositeImage($image2, Imagick::COMPOSITE_OVER, $offsetX, $offsetY);
$image1->writeImages('image3.jpg');
Создание линейного градиента
$gradient = new Imagick();
$width = 400; // ширина прямоугольника
$height = 300; // высота прямоугольника
$pseudoString = 'gradient:red-rgba(64,255,255,0.5)'; // в значении этого параметра не должно содержаться пробелов
// $pseudoString = 'gradient:red-transparent';
// $pseudoString = 'gradient:rgb(74,30,100)-rgba(64,255,255,0.5)';
$gradient->newPseudoImage($width, $height, $pseudoString);
$gradient->setImageFormat('png');
Наложение текста
// Создаём новое изображение с прозрачным фоном
$image = new Imagick();
$image->newImage(800, 75, new ImagickPixel('transparent'));
$draw = new ImagickDraw();
$draw->setFillColor('#000'); // цвет текста
$draw->setFont('path/to/font/Atial.ttf'); // путь до файла со шрифтом
$draw->setFontSize(30); // размер шрифта
$image->annotateImage($draw, 0, 0, 0, 'Текст Текст');
$image->setImageFormat('png');
Адаптивное изменение размера изображения
В отличие от thumbnailImage() - изображение получается очень резким и занимает значительно больше места на диске. Особенно резкость заметна если изображение преобразовывается из большого в маленькое. Если в качестве третьего параметра указать TRUE (разумеется, при указанных первых двух), то пропорции изображения будут сохранены. Если указаны не пропорциональные размеры, то в этом случае одна из сторон будет уменьшена для сохранения пропорции.
$image = new Imagick('orig.JPG');
$image->adaptiveResizeImage(800, 0);
$image->writeImage('800x0_adaptiveResizeImage.jpg');
Обрезка из центра изображения
Создает изображения указанных размеров от центра. (увеличивая или уменьшая изображене).
$image = new Imagick('orig.JPG');
$image->cropThumbnailImage(250, 250);
$image->writeImage('250x250_cropThumbnailImage.jpg');
Больше примеров можно найти тут.
