Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 324 · Первое знакомство с рисованием

ImagickDraw: от первого рисунка до полного указателя методов класса

Понятный вход в Draw: пустой объект команд, холст Imagick, готовый PNG, повторное применение и передача очереди; все 124 метода с точными переходами по 17 группам.

ImagickDraw: команды, затем пиксели, затем файл

Нужно получить простую картинку для статуса заказа, отчёта или сообщения. Одного создания ImagickDraw недостаточно: этот объект хранит команды и настройки рисования. Пиксели находятся в другом объекте, Imagick. Сначала создадим маленькую бирюзовую плашку и получим открываемый PNG; затем разберём, как повторять команды и находить нужный метод среди всех 124 официальных страниц этого класса.

Первый настоящий результат PHP: файл first-mark.png 280×160, бирюзовый прямоугольник на белом холсте
Первый настоящий результат PHP: файл first-mark.png 280×160, бирюзовый прямоугольник на белом холсте

$draw = new ImagickDraw(); создаёт пустой набор команд; он пока ничего не рисует и не задаёт размеры PNG. В имени $draw знак доллара обозначает переменную, = сохраняет объект, new создаёт его, пустые скобки вызывают конструктор без аргументов. Запись $draw->rectangle(25, 40, 180, 120); добавляет прямоугольник: левая верхняя точка (25,40), правая нижняя (180,120). Стрелка вызывает метод объекта, скобки содержат значения аргументов, запятые их разделяют, точка с запятой завершает инструкцию.

$draw = new ImagickDraw();
$draw->setFillColor('#146c74');
$draw->rectangle(25, 40, 180, 120);
$image->drawImage($draw);

Это короткое объяснение центральных строк, не отдельная запускаемая программа: переменная $image и белый холст создаются в полной версии ниже. SetFillColor выбирает цвет следующих заливок. DrawImage применяет команды к уже существующему холсту. В полной версии setStrokeColor('none') убирает контур, чтобы видеть только заливку.

Создать Draw, применить его к холсту и сохранить первую плашкуПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->rectangle(25, 40, 180, 120);
if (!$image->drawImage($draw)) {
    throw new RuntimeException('Не удалось применить команды');
}
$draw->clear();
$path = __DIR__ . '/first-mark.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-mark.png', "\n";
$image->clear();

Результат: Бирюзовая область от (25,40) до (180,120) видна на белом изображении 280×160. drawImage уже изменил пиксели до clear; последующее освобождение Draw не стирает сохранённый рисунок. Сохраните полную программу как example.php в отдельной доступной для записи папке и выполните php example.php в CLI с установленным расширением Imagick. Консоль сообщает имя файла, а сам PNG откройте обычным просмотрщиком изображений: echo не выводит рисунок в текстовый терминал. Входных файлов, шрифтов, сетевых запросов и дополнительных fixtures нет. Здесь реально проверены PHP 8.5.11, Imagick 3.8.1 и ImageMagick 7.1.1-46; успешный native-запуск одновременно проверяет синтаксис.

Ожидаемый вывод и видимый файл
first-mark.png

Класс без холста: кто чем владеет

Три конкретных участника: $draw хранит rectangle, $image получает пиксели через drawImage, writeImage сохраняет PNG
Три конкретных участника: $draw хранит rectangle, $image получает пиксели через drawImage, writeImage сохраняет PNG

Модель похожа на инструкцию для мастерской: Draw описывает, что и какими настройками сделать; Imagick предоставляет материал — холст с размерами, цветом фона и текущими пикселями. Применение инструкции меняет этот холст. Аналогия не описывает устройство памяти, не означает отдельный фоновый процесс и не обещает автоматическое масштабирование.

Строка полной программыЧто происходит и что не происходит
new ImagickDraw()Получаем пустой объект команд. Само создание не создаёт изображение и не открывает окно.
newImage(280,160,'white')Объект Imagick получает холст шириной 280 и высотой 160 пикселей. Начало координат — слева сверху, x вправо, y вниз.
setFillColor / rectangleНастройка и геометрия записываются в Draw. Порядок важен: цвет относится к следующим командам.
drawImage($draw)Imagick выполняет накопленные команды на своём текущем изображении. true — флаг успеха, не объект новой картинки.
setImageFormat('png') / writeImage($path)Формат задаёт PNG, запись сохраняет файл. __DIR__ — папка самого PHP-файла; точка склеивает путь и имя.
clear()Освобождаем уже ненужную очередь/изображение. Это не удаление сохранённого PNG.

Блок if (!$image->drawImage(...)) проверяет false: ! означает «не». При отказе явно бросается RuntimeException. Native-исключение самого расширения тоже не скрывается. Сохранение проверено отдельно: успешная команда ещё не гарантирует доступ к каталогу или успешную запись файла. Для сайта вместо CLI понадобится корректный HTTP-ответ с Content-Type и без лишнего текста; это отдельный путь, здесь выдаётся файл.

В официальном synopsis класс назван ImagickDraw и приведены его методы; наследование, implements и публичные свойства там не заданы. В проверенной сборке ниже Reflection подтверждает отсутствие родительского класса, интерфейсов и объявленных свойств. Это не означает отсутствие внутреннего состояния: цвета, толщина, координаты и очередь живут в native-объекте и управляются методами. Не пытайтесь записать $draw->fill = ... вместо setter. Класс доступен в PECL imagick 2/3, но конкретные методы и поведение зависят также от underlying ImageMagick.

Переданный тип ImagickDraw — имя класса, не имя файла и не глобальная функция. Для строки цвета можно использовать '#146c74', для более подробной работы существует ImagickPixel. Геометрия, fill и stroke подробно объясняются в соответствующих карточках ниже; объявление класса в официальном мануале не заменяет вызов конструктора.

Один Draw — две картинки с разными фонами

Одна очередь применена к двум разным холстам: геометрия та же, фон одного белый, другого мятный
Одна очередь применена к двум разным холстам: геометрия та же, фон одного белый, другого мятный

Допустим, один и тот же знак нужен на белой карточке и на мятной. Не переписываем координаты и не создаём второй набор команд: два разных объекта Imagick последовательно применяют один Draw. DrawImage не «съедает» очередь. Итоговая демонстрационная картинка объединяет два готовых холста через Imagick::compositeImage; это непосредственная вставка растров, отдельная от Draw::composite.

Повторить один набор команд на двух фонахПример для указанного окружения
<?php
declare(strict_types=1);

$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->rectangle(20, 40, 200, 160);
$draw->setFillColor('#ffe08a');
$draw->circle(200, 50, 230, 50);
$left = new Imagick();
$left->newImage(280, 200, 'white');
$right = new Imagick();
$right->newImage(280, 200, '#e3f3ef');
if (!$left->drawImage($draw) || !$right->drawImage($draw)) {
    throw new RuntimeException('Не удалось повторно применить очередь');
}
$draw->clear();
$image = new Imagick();
$image->newImage(600, 220, 'white');
$image->setImageFormat('png');
$image->compositeImage($left, Imagick::COMPOSITE_OVER, 10, 10);
$image->compositeImage($right, Imagick::COMPOSITE_OVER, 310, 10);
$left->clear();
$right->clear();
$path = __DIR__ . '/same-queue-two-canvases.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'same-queue-two-canvases.png', "\n";
$image->clear();

Результат: Слева и справа одинаковые бирюзовый блок и золотистый круг; фон левой карточки белый, правой мятный. Два холста 280×200 размещены в итоговом 600×220 с отступами 10: левый (10,10), правый (310,10). После обоих drawImage очередь очищена, обе картинки сохранились. Сохраните полную программу как example.php в отдельной доступной для записи папке и выполните php example.php в CLI с установленным расширением Imagick. Консоль сообщает имя файла, а сам PNG откройте обычным просмотрщиком изображений: echo не выводит рисунок в текстовый терминал. Входных файлов, шрифтов, сетевых запросов и дополнительных fixtures нет. Здесь реально проверены PHP 8.5.11, Imagick 3.8.1 и ImageMagick 7.1.1-46; успешный native-запуск одновременно проверяет синтаксис.

Ожидаемый вывод и видимый файл
same-queue-two-canvases.png

Цвет нового фона не меняет координаты и размеры фигур. Если второй холст увеличить, рисунок сам не станет крупнее: нужен явный масштаб или новая геометрия. Повторный полупрозрачный рисунок на одном и том же холсте может накапливать смешивание, поэтому повторное применение не всегда равно первому. Если команды нужно менять независимо, используйте осознанную копию Draw; это разобрано в состоянии и копировании. Возврат к очереди и её экспорту — жизненный цикл векторного описания.

Подготовить команды в функции и передать результат

Функция вернула очередь зелёного знака с белой галочкой; вызывающий код применил её, освободил Draw и сохранил пиксели
Функция вернула очередь зелёного знака с белой галочкой; вызывающий код применил её, освободил Draw и сохранил пиксели

Когда знак требуется в нескольких местах проекта, можно вынести сборку команд в функцию. В следующем примере function confirmationMark(): ImagickDraw объявляет функцию без входных параметров; после двоеточия указан тип возвращаемого объекта. return $draw; отдаёт подготовленный Draw в место вызова. Строка $commands = confirmationMark(); сохраняет именно очередь, не картинку. Затем вызывающая часть создаёт холст, применяет очередь и распоряжается её дальнейшей жизнью.

Передать подготовленный знак из функции вызывающему кодуПример для указанного окружения
<?php
declare(strict_types=1);

function confirmationMark(): ImagickDraw
{
    $draw = new ImagickDraw();
    $draw->setStrokeColor('none');
    $draw->setFillColor('#146c74');
    $draw->circle(180, 110, 250, 110);
    $draw->setFillColor('none');
    $draw->setStrokeColor('white');
    $draw->setStrokeWidth(14);
    $draw->polyline([
        ['x' => 140, 'y' => 110],
        ['x' => 170, 'y' => 140],
        ['x' => 220, 'y' => 80],
    ]);
    return $draw;
}
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$commands = confirmationMark();
if (!$image->drawImage($commands)) {
    throw new RuntimeException('Не удалось применить возвращённую очередь');
}
$commands->clear();
$path = __DIR__ . '/queue-handoff.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'queue-handoff.png', "\n";
$image->clear();

Результат: На белом PNG 360×220 бирюзовый круг с центром (180,110) и радиусом 70, внутри белая галочка. После drawImage вызван clear именно у возвращённого Draw; рисунок уже принадлежит пикселям $image и остаётся в файле. Сохраните полную программу как example.php в отдельной доступной для записи папке и выполните php example.php в CLI с установленным расширением Imagick. Консоль сообщает имя файла, а сам PNG откройте обычным просмотрщиком изображений: echo не выводит рисунок в текстовый терминал. Входных файлов, шрифтов, сетевых запросов и дополнительных fixtures нет. Здесь реально проверены PHP 8.5.11, Imagick 3.8.1 и ImageMagick 7.1.1-46; успешный native-запуск одновременно проверяет синтаксис.

Ожидаемый вывод и видимый файл
queue-handoff.png

Circle получает центр и одну точку окружности; здесь (250,110) даёт радиус 70. Polyline принимает массив точек; каждая точка содержит x/y. Clear вызывается после последнего использования очереди. Если функция вернёт Draw и сама до return очистит его, вызывающий код не получит обещанный рисунок. Обычное присваивание второго имени не является независимой копией объекта. Подробнее: параметры и return, массивы точек, идентичность и клонирование объектов.

От первой плашки к рабочей схеме и нужной теме

Реальный макет пути заказа: две выполненные точки бирюзовые, последняя белая, оставшийся путь серый
Реальный макет пути заказа: две выполненные точки бирюзовые, последняя белая, оставшийся путь серый

Полезный следующий результат — маленькая схема выполнения заказа. Одной очередью записываем панель, соединяющие отрезки, три точки и золотистую плашку. Разные цвета устанавливаются перед соответствующими фигурами. Эти базовые части дают готовый PNG без шрифтов; текстовую подпись можно добавить следующим самостоятельным шагом, когда подготовлен реальный файл шрифта.

Собрать понятный макет выполнения заказаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(600, 360, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->setFillColor('#e3f3ef');
$draw->roundRectangle(20, 20, 580, 340, 18, 18);
$draw->setStrokeColor('#bdcdd0');
$draw->setStrokeWidth(12);
$draw->line(100, 180, 500, 180);
$draw->setStrokeColor('#146c74');
$draw->line(100, 180, 300, 180);
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->circle(100, 180, 128, 180);
$draw->circle(300, 180, 328, 180);
$draw->setFillColor('white');
$draw->setStrokeColor('#bdcdd0');
$draw->setStrokeWidth(6);
$draw->circle(500, 180, 528, 180);
$draw->setStrokeColor('none');
$draw->setFillColor('#ffe08a');
$draw->roundRectangle(40, 50, 210, 90, 8, 8);
if (!$image->drawImage($draw)) {
    throw new RuntimeException('Не удалось нарисовать маршрут');
}
$draw->clear();
$class = new ReflectionClass(ImagickDraw::class);
if ($class->getParentClass() !== false || count($class->getInterfaceNames()) !== 0 || count($class->getProperties()) !== 0) {
    throw new RuntimeException('Структура класса отличается от проверенной сборки');
}
echo 'parent=none; interfaces=0; declared-properties=0', "\n";
$path = __DIR__ . '/route-card.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'route-card.png', "\n";
$image->clear();

Результат: Мятная панель 600×360 содержит три точки (100,180),(300,180),(500,180). Две первые и соединяющий их участок бирюзовые, третья белая с серым контуром; путь от второй к третьей серый. Сверху золотистая плашка. Диагностическая строка ниже отражает реальную структуру класса в этой сборке, а не рисуется в PNG. Сохраните полную программу как example.php в отдельной доступной для записи папке и выполните php example.php в CLI с установленным расширением Imagick. Консоль сообщает имя файла, а сам PNG откройте обычным просмотрщиком изображений: echo не выводит рисунок в текстовый терминал. Входных файлов, шрифтов, сетевых запросов и дополнительных fixtures нет. Здесь реально проверены PHP 8.5.11, Imagick 3.8.1 и ImageMagick 7.1.1-46; успешный native-запуск одновременно проверяет синтаксис.

Ожидаемый вывод и видимый файл
parent=none; interfaces=0; declared-properties=0
route-card.png

В конце только этого примера ReflectionClass читает описание класса: ImagickDraw::class получает его имя, getParentClass/getInterfaceNames/getProperties — сведения о родителе, интерфейсах и объявленных свойствах. Это вспомогательная диагностика условий запуска, она не нужна для рисования. Мы не используем рефлексию, чтобы угадать доступность всей официальной документации. Более подробная рефлексия объяснена отдельно.

Задача после первого PNGКуда перейти
Поменять расположение точек, добавить произвольный контурФигуры и координаты → собственный путь
Сделать тонкий пунктир или полупрозрачную линиюформа контура → цвет и alpha
Добавить область, узор или ограничение показаfill, patterns, clip path
Подписать этапы реальным шрифтомнадпись и файл шрифта → выбор начертания
Сохранить свои команды или вставить собственный знаквекторная очередь, composite и покраска

Упражнение: отметить выполненным третий этап. Предложение решения: продлить бирюзовую line до(500,180), третьему кругу задать бирюзовый fill и убрать серый stroke. Сначала измените команды и заново примените их к чистому холсту. Для реальных статусов данные и их проверку держите отдельно от геометрии; неизвестный статус не следует молча показывать как успешный.

Все 124 метода по 17 группам: сигнатуры и точные переходы

Маршрут справочника: задача → одна из 17 групп → конкретный метод → существующая карточка с примерами
Маршрут справочника: задача → одна из 17 групп → конкретный метод → существующая карточка с примерами

Ниже все 124 официальных метода из зафиксированного дерева ImagickDraw, включая конструктор, исторические имена и условно доступные методы. Семнадцать групп объединяют уже подготовленные подробные разборы: раскройте нужную группу, проверьте сигнатуру и назначение, нажмите имя метода. Переход ведёт сразу в существующую карточку с параметрами, результатами и программами.

Фигуры и координаты — 10 методов

Линии, прямоугольники, круги, дуги и наборы точек: построить сам рисунок.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::arcImagickDraw::arc(float $start_x, float $start_y, float $end_x, float $end_y, float $start_angle, float $end_angle): boolНужно изобразить выполненную часть проверки, оставив незавершённую часть незакрашенной. Четыре координаты задают рамку эллипса; два угла выбирают его участок. Здесь верхняя дуга идёт от левой точки рамки к направлению 330°.
ImagickDraw::bezierImagickDraw::bezier(array $coordinates): boolНа схеме доставки прямой отрезок перекрывает другую подпись; соединение нужно отвести вверх. В этом примере четыре точки: первая и последняя лежат на кривой, две средние управляют изгибом. Кривая обычно не проходит через управляющие точки.
ImagickDraw::circleImagickDraw::circle(float $origin_x, float $origin_y, float $perimeter_x, float $perimeter_y): boolНужна круглая метка выбранного склада на схеме, а не готовая картинка из файла. (120,80) — центр. (170,80) — точка на окружности справа от центра, поэтому радиус равен 50. Последние два аргумента — координаты точки, а не ширина и высота.
ImagickDraw::ellipseImagickDraw::ellipse(float $origin_x, float $origin_y, float $radius_x, float $radius_y, float $angle_start, float $angle_end): boolНа превью оборудования нужно выделить широкую группу деталей овалом. Центр (120,80), горизонтальный радиус 85 и вертикальный радиус 40 дают габарит 170×80 до учёта обводки. 0 и 360 выбирают полный овал.
ImagickDraw::lineImagickDraw::line(float $start_x, float $start_y, float $end_x, float $end_y): boolНужно соединить две измеренные позиции на небольшом отчётном изображении. (25,125) — начало, (215,35) — конец. Поскольку y растёт вниз, отрезок направлен вправо и вверх. Толщину и цвет задают перед вызовом.
ImagickDraw::pointImagickDraw::point(float $x, float $y): boolЕсть сетка измерений: одну ячейку нужно пометить точным цветом без радиуса и окружности. point(60,60) адресует позицию на холсте 120×120. В примере fill и stroke намеренно одинаковы; для метки большого размера используется circle, а не предположение о толщине point.
ImagickDraw::polygonImagickDraw::polygon(array $coordinates): boolНа схеме магазина нужно закрасить обслуживаемую зону произвольной формы. Массив хранит четыре вершины по порядку обхода. Каждая вершина — вложенный массив с ключами x и y. Последняя автоматически соединяется с первой.
ImagickDraw::polylineImagickDraw::polyline(array $coordinates): boolКурьер прислал последовательность позиций; нужно соединить их в том же порядке. Здесь четыре вершины и три отрезка. В отличие от polygon, обводка не замыкает путь последним отрезком. fill='none' предотвращает нежелательную заливку между началом и концом.
ImagickDraw::rectangleImagickDraw::rectangle(float $top_left_x, float $top_left_y, float $bottom_right_x, float $bottom_right_y): boolНужна прямоугольная подложка под блок на автоматически собранном PNG. Первая точка (35,35) — верхний левый угол, вторая (205,125) — нижний правый. Это координаты двух углов, не x,y,width,height.
ImagickDraw::roundRectangleImagickDraw::roundRectangle(float $top_left_x, float $top_left_y, float $bottom_right_x, float $bottom_right_y, float $rounding_x, float $rounding_y): boolОтчёт отправляется картинкой в мессенджер; панели должны выглядеть как аккуратные карточки. Первые четыре аргумента задают углы рамки. 18 и 18 — радиусы горизонтального и вертикального скругления, а не размеры всей карточки.
Путь: начало, отрезки и закрытие — 13 методов

Собрать контур из последовательных шагов и явно закончить его.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::pathStartImagickDraw::pathStart(): boolСхема движения состоит из нескольких отрезков, а не одной готовой фигуры. Нужен контейнер, в котором команды будут образовывать путь. pathStart открывает запись пути; move выбирает начальную позицию, line рисует участки, pathFinish завершает запись. Нельзя вызывать path-команды как независимые фигуры вне этой пары.
ImagickDraw::pathFinishImagickDraw::pathFinish(): boolДля открытого маршрута нужно завершить список команд и затем применить его к изображению. Соединять конец с началом нельзя: это добавило бы несуществующий участок. pathFinish заканчивает определение пути. В нашем примере после двух отрезков остаётся угол: диагональ из (200,125) в (40,35) не появляется. Для её добавления служит отдельный pathClose.
ImagickDraw::pathCloseImagickDraw::pathClose(): boolНа отчёте нужна закрашенная треугольная область с обводкой со всех сторон. Две стороны заданы явно, третью нужно провести к началу. pathClose добавляет прямой участок из текущей точки (200,125) к началу текущего подконтура (40,35). Затем текущей снова становится (40,35), а pathFinish завершает весь путь.
ImagickDraw::pathMoveToAbsoluteImagickDraw::pathMoveToAbsolute(float $x, float $y): boolНа технической схеме два раздельных соединения; диагональ между ними была бы ложной связью. MoveToAbsolute задаёт новую абсолютную позицию и начало подконтура. Переход от (100,45) к (140,115) не рисуется. Только следующий LineTo снова оставляет след.
ImagickDraw::pathMoveToRelativeImagickDraw::pathMoveToRelative(float $x, float $y): boolПовторяющийся символ нужно поставить после предыдущего с заданным промежутком. Пересчитывать абсолютные координаты каждого фрагмента неудобно. До вызова текущая точка (100,45). Смещение (40,70) даёт новое начало (140,115), без линии между ними. Следующий относительный отрезок (80,0) оканчивается в (220,115).
ImagickDraw::pathLineToAbsoluteImagickDraw::pathLineToAbsolute(float $x, float $y): boolИзмерения уже пересчитаны в точки отчётного изображения. Нужно соединить соседние точки в заданном порядке. Начало берётся из текущей точки. Аргументы задают только конец: сначала (100,60), затем (210,100). После каждого вызова этот конец становится новым текущим положением.
ImagickDraw::pathLineToRelativeImagickDraw::pathLineToRelative(float $x, float $y): boolИзвестны длины и направления шагов: вправо-вверх, затем вправо-вниз. Их нужно последовательно откладывать от предыдущего конца. Из (25,120) смещение (75,-60) приводит в (100,60). Следующая команда (110,40) отсчитывается уже от (100,60) и заканчивается в (210,100). Минус у y ведёт вверх.
ImagickDraw::pathLineToHorizontalAbsoluteImagickDraw::pathLineToHorizontalAbsolute(float $x): boolНесколько разделителей таблицы должны заканчиваться на одной правой границе, независимо от начальной позиции. Меняется только x, y сохраняется. Из (30,45) команда H200 приводит в (200,45); после V110 команда H80 приводит в (80,110), то есть влево.
ImagickDraw::pathLineToHorizontalRelativeImagickDraw::pathLineToHorizontalRelative(float $x): boolМаршрут состоит из участков известной протяжённости; удобно наращивать их, не считая заранее каждый абсолютный конец. Из (30,45) h170 даёт (200,45). После спуска v65 текущая (200,110); h-120 заканчивается в (80,110). Отрицательный сдвиг ведёт влево.
ImagickDraw::pathLineToVerticalAbsoluteImagickDraw::pathLineToVerticalAbsolute(float $y): boolВ диаграмме столбики разной высоты должны доходить до одной общей нижней линии. Меняется только y, x сохраняется. Из (50,25) V130 приходит в (50,130); после H190 команда V60 идёт вверх к (190,60).
ImagickDraw::pathLineToVerticalRelativeImagickDraw::pathLineToVerticalRelative(float $y): boolИзвестна высота индикатора, а его опорная точка задаётся отдельно. Нужно поднимать линию от базовой отметки, не вычисляя каждый конец вручную. Из (50,25) v105 ведёт в (50,130). После h140 позиция (190,130); v-70 приводит в (190,60). Минус двигает вверх, плюс — вниз.
ImagickDraw::pathCurveToAbsoluteImagickDraw::pathCurveToAbsolute(float $x1, float $y1, float $x2, float $y2, float $x, float $y): boolНа схеме систем нужна плавная связь с обходом центрального блока; прямые отрезки выглядят угловато. Начало уже задано MoveTo в (20,130). Пары (65,15) и (175,15) — две управляющие точки, (220,130) — конец. Кривая обычно не проходит через управляющие точки; они задают направление и изгиб.
ImagickDraw::pathCurveToRelativeImagickDraw::pathCurveToRelative(float $x1, float $y1, float $x2, float $y2, float $x, float $y): boolИзгиб символа хочется повторять в разных местах без пересчёта обеих управляющих точек. Все три пары отсчитываются от одной текущей точки ДО команды — (20,130): (45,-115) даёт (65,15), (155,-115) даёт (175,15), (200,0) даёт конец (220,130). Внутри одной команды база не перескакивает между управляющими точками.
Путь: кривые и эллиптические дуги — 8 методов

Плавные соединения, управляющие точки, абсолютные и относительные команды.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::pathCurveToQuadraticBezierAbsoluteImagickDraw::pathCurveToQuadraticBezierAbsolute(float $x1, float $y1, float $x_end, float $y): boolНужна плавная верхняя грань ярлыка или простая арка между двумя позициями. Двух управляющих точек кубической кривой для этой формы не требуется. Начало уже стоит в (20,130); управляющая точка (120,20) тянет линию вверх; конец (220,130) завершает участок. Через управляющую точку кривая обычно не проходит: середина нашего участка имеет y=75, а не 20.
ImagickDraw::pathCurveToQuadraticBezierRelativeImagickDraw::pathCurveToQuadraticBezierRelative(float $x1, float $y1, float $x_end, float $y): boolЗакруглённую вкладку нужно повторять в нескольких местах изображения, сохранив форму без пересчёта абсолютных управляющих координат. От текущей (20,130) смещение (100,-110) даёт управляющую (120,20), а (200,0) — конец (220,130). Обе пары считаются от одного начала команды, не одна от другой.
ImagickDraw::pathCurveToQuadraticBezierSmoothAbsoluteImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): boolСоставная линия должна пройти через общий узел без ручного повторного вычисления управляющей точки следующей половины. После Q с управляющей C=(70,20) и концом P=(120,100) команда SmoothAbsolute(220,100) использует отражённую C′=(170,180). Её вычисление: C′=2P−C. Аргументы задают только абсолютный конец новой квадратичной кривой.
ImagickDraw::pathCurveToQuadraticBezierSmoothRelativeImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): boolДля повторяемого мягкого контура удобно задать первую кривую явно, а следующие концы — одинаковыми локальными шагами. После q(50,-80,100,0) текущая (120,100), предыдущая управляющая (70,20). t(100,0) получает конец (220,100), а отражённую управляющую (170,180) вычисляет автоматически. База смещения конца — текущая точка, не отражённая.
ImagickDraw::pathCurveToSmoothAbsoluteImagickDraw::pathCurveToSmoothAbsolute(float $x2, float $y2, float $x, float $y): boolНужен S-образный соединитель: первая половина задана двумя управляющими точками, следующую хочется продолжить с согласованным направлением. Предыдущая C закончилась в P=(120,100), её вторая управляющая C2=(90,20). Новая первая управляющая автоматически C1′=(150,180); передаём только вторую (190,180) и конец (220,100).
ImagickDraw::pathCurveToSmoothRelativeImagickDraw::pathCurveToSmoothRelative(float $x2, float $y2, float $x, float $y): boolУзор ленты или повторяющаяся плавная связь собирается из одинаковых модулей. Отражение экономит одну пару чисел, а Relative оставляет модуль локальным. Начало второго участка P=(120,100). (70,80) даёт вторую управляющую (190,180); (100,0) даёт конец (220,100). Первая управляющая отражается из прежней C2 в (150,180), независимо от переданной второй пары.
ImagickDraw::pathEllipticArcAbsoluteImagickDraw::pathEllipticArcAbsolute(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): boolНужно соединить две позиции участком настоящего эллипса: например, ручка значка пакета или овальный вырез, а не произвольная кривая Безье. Начало (80,110) уже задано Move. Радиусы 70 и 50 определяют форму эллипса, rotation=0 — его поворот; false выбирает малую дугу, true — положительное направление. Конец задан абсолютной точкой (160,70). Центр движок вычисляет сам.
ImagickDraw::pathEllipticArcRelativeImagickDraw::pathEllipticArcRelative(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): boolОвальный значок нужно собрать как локальный замкнутый контур из двух дуг. Радиусы и поворот остаются свойствами эллипса, а конец каждой дуги задаётся сдвигом. Из (80,110) последняя пара (80,-40) приводит в (160,70). Первые rx=70, ry=50 и rotation=0 не прибавляются к текущей точке: относительными являются только конечные x/y.
Толщина и форма контура — 10 методов

Концы и соединения линий, пунктир, предел острых соединений.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::getStrokeLineCapImagickDraw::getStrokeLineCap(): intНужно узнать, почему линия визуально длиннее расчётного диапазона, и учесть окончания при размещении в ограниченной области.
ImagickDraw::setStrokeLineCapImagickDraw::setStrokeLineCap(int $linecap): boolНа маршруте нужны мягкие окончания вместо прямого среза; геометрию пути менять не требуется.
ImagickDraw::getStrokeLineJoinImagickDraw::getStrokeLineJoin(): intВспомогательная отрисовка временно меняет оформление угла; нужно прочитать прежнее и восстановить его перед следующим объектом.
ImagickDraw::setStrokeLineJoinImagickDraw::setStrokeLineJoin(int $linejoin): boolВ схеме острые углы маршрута должны стать скруглёнными или срезанными, сохраняя те же вершины.
ImagickDraw::getStrokeMiterLimitImagickDraw::getStrokeMiterLimit(): intНужно понять, почему острый угол срезан: прочитать ограничение вместе с режимом Join, а не менять толщину вслепую.
ImagickDraw::setStrokeMiterLimitImagickDraw::setStrokeMiterLimit(int $miterlimit): boolОстрый поворот создаёт слишком длинный шип, который выходит за рамку значка. Ограничиваем его геометрическое отношение, не обрезая изображение.
ImagickDraw::getStrokeDashArrayImagickDraw::getStrokeDashArray(): arrayНужно перенести пунктир основного объекта в легенду и отличить отсутствие pattern от массива длин.
ImagickDraw::setStrokeDashArrayImagickDraw::setStrokeDashArray(array|null $dashes): boolПлановый маршрут следует отличить от действующего не только цветом: задаём чередующиеся штрихи и промежутки.
ImagickDraw::getStrokeDashOffsetImagickDraw::getStrokeDashOffset(): floatВ конфигурации накопилась фаза больше периода. Прочитаем её и приведём к положительному эквиваленту, чтобы лог и настройки было легче сравнивать.
ImagickDraw::setStrokeDashOffsetImagickDraw::setStrokeDashOffset(float $dash_offset): boolШтрихи должны продолжаться согласованно после закрытого участком схемы разрыва; меняем фазу второго отрезка, не его координаты.
Цвет и непрозрачность контура — 8 методов

Отдельно настроить цвет, прозрачность и сглаживание обводки.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::getStrokeColorImagickDraw::getStrokeColor(): ImagickPixelШаблон другого компонента уже выбрал цвет. Нужно узнать его или временно выделить предупреждение и вернуть прежний цвет без знания исходной строки.
ImagickDraw::setStrokeColorImagickDraw::setStrokeColor(ImagickPixel|string $color): boolНесколько состояний в схеме нужно оформить согласованной палитрой, а не менять значения RGB вручную в каждом фрагменте.
ImagickDraw::getStrokeWidthImagickDraw::getStrokeWidth(): floatДля рамки внутри фиксированного холста нужно знать уже установленную толщину и оставить место под половину обводки по каждую сторону контура.
ImagickDraw::setStrokeWidthImagickDraw::setStrokeWidth(float $width): boolНа отчётной схеме загруженные соединения должны быть толще слабых, но не выходить за разумные пределы и не превращать нулевую нагрузку в линию.
ImagickDraw::getStrokeOpacityImagickDraw::getStrokeOpacity(): floatШаблон содержит слишком слабую обводку для выбранного режима отчёта. Прочитаем opacity и применим заранее выбранный минимум, сохранив исходное значение для журнала.
ImagickDraw::setStrokeOpacityImagickDraw::setStrokeOpacity(float $opacity): boolНужно поверх отчётной сетки выделить область толстым штрихом, оставив данные под выделением видимыми.
ImagickDraw::getStrokeAntialiasImagickDraw::getStrokeAntialias(): boolВременный диагностический режим отключает сглаживание. Прочитаем прежний bool и вернём его, чтобы следующий обычный рисунок не унаследовал пиксельную лесенку.
ImagickDraw::setStrokeAntialiasImagickDraw::setStrokeAntialias(bool $enabled): boolОдин экспорт нужен для пиксельной диагностики, другой — для обычной картинки интерфейса. Геометрия одинакова, режим покрытия края разный.
Заливка и правила внутренних областей — 6 методов

Выбрать цвет, непрозрачность и правило заполнения контура.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::getFillColorImagickDraw::getFillColor(): ImagickPixelКомпонент получил цвет из темы. Нужно сделать от него вариант предупреждения и не изменить уже настроенный Draw случайной правкой полученного объекта.
ImagickDraw::setFillColorImagickDraw::setFillColor(ImagickPixel|string $fill_color): boolКарточки статусов должны иметь согласованные цвета внутри и одинаковый читаемый край. Зададим палитру заливки отдельно от цвета обводки.
ImagickDraw::getFillOpacityImagickDraw::getFillOpacity(): floatОсновная область и её отдельная легенда должны иметь одинаковую непрозрачность. Прочитаем уже выбранное значение и передадим другому Draw, вместо второго независимого числа в коде.
ImagickDraw::setFillOpacityImagickDraw::setFillOpacity(float $opacity): boolПоверх отчётной сетки нужно показать диапазон выбора, сохранив данные под ним. Полупрозрачной будет заливка, а читаемый край останется непрозрачным.
ImagickDraw::getFillRuleImagickDraw::getFillRule(): intТема уже содержит правило заливки. Перед созданием рамки с окном нужно проверить его и применить договорённое правило экспортируемой схемы, а не надеяться на значение по умолчанию.
ImagickDraw::setFillRuleImagickDraw::setFillRule(int $fillrule): boolДля рамки, значка или области с вырезом требуется определить, где у составного контура находится внутренняя область. Два отдельных rectangle не образуют одно правило вложенности.
Перенос, масштаб и поворот — 6 методов

Менять систему координат перед последующими командами.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::translateImagickDraw::translate(float $x, float $y): boolНужно разместить одну карточку в разных местах отчёта, сохранив её внутренние координаты и расстояния между элементами.
ImagickDraw::rotateImagickDraw::rotate(float $degrees): boolЗначок или указатель нужно направить по маршруту. Поворот должен происходить вокруг понятного центра, а не отправлять фигуру за край картинки.
ImagickDraw::scaleImagickDraw::scale(float $x, float $y): boolОдин векторный шаблон нужен в нескольких размерах или с противоположным направлением, без переписывания всех координат и ресайза уже размытого растра.
ImagickDraw::skewXImagickDraw::skewX(float $degrees): boolДекоративной плашке нужен наклонный силуэт, а внутренние данные должны остаться читаемыми и горизонтальными. Преобразуем подложку отдельно от данных.
ImagickDraw::skewYImagickDraw::skewY(float $degrees): boolНа условной схеме устройства нужна боковая грань с наклонными верхним и нижним рёбрами. Она должна примыкать к прямому фасаду, не искажая весь фасад вместе с собой.
ImagickDraw::affineImagickDraw::affine(array $affine): boolЭкспортёр хранит положение, масштаб и перекос как шесть чисел. Нужна одна понятная формула перехода от локальной точки к точке холста и проверка, что фигура помещается в размер отчёта.
Создание, копирование и состояние — 6 методов

Получить Draw, владеть им, временно сохранить настройки и освободить ресурсы.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::__constructImagickDraw::__construct(): voidНужно подготовить фигуру для отчёта. Сначала нужен объект, который хранит команды и настройки; сам он ещё не является ни холстом, ни файлом.
ImagickDraw::cloneImagickDraw::clone(): ImagickDrawИз общей темы нужно получить независимый вариант: смена его цвета не должна менять базовый объект, а подготовленная очередь должна копироваться осознанно.
ImagickDraw::clearImagickDraw::clear(): boolЧерновик фигуры отменён до растеризации или Draw нужно использовать для следующего компонента. Старые команды и временная тема больше не должны участвовать в следующем drawImage.
ImagickDraw::destroyImagickDraw::destroy(): boolВ старом примере после drawImage встретился destroy. Нужно понять, очистит ли он картинку, удалит ли PHP-переменную и нужен ли дополнительный clear.

Версионная оговорка. Legacy-имя освобождения: условия и современная работа с clear разобраны в карточке.

ImagickDraw::pushImagickDraw::push(): boolВнутри компонента временно меняются заливка, толщина или координатное преобразование. После него нужен прежний стиль, а вручную сохранять все свойства неудобно.
ImagickDraw::popImagickDraw::pop(): boolВременная тема или перевод локальных координат завершились; следующий компонент должен продолжить прежний стиль, даже если внутри произошёл отказ.
Ограничение видимой области — 8 методов

Показать только часть рисунка внутри явно определённого clip path.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::pushClipPathImagickDraw::pushClipPath(string $clip_mask_id): boolНужно один раз описать окно аватарки и применять его ко всем полосам, кругам или линиям внутри неё.
ImagickDraw::popClipPathImagickDraw::popClipPath(): boolГраница окна уже описана; следующие команды должны рисовать содержимое, а не продолжать описание маски.
ImagickDraw::setClipPathImagickDraw::setClipPath(string $clip_mask): boolПолоса и круг выходят за рамку диаграммы. Вместо ручного вычисления пересечений включим уже определённое окно для последующих команд.
ImagickDraw::getClipPathImagickDraw::getClipPath(): false|stringКомпоненту нельзя рисовать без безопасного окна; перед экспортом нужно узнать, какое имя активно, и установить fallback либо отказать при неверной настройке.
ImagickDraw::setClipRuleImagickDraw::setClipRule(int $fillrule): boolУ рамки должен остаться настоящий просвет, а у перекрывающихся частей значка — сплошное пересечение. Формы похожи, но правило внутренней области требуется разное.
ImagickDraw::getClipRuleImagickDraw::getClipRule(): intТема определяет правило рамки, а импортёр выбирает направление внутреннего контура. Для обоих действий нужно значение настройки, а не догадка по готовой картинке.
ImagickDraw::setClipUnitsImagickDraw::setClipUnits(int $pathunits): boolОкно в макете задано либо известными координатами панели, либо долями её ширины и высоты. Без явной договорённости оно окажется крошечным или полностью исчезнет.
ImagickDraw::getClipUnitsImagickDraw::getClipUnits(): intПереданный компонент ожидает координаты холста, а не нормализованные доли. Проверка enum предотвращает смешение этих договорённостей ещё до растеризации.
Повторяемый узор — 6 методов

Определить именованный фрагмент и применить повторение к fill/stroke.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::pushDefsImagickDraw::pushDefs(): boolКарточка использует повторяющийся фон и штриховку статуса. Их описание удобно отделить от команд, которые рисуют саму карточку.
ImagickDraw::popDefsImagickDraw::popDefs(): boolВсе образцы и окна уже описаны. Теперь rectangle должен стать панелью на изображении, а не частью списка определений.
ImagickDraw::pushPatternImagickDraw::pushPattern(string $pattern_id, float $x, float $y, float $width, float $height): boolДля десятков точек не хочется вручную вычислять каждую позицию. Опишем маленькую ячейку один раз и передадим повторение заливке.
ImagickDraw::popPatternImagickDraw::popPattern(): boolТочки ячейки уже описаны. Следующая большая фигура должна использовать образец, а отдельный значок рядом — остаться обычной фигурой.
ImagickDraw::setFillPatternURLImagickDraw::setFillPatternURL(string $fill_url): boolКруглый значок и выделенная область должны содержать повторяющийся рисунок, а их форма и внешние поля сохраняются.
ImagickDraw::setStrokePatternURLImagickDraw::setStrokePatternURL(string $stroke_url): boolДля маршрута или предупреждающей рамки требуется фактура широкой обводки, при этом внутренняя заливка может оставаться обычной.
Первая надпись и файл шрифта — 6 методов

Подготовить шрифт, размер и текст с воспроизводимыми условиями запуска.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::annotationImagickDraw::annotation(float $x, float $y, string $text): boolУ статуса должна появиться настоящая читаемая надпись в PNG: её увидит человек, которому отправили карточку или отчёт.
ImagickDraw::setFontImagickDraw::setFont(string $font_name): boolОдна и та же подпись должна выглядеть одинаково на компьютере разработчика и сервере, где привычного системного шрифта может не быть.
ImagickDraw::getFontImagickDraw::getFont(): stringКомпоненту нужно перенести выбранный файл в новый Draw или заменить неизвестную системную настройку понятным переносимым вариантом.
ImagickDraw::setFontSizeImagickDraw::setFontSize(float $point_size): boolЦена должна быть заметнее подписи, а название — отличаться от статуса. Размер текста задаётся до записи каждой нужной строки.
ImagickDraw::getFontSizeImagickDraw::getFontSize(): floatПодпись должна быть немного меньше заголовка; внешняя тема должна соблюдать допустимый диапазон компонента. Для этого нужно прочитать настройку, а не угадывать её по PNG.
ImagickDraw::setResolutionImagickDraw::setResolution(float $resolution_x, float $resolution_y): boolВеб-карточка и подготовка текста для другой плотности не должны неожиданно давать разный масштаб. Явно зададим плотность контекста до выбора шрифта и рисования.
Положение и направление текста — 6 методов

Управлять выравниванием, gravity и текстовой геометрией.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::getGravityImagickDraw::getGravity(): intПолучив тему чужого компонента, нужно узнать, к какой части холста она привязывает текст, прежде чем повторять её или исправлять конфликтующие настройки.
ImagickDraw::setGravityImagickDraw::setGravity(int $gravity): boolЗаголовок должен держаться у верхнего края, а короткий статус — у нижнего правого угла карточки, даже когда начало строки не хочется вычислять вручную.
ImagickDraw::getTextAlignmentImagickDraw::getTextAlignment(): intСтиль суммы или заголовка приходит из темы: нужно сохранить его смысл в новом компоненте и выбрать соответствующее место для строки.
ImagickDraw::setTextAlignmentImagickDraw::setTextAlignment(int $align): boolСуммы разной длины должны иметь общий правый край, а подписи двух карточек — находиться вокруг их центров.
ImagickDraw::getTextAntialiasImagickDraw::getTextAntialias(): boolНастройку сглаживания надо перенести из темы либо временно изменить для отдельной технической метки и вернуть перед обычной подписью.
ImagickDraw::setTextAntialiasImagickDraw::setTextAntialias(bool $antialias): boolОбычная подпись должна читаться без грубых ступенек, а техническое сравнение иногда требует увидеть несглаженный край при одинаковой геометрии.
Интервалы текста — 6 методов

Настроить расстояния между буквами, словами и строками.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::getTextKerningImagickDraw::getTextKerning(): floatНовый ярлык должен использовать интервал темы либо ограничить его для небольшого компонента. Нужна текущая настройка, а не догадка по виду PNG.
ImagickDraw::setTextKerningImagickDraw::setTextKerning(float $kerning): boolИдентификатор или короткий заголовок нужно немного разрядить, сохранив сами формы букв. Сравним обычный, разреженный и немного уплотнённый вариант до применения в объявлении.
ImagickDraw::getTextInterwordSpacingImagickDraw::getTextInterwordSpacing(): floatКомпоненту нужно сохранить стиль темы или временно изменить промежуток для технической строки и затем вернуть исходное значение.
ImagickDraw::setTextInterwordSpacingImagickDraw::setTextInterwordSpacing(float $spacing): boolКраткую сводку из нескольких слов или чисел нужно сделать визуально более раздельной, не меняя расстояние между буквами каждого слова.
ImagickDraw::getTextInterlineSpacingImagickDraw::getTextInterlineSpacing(): floatМногострочная карточка должна сохранить стиль темы, а временный компактный блок не должен менять оформление следующего компонента.
ImagickDraw::setTextInterlineSpacingImagickDraw::setTextInterlineSpacing(float $spacing): boolИмя, место и время выдачи должны выглядеть тремя читаемыми строками, а не тесным комком текста. Изменим шаг строк, оставив их содержание и размер шрифта прежними.
Оформление и кодировка текста — 6 методов

Подложка, декорация, сглаживание и интерпретация строки.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::getTextDecorationImagickDraw::getTextDecoration(): intКомпонент должен сохранить оформление темы либо временно убрать зачёркивание у заголовка и вернуть его старой цене.
ImagickDraw::setTextDecorationImagickDraw::setTextDecoration(int $decoration): boolЧитателю нужно визуально отличить отменённую старую цену от новой, либо выделить проверенную строку подчёркиванием.
ImagickDraw::getTextUnderColorImagickDraw::getTextUnderColor(): ImagickPixelНовому статусу нужен цвет темы, а для более контрастной версии надо изменить его прозрачность, сохранив исходную тему.
ImagickDraw::setTextUnderColorImagickDraw::setTextUnderColor(ImagickPixel|string $under_color): boolКороткий статус должен читаться на неоднородном фоне, даже когда цвет букв сам по себе сливается с отдельными участками изображения.
ImagickDraw::getTextEncodingImagickDraw::getTextEncoding(): false|stringКомпонент получает Draw с неизвестной начальной настройкой и должен договориться о UTF-8, либо переносит эту политику в новый объект перед чтением файла.
ImagickDraw::setTextEncodingImagickDraw::setTextEncoding(string $encoding): boolРусская подпись из исходника или файла должна дать правильные буквы в PNG. Для этого нужны правильные байты, соответствующая настройка Draw и файл шрифта с нужными символами.
Очередь и её векторное описание — 6 методов

Сохранить собственные команды, восстановить, сбросить и понимать границу render.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::getVectorGraphicsImagickDraw::getVectorGraphics(): stringОдин настроенный значок должен воспроизводиться позже в другой задаче или после чтения своего файла.
ImagickDraw::setVectorGraphicsImagickDraw::setVectorGraphics(string $xml): boolФоновая задача получает утверждённый шаблон и должна нарисовать его на новом холсте без повторения исходных вызовов rectangle/circle.
ImagickDraw::renderImagickDraw::render(): boolВызов с названием render кажется способом получить PNG, но самостоятельный Draw не получает созданный отдельно холст автоматически.

Версионная оговорка. У standalone Draw в проверенной сборке прямой render не даёт готовый PNG; рабочая цепочка через Imagick::drawImage разобрана в карточке.

ImagickDraw::resetVectorGraphicsImagickDraw::resetVectorGraphics(): boolДолго живущий объект уже накопил фигуру, а для следующего файла нужна другая фигура без повторного исполнения старой.
ImagickDraw::setViewboxImagickDraw::setViewbox(int $left_x, int $top_y, int $right_x, int $bottom_y): boolСохранённый шаблон должен иметь понятную область рисунка; при новом размере нужно отличать её описание от фактического масштабирования.
ImagickDraw::commentImagickDraw::comment(string $comment): boolРазработчик открывает свой снимок и должен отличить начало значка от служебных линий, не добавляя надпись пользователю.
Семейство и начертания шрифта — 8 методов

Подобрать реально доступные faces для family/style/weight/stretch.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::getFontFamilyImagickDraw::getFontFamily(): stringНовому текстовому блоку нужно семейство темы либо понятный default, когда никакое семейство не задано.
ImagickDraw::setFontFamilyImagickDraw::setFontFamily(string $font_family): boolИз одного шаблона нужно получить простой статус без засечек или оформление сертификата с засечками.
ImagickDraw::getFontStyleImagickDraw::getFontStyle(): intНаклонное примечание темы надо перенести в новый объект либо временно сделать заголовок прямым и вернуть прежний запрос.
ImagickDraw::setFontStyleImagickDraw::setFontStyle(int $style): boolВ карточке нужно выделить примечание наклоном, сохранив прямой заголовок.
ImagickDraw::getFontWeightImagickDraw::getFontWeight(): intЖирное оформление итогов должно сохраниться после временной обычной строки или перейти в новый блок.
ImagickDraw::setFontWeightImagickDraw::setFontWeight(int $weight): boolИтоговую сумму покупатель должен быстро отличить от обычной строки количества.
ImagickDraw::getFontStretchImagickDraw::getFontStretch(): intУзкий служебный номер должен наследовать Condensed из темы, а заголовок оставаться обычным.
ImagickDraw::setFontStretchImagickDraw::setFontStretch(int $stretch): boolНомер заказа должен поместиться в ограниченном поле при прежней высоте букв.
Покраска пикселей, вставка и legacy alpha — 5 методов

Залить выбранную область, вставить снимок собственного изображения и перенести старые вызовы.

Метод и подробный разборОфициальная сигнатураКогда открыть
ImagickDraw::colorImagickDraw::color(float $x, float $y, int $paint): boolЗаполнить одну замкнутую ячейку макета или поменять фирменный цвет сразу в нескольких одинаковых областях.
ImagickDraw::compositeImagickDraw::composite(int $composite, float $x, float $y, float $width, float $height, Imagick $image): boolПоместить готовый значок подтверждения поверх карточки в заданном месте и размере, сохранив прозрачные углы.
ImagickDraw::matteImagickDraw::matte(float $x, float $y, int $paint): boolСтарый пример предлагает удалить фон через matte, но на актуальной сборке такого метода нет. Нужно понять причину и всё равно получить прозрачный PNG.

Версионная оговорка. В проверенной IM7-сборке метода нет; карточка показывает обработанный Error и современную замену.

ImagickDraw::setFillAlphaImagickDraw::setFillAlpha(float $alpha): boolСтарый код содержит setFillAlpha, и нужно сохранить полупрозрачную заливку без потери контуров при переходе на современное имя.

Версионная оговорка. Устаревший alias: в проверенной сборке E_DEPRECATED; для нового кода используйте соответствующий Opacity.

ImagickDraw::setStrokeAlphaImagickDraw::setStrokeAlpha(float $alpha): boolОслабить контур второстепенного блока, сохранив непрозрачную золотистую заливку и прозрачные области вне фигуры.

Версионная оговорка. Устаревший alias: в проверенной сборке E_DEPRECATED; для нового кода используйте соответствующий Opacity.

Ресурсы: создание больших холстов и накопление сложных очередей расходует native-память; ограничивайте размеры входа и количество фигур, освобождайте больше не нужные объекты после последнего использования. Не исполняйте непроверенное пользовательское векторное описание как собственные доверенные команды. Для фото и фильтров потребуется отдельная область Imagick; для простой готовой картинки можно обойтись прямыми операциями Imagick.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.