Базовое использование
В PHP очень легко управлять объектом Imagick используя ОО интерфейс. Вот небольшой пример, как сделать миниатюру:
Пример #1 Создание миниатюры в Imagick
<?php
header('Content-type: image/jpeg');
$image = new Imagick('image.jpg');
// Если в качестве ширины или высоты передан 0,
// то сохраняется соотношение сторон
$image->thumbnailImage(100, 0);
echo $image;
?>
С использованием SPL и других OO функций поддерживаемых в Imagick, можно очень легко изменить размеры всех файлов в директории (полезно для пакетного изменения больших изображений с цифровой камеры для просмотра в Web). Здесь мы используем изменение размера, используя определённые мета-данные:
Пример #2 Создание миниатюр для всех JPG файлов в директории
<?php
$images = new Imagick(glob('images/*.JPG'));
foreach($images as $image) {
// Передаём 0 в thumbnailImage для сохранения соотношения сторон
$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 Create a PHP logo
<?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;
?>
Результатом выполнения данного примера будет что-то подобное:
Коментарии
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();
----------------------------------------------------
imagick.clone
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.