Модуль 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;
?>
Вывод приведённого примера будет похож на: