Работа с Imagick

552
10.04.2018

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

В прошлой статье я уже писал о том, как устанавливать библиотеку 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');

Больше примеров можно найти тут.



Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

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

captcha

Возврат к списку