PHP 8.4.2 Released!

Базовое использование

Модуль Imagick чрезвычайно упрощает манипулирование изображениями в PHP через объектно-ориентированный интерфейс. Вот короткий пример того, как сделать миниатюру:

Пример #1 Создание миниатюры через объект Imagick

<?php

header
('Content-type: image/jpeg');

$image = new Imagick('image.jpg');

// Если в качестве параметра ширины или высоты передать 0,
// соотношение сторон сохраняется
$image->thumbnailImage(100, 0);

echo
$image;

?>

С библиотекой SPL и другими объектно-ориентированными функциями, которые поддерживает модуль Imagick, без усилий изменяют размер каждого файла в каталоге (полезно для пакетного изменения размера больших цифровых изображений для просмотра на веб-страницах). Пример изменяет размер, поскольку может потребоваться сохранить отдельные метаданные:

Пример #2 Создание миниатюр для всех JPG-файлов в директории

<?php

$images
= new Imagick(glob('images/*.JPG'));

foreach(
$images as $image) {
// Передаём в метод thumbnailImage значение 0, чтобы сохранить соотношение сторон
$image->thumbnailImage(1024,0);
}

$images->writeImages();

?>

Этот пример создаёт отражение изображения. Отражение создаётся зеркальным отображением и наложением градиента на нём. Затем оригинальное изображение и его отражение накладываются на холст.

Пример #3 Создание отражения

<?php

/* Чтение изображения */
$im = new Imagick("test.png");

/* Миниатюра изображения */
$im->thumbnailImage(200, null);

/* Создание рамки для изображения */
$im->borderImage(new ImagickPixel("white"), 5, 5);

/* Клонируем изображение и зеркально поворачиваем его */
$reflection = $im->clone();
$reflection->flipImage();

/* Создаём градиент. Это будет наложением для отражения */
$gradient = new Imagick();

/* Градиент должен быть достаточно большой для изображения и его рамки */
$gradient->newPseudoImage($reflection->getImageWidth() + 10, $reflection->getImageHeight() + 10, "gradient:transparent-black");

/* Наложение градиента на отражение */
$reflection->compositeImage($gradient, imagick::COMPOSITE_OVER, 0, 0);

/* Добавляем прозрачность. Требуется ImageMagick 6.2.9 или выше */
$reflection->setImageOpacity( 0.3 );

/* Создаём пустой холст */
$canvas = new Imagick();

/* Холст должен быть достаточно большой, чтобы вместить оба изображения */
$width = $im->getImageWidth() + 40;
$height = ($im->getImageHeight() * 2) + 30;
$canvas->newImage($width, $height, new ImagickPixel("black"));
$canvas->setImageFormat("png");

/* Наложение оригинального изображения и отражения на холст */
$canvas->compositeImage($im, imagick::COMPOSITE_OVER, 20, 10);
$canvas->compositeImage($reflection, imagick::COMPOSITE_OVER, 20, $im->getImageHeight() + 10);

/* Вывод изображения */
header("Content-Type: image/png");
echo
$canvas;

?>

Вывод приведённого примера будет похож на:

Пример вывода: Создание отражения изображения

Этот пример иллюстрирует, как использовать заливку во время рисования.

Пример #4 Заливка текста градиентом

<?php

/* Создание нового объекта imagick */
$im = new Imagick();

/* Создание нового изображения. Будет играть роль шаблона заливки */
$im->newPseudoImage(50, 50, "gradient:red-black");

/* Создаём объект imagickdraw */
$draw = new ImagickDraw();

/* Запускаем новый шаблон с названием "gradient" */
$draw->pushPattern('gradient', 0, 0, 50, 50);

/* Смешиваем градиент с шаблоном */
$draw->composite(Imagick::COMPOSITE_OVER, 0, 0, 50, 50, $im);

/* Закрываем шаблон */
$draw->popPattern();

/* Используем шаблон с названием «gradient» для заливки */
$draw->setFillPatternURL('#gradient');

/* Устанавливаем размер шрифта в 52 */
$draw->setFontSize(52);

/* Добавляем свой текст */
$draw->annotation(20, 50, "Hello World!");

/* Создаём новый объект холста и белое изображение */
$canvas = new Imagick();
$canvas->newImage(350, 70, "white");

/* Рисуем ImagickDraw на холсте */
$canvas->drawImage($draw);

/* устанавливаем чёрную рамку шириной 1px вокруг изображения */
$canvas->borderImage('black', 1, 1);

/* Устанавливаем формат PNG */
$canvas->setImageFormat('png');

/* Вывод изображения */
header("Content-Type: image/png");
echo
$canvas;
?>

Вывод приведённого примера будет похож на:

Пример вывода: Заливка текста градиентом

Работа с анимированными GIF-изображениями

Пример #5 Чтение GIF-изображения и изменение размера каждого фрейма

<?php

/* Создание нового объекта imagick и чтение в GIF */
$im = new Imagick("example.gif");

/* Изменение размера всех фреймов */
foreach ($im as $frame) {
/* фреймы 50x50 */
$frame->thumbnailImage(50, 50);

/* Устанавливаем виртуальный холст для коррекции размера */
$frame->setImagePage(50, 50, 0, 0);
}

/* Обратите внимание, вызываем метод writeImages, а не writeImage */
$im->writeImages("example_small.gif", true);

?>

Работа с примитивом «эллипс» и пользовательскими шрифтами

Пример #6 Создание PHP-логотипа

<?php

/* Установка ширины и высоты в пропорции логотипа PHP */
$width = 400;
$height = 210;

/* Создание объекта Imagick с поддержкой прозрачности */
$img = new Imagick();
$img->newImage($width, $height, new ImagickPixel('transparent'));

/* Новый объект ImagickDraw для отрисовки эллипса */
$draw = new ImagickDraw();

/* Установка пурпурного цвета заливки для эллипса */
$draw->setFillColor('#777bb4');

/* Задание размеров эллипса */
$draw->ellipse($width / 2, $height / 2, $width / 2, $height / 2, 0, 360);

/* Отрисовка эллипса */
$img->drawImage($draw);

/* Сброс цвета заливки с пурпурного на чёрный для текста (заметьте, что мы работаем с объектом ImagickDraw повторно) */
$draw->setFillColor('black');

/* Задание обводки границы белым цветом */
$draw->setStrokeColor('white');

/* Задание толщины обводки */
$draw->setStrokeWidth(2);

/* Задание кёрнинга (отрицательные значения означают, что буквы будут ближе друг к другу) */
$draw->setTextKerning(-8);

/* Задание шрифта и его размера, которые используются в логотипе PHP */
$draw->setFont('Handel Gothic.ttf');
$draw->setFontSize(150);

/* Центрирование текста вертикально и горизонтально */
$draw->setGravity(Imagick::GRAVITY_CENTER);

/* Добавление текста «php» со смещением по Y на -10 на холст (внутри эллипса) */
$img->annotateImage($draw, 0, -10, 0, 'php');
$img->setImageFormat('png');

/* Установка заголовка для PNG-файла и вывод изображения */
header('Content-Type: image/png');
echo
$img;

?>

Вывод приведённого примера будет похож на:

Приведённый пример выведет что-то похожее на:

Добавить

Примечания пользователей 2 notes

up
36
vokseli
10 years ago
Be careful when loading multiple images by passing an array to a new Imagick object. This is from Example #2:

<?php

$images
= new Imagick(glob('images/*.JPG'));

?>

If you have lots of images inside the images folder, PHP will consume a lot of memory, ergo it is not recommended. I personally think it's a better idea to loop each image separately:

<?php

$image_files
= glob('images/*.JPG');

foreach (
$image_files as $image_file) {
$image = new Imagick($image_file);
// Do something for the image and so on...
}

?>

This way only a single image is fitted into the memory at a time.
up
18
inoshadi at gmail dot com
11 years ago
on Example #3 Creating a reflection of an image
----------------------------------------------------
/* Clone the image and flip it */
$reflection = $im->clone();
$reflection->flipImage();
----------------------------------------------------
it was using the Imagick::clone function

This function has been DEPRECATED as of imagick 3.1.0 in favour of using the clone keyword.

use below code instead:
----------------------------------------------------
/* Clone the image and flip it */
$reflection = clone $im;
$reflection->flipImage();
----------------------------------------------------

http://php.net/manual/en/imagick.clone.php
To Top