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

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

$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') убирает контур, чтобы видеть только заливку.
<?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 описывает, что и какими настройками сделать; 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; это разобрано в состоянии и копировании. Возврат к очереди и её экспорту — жизненный цикл векторного описания.
Подготовить команды в функции и передать результат

Когда знак требуется в нескольких местах проекта, можно вынести сборку команд в функцию. В следующем примере 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 группам: сигнатуры и точные переходы

Ниже все 124 официальных метода из зафиксированного дерева ImagickDraw, включая конструктор, исторические имена и условно доступные методы. Семнадцать групп объединяют уже подготовленные подробные разборы: раскройте нужную группу, проверьте сигнатуру и назначение, нажмите имя метода. Переход ведёт сразу в существующую карточку с параметрами, результатами и программами.
Фигуры и координаты — 10 методов
Линии, прямоугольники, круги, дуги и наборы точек: построить сам рисунок.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::arc | ImagickDraw::arc(float $start_x, float $start_y, float $end_x, float $end_y, float $start_angle, float $end_angle): bool | Нужно изобразить выполненную часть проверки, оставив незавершённую часть незакрашенной. Четыре координаты задают рамку эллипса; два угла выбирают его участок. Здесь верхняя дуга идёт от левой точки рамки к направлению 330°. |
| ImagickDraw::bezier | ImagickDraw::bezier(array $coordinates): bool | На схеме доставки прямой отрезок перекрывает другую подпись; соединение нужно отвести вверх. В этом примере четыре точки: первая и последняя лежат на кривой, две средние управляют изгибом. Кривая обычно не проходит через управляющие точки. |
| ImagickDraw::circle | ImagickDraw::circle(float $origin_x, float $origin_y, float $perimeter_x, float $perimeter_y): bool | Нужна круглая метка выбранного склада на схеме, а не готовая картинка из файла. (120,80) — центр. (170,80) — точка на окружности справа от центра, поэтому радиус равен 50. Последние два аргумента — координаты точки, а не ширина и высота. |
| ImagickDraw::ellipse | ImagickDraw::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::line | ImagickDraw::line(float $start_x, float $start_y, float $end_x, float $end_y): bool | Нужно соединить две измеренные позиции на небольшом отчётном изображении. (25,125) — начало, (215,35) — конец. Поскольку y растёт вниз, отрезок направлен вправо и вверх. Толщину и цвет задают перед вызовом. |
| ImagickDraw::point | ImagickDraw::point(float $x, float $y): bool | Есть сетка измерений: одну ячейку нужно пометить точным цветом без радиуса и окружности. point(60,60) адресует позицию на холсте 120×120. В примере fill и stroke намеренно одинаковы; для метки большого размера используется circle, а не предположение о толщине point. |
| ImagickDraw::polygon | ImagickDraw::polygon(array $coordinates): bool | На схеме магазина нужно закрасить обслуживаемую зону произвольной формы. Массив хранит четыре вершины по порядку обхода. Каждая вершина — вложенный массив с ключами x и y. Последняя автоматически соединяется с первой. |
| ImagickDraw::polyline | ImagickDraw::polyline(array $coordinates): bool | Курьер прислал последовательность позиций; нужно соединить их в том же порядке. Здесь четыре вершины и три отрезка. В отличие от polygon, обводка не замыкает путь последним отрезком. fill='none' предотвращает нежелательную заливку между началом и концом. |
| ImagickDraw::rectangle | ImagickDraw::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::roundRectangle | ImagickDraw::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::pathStart | ImagickDraw::pathStart(): bool | Схема движения состоит из нескольких отрезков, а не одной готовой фигуры. Нужен контейнер, в котором команды будут образовывать путь. pathStart открывает запись пути; move выбирает начальную позицию, line рисует участки, pathFinish завершает запись. Нельзя вызывать path-команды как независимые фигуры вне этой пары. |
| ImagickDraw::pathFinish | ImagickDraw::pathFinish(): bool | Для открытого маршрута нужно завершить список команд и затем применить его к изображению. Соединять конец с началом нельзя: это добавило бы несуществующий участок. pathFinish заканчивает определение пути. В нашем примере после двух отрезков остаётся угол: диагональ из (200,125) в (40,35) не появляется. Для её добавления служит отдельный pathClose. |
| ImagickDraw::pathClose | ImagickDraw::pathClose(): bool | На отчёте нужна закрашенная треугольная область с обводкой со всех сторон. Две стороны заданы явно, третью нужно провести к началу. pathClose добавляет прямой участок из текущей точки (200,125) к началу текущего подконтура (40,35). Затем текущей снова становится (40,35), а pathFinish завершает весь путь. |
| ImagickDraw::pathMoveToAbsolute | ImagickDraw::pathMoveToAbsolute(float $x, float $y): bool | На технической схеме два раздельных соединения; диагональ между ними была бы ложной связью. MoveToAbsolute задаёт новую абсолютную позицию и начало подконтура. Переход от (100,45) к (140,115) не рисуется. Только следующий LineTo снова оставляет след. |
| ImagickDraw::pathMoveToRelative | ImagickDraw::pathMoveToRelative(float $x, float $y): bool | Повторяющийся символ нужно поставить после предыдущего с заданным промежутком. Пересчитывать абсолютные координаты каждого фрагмента неудобно. До вызова текущая точка (100,45). Смещение (40,70) даёт новое начало (140,115), без линии между ними. Следующий относительный отрезок (80,0) оканчивается в (220,115). |
| ImagickDraw::pathLineToAbsolute | ImagickDraw::pathLineToAbsolute(float $x, float $y): bool | Измерения уже пересчитаны в точки отчётного изображения. Нужно соединить соседние точки в заданном порядке. Начало берётся из текущей точки. Аргументы задают только конец: сначала (100,60), затем (210,100). После каждого вызова этот конец становится новым текущим положением. |
| ImagickDraw::pathLineToRelative | ImagickDraw::pathLineToRelative(float $x, float $y): bool | Известны длины и направления шагов: вправо-вверх, затем вправо-вниз. Их нужно последовательно откладывать от предыдущего конца. Из (25,120) смещение (75,-60) приводит в (100,60). Следующая команда (110,40) отсчитывается уже от (100,60) и заканчивается в (210,100). Минус у y ведёт вверх. |
| ImagickDraw::pathLineToHorizontalAbsolute | ImagickDraw::pathLineToHorizontalAbsolute(float $x): bool | Несколько разделителей таблицы должны заканчиваться на одной правой границе, независимо от начальной позиции. Меняется только x, y сохраняется. Из (30,45) команда H200 приводит в (200,45); после V110 команда H80 приводит в (80,110), то есть влево. |
| ImagickDraw::pathLineToHorizontalRelative | ImagickDraw::pathLineToHorizontalRelative(float $x): bool | Маршрут состоит из участков известной протяжённости; удобно наращивать их, не считая заранее каждый абсолютный конец. Из (30,45) h170 даёт (200,45). После спуска v65 текущая (200,110); h-120 заканчивается в (80,110). Отрицательный сдвиг ведёт влево. |
| ImagickDraw::pathLineToVerticalAbsolute | ImagickDraw::pathLineToVerticalAbsolute(float $y): bool | В диаграмме столбики разной высоты должны доходить до одной общей нижней линии. Меняется только y, x сохраняется. Из (50,25) V130 приходит в (50,130); после H190 команда V60 идёт вверх к (190,60). |
| ImagickDraw::pathLineToVerticalRelative | ImagickDraw::pathLineToVerticalRelative(float $y): bool | Известна высота индикатора, а его опорная точка задаётся отдельно. Нужно поднимать линию от базовой отметки, не вычисляя каждый конец вручную. Из (50,25) v105 ведёт в (50,130). После h140 позиция (190,130); v-70 приводит в (190,60). Минус двигает вверх, плюс — вниз. |
| ImagickDraw::pathCurveToAbsolute | ImagickDraw::pathCurveToAbsolute(float $x1, float $y1, float $x2, float $y2, float $x, float $y): bool | На схеме систем нужна плавная связь с обходом центрального блока; прямые отрезки выглядят угловато. Начало уже задано MoveTo в (20,130). Пары (65,15) и (175,15) — две управляющие точки, (220,130) — конец. Кривая обычно не проходит через управляющие точки; они задают направление и изгиб. |
| ImagickDraw::pathCurveToRelative | ImagickDraw::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::pathCurveToQuadraticBezierAbsolute | ImagickDraw::pathCurveToQuadraticBezierAbsolute(float $x1, float $y1, float $x_end, float $y): bool | Нужна плавная верхняя грань ярлыка или простая арка между двумя позициями. Двух управляющих точек кубической кривой для этой формы не требуется. Начало уже стоит в (20,130); управляющая точка (120,20) тянет линию вверх; конец (220,130) завершает участок. Через управляющую точку кривая обычно не проходит: середина нашего участка имеет y=75, а не 20. |
| ImagickDraw::pathCurveToQuadraticBezierRelative | ImagickDraw::pathCurveToQuadraticBezierRelative(float $x1, float $y1, float $x_end, float $y): bool | Закруглённую вкладку нужно повторять в нескольких местах изображения, сохранив форму без пересчёта абсолютных управляющих координат. От текущей (20,130) смещение (100,-110) даёт управляющую (120,20), а (200,0) — конец (220,130). Обе пары считаются от одного начала команды, не одна от другой. |
| ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute | ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): bool | Составная линия должна пройти через общий узел без ручного повторного вычисления управляющей точки следующей половины. После Q с управляющей C=(70,20) и концом P=(120,100) команда SmoothAbsolute(220,100) использует отражённую C′=(170,180). Её вычисление: C′=2P−C. Аргументы задают только абсолютный конец новой квадратичной кривой. |
| ImagickDraw::pathCurveToQuadraticBezierSmoothRelative | ImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): bool | Для повторяемого мягкого контура удобно задать первую кривую явно, а следующие концы — одинаковыми локальными шагами. После q(50,-80,100,0) текущая (120,100), предыдущая управляющая (70,20). t(100,0) получает конец (220,100), а отражённую управляющую (170,180) вычисляет автоматически. База смещения конца — текущая точка, не отражённая. |
| ImagickDraw::pathCurveToSmoothAbsolute | ImagickDraw::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::pathCurveToSmoothRelative | ImagickDraw::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::pathEllipticArcAbsolute | ImagickDraw::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::pathEllipticArcRelative | ImagickDraw::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::getStrokeLineCap | ImagickDraw::getStrokeLineCap(): int | Нужно узнать, почему линия визуально длиннее расчётного диапазона, и учесть окончания при размещении в ограниченной области. |
| ImagickDraw::setStrokeLineCap | ImagickDraw::setStrokeLineCap(int $linecap): bool | На маршруте нужны мягкие окончания вместо прямого среза; геометрию пути менять не требуется. |
| ImagickDraw::getStrokeLineJoin | ImagickDraw::getStrokeLineJoin(): int | Вспомогательная отрисовка временно меняет оформление угла; нужно прочитать прежнее и восстановить его перед следующим объектом. |
| ImagickDraw::setStrokeLineJoin | ImagickDraw::setStrokeLineJoin(int $linejoin): bool | В схеме острые углы маршрута должны стать скруглёнными или срезанными, сохраняя те же вершины. |
| ImagickDraw::getStrokeMiterLimit | ImagickDraw::getStrokeMiterLimit(): int | Нужно понять, почему острый угол срезан: прочитать ограничение вместе с режимом Join, а не менять толщину вслепую. |
| ImagickDraw::setStrokeMiterLimit | ImagickDraw::setStrokeMiterLimit(int $miterlimit): bool | Острый поворот создаёт слишком длинный шип, который выходит за рамку значка. Ограничиваем его геометрическое отношение, не обрезая изображение. |
| ImagickDraw::getStrokeDashArray | ImagickDraw::getStrokeDashArray(): array | Нужно перенести пунктир основного объекта в легенду и отличить отсутствие pattern от массива длин. |
| ImagickDraw::setStrokeDashArray | ImagickDraw::setStrokeDashArray(array|null $dashes): bool | Плановый маршрут следует отличить от действующего не только цветом: задаём чередующиеся штрихи и промежутки. |
| ImagickDraw::getStrokeDashOffset | ImagickDraw::getStrokeDashOffset(): float | В конфигурации накопилась фаза больше периода. Прочитаем её и приведём к положительному эквиваленту, чтобы лог и настройки было легче сравнивать. |
| ImagickDraw::setStrokeDashOffset | ImagickDraw::setStrokeDashOffset(float $dash_offset): bool | Штрихи должны продолжаться согласованно после закрытого участком схемы разрыва; меняем фазу второго отрезка, не его координаты. |
Цвет и непрозрачность контура — 8 методов
Отдельно настроить цвет, прозрачность и сглаживание обводки.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::getStrokeColor | ImagickDraw::getStrokeColor(): ImagickPixel | Шаблон другого компонента уже выбрал цвет. Нужно узнать его или временно выделить предупреждение и вернуть прежний цвет без знания исходной строки. |
| ImagickDraw::setStrokeColor | ImagickDraw::setStrokeColor(ImagickPixel|string $color): bool | Несколько состояний в схеме нужно оформить согласованной палитрой, а не менять значения RGB вручную в каждом фрагменте. |
| ImagickDraw::getStrokeWidth | ImagickDraw::getStrokeWidth(): float | Для рамки внутри фиксированного холста нужно знать уже установленную толщину и оставить место под половину обводки по каждую сторону контура. |
| ImagickDraw::setStrokeWidth | ImagickDraw::setStrokeWidth(float $width): bool | На отчётной схеме загруженные соединения должны быть толще слабых, но не выходить за разумные пределы и не превращать нулевую нагрузку в линию. |
| ImagickDraw::getStrokeOpacity | ImagickDraw::getStrokeOpacity(): float | Шаблон содержит слишком слабую обводку для выбранного режима отчёта. Прочитаем opacity и применим заранее выбранный минимум, сохранив исходное значение для журнала. |
| ImagickDraw::setStrokeOpacity | ImagickDraw::setStrokeOpacity(float $opacity): bool | Нужно поверх отчётной сетки выделить область толстым штрихом, оставив данные под выделением видимыми. |
| ImagickDraw::getStrokeAntialias | ImagickDraw::getStrokeAntialias(): bool | Временный диагностический режим отключает сглаживание. Прочитаем прежний bool и вернём его, чтобы следующий обычный рисунок не унаследовал пиксельную лесенку. |
| ImagickDraw::setStrokeAntialias | ImagickDraw::setStrokeAntialias(bool $enabled): bool | Один экспорт нужен для пиксельной диагностики, другой — для обычной картинки интерфейса. Геометрия одинакова, режим покрытия края разный. |
Заливка и правила внутренних областей — 6 методов
Выбрать цвет, непрозрачность и правило заполнения контура.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::getFillColor | ImagickDraw::getFillColor(): ImagickPixel | Компонент получил цвет из темы. Нужно сделать от него вариант предупреждения и не изменить уже настроенный Draw случайной правкой полученного объекта. |
| ImagickDraw::setFillColor | ImagickDraw::setFillColor(ImagickPixel|string $fill_color): bool | Карточки статусов должны иметь согласованные цвета внутри и одинаковый читаемый край. Зададим палитру заливки отдельно от цвета обводки. |
| ImagickDraw::getFillOpacity | ImagickDraw::getFillOpacity(): float | Основная область и её отдельная легенда должны иметь одинаковую непрозрачность. Прочитаем уже выбранное значение и передадим другому Draw, вместо второго независимого числа в коде. |
| ImagickDraw::setFillOpacity | ImagickDraw::setFillOpacity(float $opacity): bool | Поверх отчётной сетки нужно показать диапазон выбора, сохранив данные под ним. Полупрозрачной будет заливка, а читаемый край останется непрозрачным. |
| ImagickDraw::getFillRule | ImagickDraw::getFillRule(): int | Тема уже содержит правило заливки. Перед созданием рамки с окном нужно проверить его и применить договорённое правило экспортируемой схемы, а не надеяться на значение по умолчанию. |
| ImagickDraw::setFillRule | ImagickDraw::setFillRule(int $fillrule): bool | Для рамки, значка или области с вырезом требуется определить, где у составного контура находится внутренняя область. Два отдельных rectangle не образуют одно правило вложенности. |
Перенос, масштаб и поворот — 6 методов
Менять систему координат перед последующими командами.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::translate | ImagickDraw::translate(float $x, float $y): bool | Нужно разместить одну карточку в разных местах отчёта, сохранив её внутренние координаты и расстояния между элементами. |
| ImagickDraw::rotate | ImagickDraw::rotate(float $degrees): bool | Значок или указатель нужно направить по маршруту. Поворот должен происходить вокруг понятного центра, а не отправлять фигуру за край картинки. |
| ImagickDraw::scale | ImagickDraw::scale(float $x, float $y): bool | Один векторный шаблон нужен в нескольких размерах или с противоположным направлением, без переписывания всех координат и ресайза уже размытого растра. |
| ImagickDraw::skewX | ImagickDraw::skewX(float $degrees): bool | Декоративной плашке нужен наклонный силуэт, а внутренние данные должны остаться читаемыми и горизонтальными. Преобразуем подложку отдельно от данных. |
| ImagickDraw::skewY | ImagickDraw::skewY(float $degrees): bool | На условной схеме устройства нужна боковая грань с наклонными верхним и нижним рёбрами. Она должна примыкать к прямому фасаду, не искажая весь фасад вместе с собой. |
| ImagickDraw::affine | ImagickDraw::affine(array $affine): bool | Экспортёр хранит положение, масштаб и перекос как шесть чисел. Нужна одна понятная формула перехода от локальной точки к точке холста и проверка, что фигура помещается в размер отчёта. |
Создание, копирование и состояние — 6 методов
Получить Draw, владеть им, временно сохранить настройки и освободить ресурсы.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::__construct | ImagickDraw::__construct(): void | Нужно подготовить фигуру для отчёта. Сначала нужен объект, который хранит команды и настройки; сам он ещё не является ни холстом, ни файлом. |
| ImagickDraw::clone | ImagickDraw::clone(): ImagickDraw | Из общей темы нужно получить независимый вариант: смена его цвета не должна менять базовый объект, а подготовленная очередь должна копироваться осознанно. |
| ImagickDraw::clear | ImagickDraw::clear(): bool | Черновик фигуры отменён до растеризации или Draw нужно использовать для следующего компонента. Старые команды и временная тема больше не должны участвовать в следующем drawImage. |
| ImagickDraw::destroy | ImagickDraw::destroy(): bool | В старом примере после drawImage встретился destroy. Нужно понять, очистит ли он картинку, удалит ли PHP-переменную и нужен ли дополнительный clear. Версионная оговорка. Legacy-имя освобождения: условия и современная работа с clear разобраны в карточке. |
| ImagickDraw::push | ImagickDraw::push(): bool | Внутри компонента временно меняются заливка, толщина или координатное преобразование. После него нужен прежний стиль, а вручную сохранять все свойства неудобно. |
| ImagickDraw::pop | ImagickDraw::pop(): bool | Временная тема или перевод локальных координат завершились; следующий компонент должен продолжить прежний стиль, даже если внутри произошёл отказ. |
Ограничение видимой области — 8 методов
Показать только часть рисунка внутри явно определённого clip path.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::pushClipPath | ImagickDraw::pushClipPath(string $clip_mask_id): bool | Нужно один раз описать окно аватарки и применять его ко всем полосам, кругам или линиям внутри неё. |
| ImagickDraw::popClipPath | ImagickDraw::popClipPath(): bool | Граница окна уже описана; следующие команды должны рисовать содержимое, а не продолжать описание маски. |
| ImagickDraw::setClipPath | ImagickDraw::setClipPath(string $clip_mask): bool | Полоса и круг выходят за рамку диаграммы. Вместо ручного вычисления пересечений включим уже определённое окно для последующих команд. |
| ImagickDraw::getClipPath | ImagickDraw::getClipPath(): false|string | Компоненту нельзя рисовать без безопасного окна; перед экспортом нужно узнать, какое имя активно, и установить fallback либо отказать при неверной настройке. |
| ImagickDraw::setClipRule | ImagickDraw::setClipRule(int $fillrule): bool | У рамки должен остаться настоящий просвет, а у перекрывающихся частей значка — сплошное пересечение. Формы похожи, но правило внутренней области требуется разное. |
| ImagickDraw::getClipRule | ImagickDraw::getClipRule(): int | Тема определяет правило рамки, а импортёр выбирает направление внутреннего контура. Для обоих действий нужно значение настройки, а не догадка по готовой картинке. |
| ImagickDraw::setClipUnits | ImagickDraw::setClipUnits(int $pathunits): bool | Окно в макете задано либо известными координатами панели, либо долями её ширины и высоты. Без явной договорённости оно окажется крошечным или полностью исчезнет. |
| ImagickDraw::getClipUnits | ImagickDraw::getClipUnits(): int | Переданный компонент ожидает координаты холста, а не нормализованные доли. Проверка enum предотвращает смешение этих договорённостей ещё до растеризации. |
Повторяемый узор — 6 методов
Определить именованный фрагмент и применить повторение к fill/stroke.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::pushDefs | ImagickDraw::pushDefs(): bool | Карточка использует повторяющийся фон и штриховку статуса. Их описание удобно отделить от команд, которые рисуют саму карточку. |
| ImagickDraw::popDefs | ImagickDraw::popDefs(): bool | Все образцы и окна уже описаны. Теперь rectangle должен стать панелью на изображении, а не частью списка определений. |
| ImagickDraw::pushPattern | ImagickDraw::pushPattern(string $pattern_id, float $x, float $y, float $width, float $height): bool | Для десятков точек не хочется вручную вычислять каждую позицию. Опишем маленькую ячейку один раз и передадим повторение заливке. |
| ImagickDraw::popPattern | ImagickDraw::popPattern(): bool | Точки ячейки уже описаны. Следующая большая фигура должна использовать образец, а отдельный значок рядом — остаться обычной фигурой. |
| ImagickDraw::setFillPatternURL | ImagickDraw::setFillPatternURL(string $fill_url): bool | Круглый значок и выделенная область должны содержать повторяющийся рисунок, а их форма и внешние поля сохраняются. |
| ImagickDraw::setStrokePatternURL | ImagickDraw::setStrokePatternURL(string $stroke_url): bool | Для маршрута или предупреждающей рамки требуется фактура широкой обводки, при этом внутренняя заливка может оставаться обычной. |
Первая надпись и файл шрифта — 6 методов
Подготовить шрифт, размер и текст с воспроизводимыми условиями запуска.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::annotation | ImagickDraw::annotation(float $x, float $y, string $text): bool | У статуса должна появиться настоящая читаемая надпись в PNG: её увидит человек, которому отправили карточку или отчёт. |
| ImagickDraw::setFont | ImagickDraw::setFont(string $font_name): bool | Одна и та же подпись должна выглядеть одинаково на компьютере разработчика и сервере, где привычного системного шрифта может не быть. |
| ImagickDraw::getFont | ImagickDraw::getFont(): string | Компоненту нужно перенести выбранный файл в новый Draw или заменить неизвестную системную настройку понятным переносимым вариантом. |
| ImagickDraw::setFontSize | ImagickDraw::setFontSize(float $point_size): bool | Цена должна быть заметнее подписи, а название — отличаться от статуса. Размер текста задаётся до записи каждой нужной строки. |
| ImagickDraw::getFontSize | ImagickDraw::getFontSize(): float | Подпись должна быть немного меньше заголовка; внешняя тема должна соблюдать допустимый диапазон компонента. Для этого нужно прочитать настройку, а не угадывать её по PNG. |
| ImagickDraw::setResolution | ImagickDraw::setResolution(float $resolution_x, float $resolution_y): bool | Веб-карточка и подготовка текста для другой плотности не должны неожиданно давать разный масштаб. Явно зададим плотность контекста до выбора шрифта и рисования. |
Положение и направление текста — 6 методов
Управлять выравниванием, gravity и текстовой геометрией.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::getGravity | ImagickDraw::getGravity(): int | Получив тему чужого компонента, нужно узнать, к какой части холста она привязывает текст, прежде чем повторять её или исправлять конфликтующие настройки. |
| ImagickDraw::setGravity | ImagickDraw::setGravity(int $gravity): bool | Заголовок должен держаться у верхнего края, а короткий статус — у нижнего правого угла карточки, даже когда начало строки не хочется вычислять вручную. |
| ImagickDraw::getTextAlignment | ImagickDraw::getTextAlignment(): int | Стиль суммы или заголовка приходит из темы: нужно сохранить его смысл в новом компоненте и выбрать соответствующее место для строки. |
| ImagickDraw::setTextAlignment | ImagickDraw::setTextAlignment(int $align): bool | Суммы разной длины должны иметь общий правый край, а подписи двух карточек — находиться вокруг их центров. |
| ImagickDraw::getTextAntialias | ImagickDraw::getTextAntialias(): bool | Настройку сглаживания надо перенести из темы либо временно изменить для отдельной технической метки и вернуть перед обычной подписью. |
| ImagickDraw::setTextAntialias | ImagickDraw::setTextAntialias(bool $antialias): bool | Обычная подпись должна читаться без грубых ступенек, а техническое сравнение иногда требует увидеть несглаженный край при одинаковой геометрии. |
Интервалы текста — 6 методов
Настроить расстояния между буквами, словами и строками.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::getTextKerning | ImagickDraw::getTextKerning(): float | Новый ярлык должен использовать интервал темы либо ограничить его для небольшого компонента. Нужна текущая настройка, а не догадка по виду PNG. |
| ImagickDraw::setTextKerning | ImagickDraw::setTextKerning(float $kerning): bool | Идентификатор или короткий заголовок нужно немного разрядить, сохранив сами формы букв. Сравним обычный, разреженный и немного уплотнённый вариант до применения в объявлении. |
| ImagickDraw::getTextInterwordSpacing | ImagickDraw::getTextInterwordSpacing(): float | Компоненту нужно сохранить стиль темы или временно изменить промежуток для технической строки и затем вернуть исходное значение. |
| ImagickDraw::setTextInterwordSpacing | ImagickDraw::setTextInterwordSpacing(float $spacing): bool | Краткую сводку из нескольких слов или чисел нужно сделать визуально более раздельной, не меняя расстояние между буквами каждого слова. |
| ImagickDraw::getTextInterlineSpacing | ImagickDraw::getTextInterlineSpacing(): float | Многострочная карточка должна сохранить стиль темы, а временный компактный блок не должен менять оформление следующего компонента. |
| ImagickDraw::setTextInterlineSpacing | ImagickDraw::setTextInterlineSpacing(float $spacing): bool | Имя, место и время выдачи должны выглядеть тремя читаемыми строками, а не тесным комком текста. Изменим шаг строк, оставив их содержание и размер шрифта прежними. |
Оформление и кодировка текста — 6 методов
Подложка, декорация, сглаживание и интерпретация строки.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::getTextDecoration | ImagickDraw::getTextDecoration(): int | Компонент должен сохранить оформление темы либо временно убрать зачёркивание у заголовка и вернуть его старой цене. |
| ImagickDraw::setTextDecoration | ImagickDraw::setTextDecoration(int $decoration): bool | Читателю нужно визуально отличить отменённую старую цену от новой, либо выделить проверенную строку подчёркиванием. |
| ImagickDraw::getTextUnderColor | ImagickDraw::getTextUnderColor(): ImagickPixel | Новому статусу нужен цвет темы, а для более контрастной версии надо изменить его прозрачность, сохранив исходную тему. |
| ImagickDraw::setTextUnderColor | ImagickDraw::setTextUnderColor(ImagickPixel|string $under_color): bool | Короткий статус должен читаться на неоднородном фоне, даже когда цвет букв сам по себе сливается с отдельными участками изображения. |
| ImagickDraw::getTextEncoding | ImagickDraw::getTextEncoding(): false|string | Компонент получает Draw с неизвестной начальной настройкой и должен договориться о UTF-8, либо переносит эту политику в новый объект перед чтением файла. |
| ImagickDraw::setTextEncoding | ImagickDraw::setTextEncoding(string $encoding): bool | Русская подпись из исходника или файла должна дать правильные буквы в PNG. Для этого нужны правильные байты, соответствующая настройка Draw и файл шрифта с нужными символами. |
Очередь и её векторное описание — 6 методов
Сохранить собственные команды, восстановить, сбросить и понимать границу render.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::getVectorGraphics | ImagickDraw::getVectorGraphics(): string | Один настроенный значок должен воспроизводиться позже в другой задаче или после чтения своего файла. |
| ImagickDraw::setVectorGraphics | ImagickDraw::setVectorGraphics(string $xml): bool | Фоновая задача получает утверждённый шаблон и должна нарисовать его на новом холсте без повторения исходных вызовов rectangle/circle. |
| ImagickDraw::render | ImagickDraw::render(): bool | Вызов с названием render кажется способом получить PNG, но самостоятельный Draw не получает созданный отдельно холст автоматически. Версионная оговорка. У standalone Draw в проверенной сборке прямой render не даёт готовый PNG; рабочая цепочка через Imagick::drawImage разобрана в карточке. |
| ImagickDraw::resetVectorGraphics | ImagickDraw::resetVectorGraphics(): bool | Долго живущий объект уже накопил фигуру, а для следующего файла нужна другая фигура без повторного исполнения старой. |
| ImagickDraw::setViewbox | ImagickDraw::setViewbox(int $left_x, int $top_y, int $right_x, int $bottom_y): bool | Сохранённый шаблон должен иметь понятную область рисунка; при новом размере нужно отличать её описание от фактического масштабирования. |
| ImagickDraw::comment | ImagickDraw::comment(string $comment): bool | Разработчик открывает свой снимок и должен отличить начало значка от служебных линий, не добавляя надпись пользователю. |
Семейство и начертания шрифта — 8 методов
Подобрать реально доступные faces для family/style/weight/stretch.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::getFontFamily | ImagickDraw::getFontFamily(): string | Новому текстовому блоку нужно семейство темы либо понятный default, когда никакое семейство не задано. |
| ImagickDraw::setFontFamily | ImagickDraw::setFontFamily(string $font_family): bool | Из одного шаблона нужно получить простой статус без засечек или оформление сертификата с засечками. |
| ImagickDraw::getFontStyle | ImagickDraw::getFontStyle(): int | Наклонное примечание темы надо перенести в новый объект либо временно сделать заголовок прямым и вернуть прежний запрос. |
| ImagickDraw::setFontStyle | ImagickDraw::setFontStyle(int $style): bool | В карточке нужно выделить примечание наклоном, сохранив прямой заголовок. |
| ImagickDraw::getFontWeight | ImagickDraw::getFontWeight(): int | Жирное оформление итогов должно сохраниться после временной обычной строки или перейти в новый блок. |
| ImagickDraw::setFontWeight | ImagickDraw::setFontWeight(int $weight): bool | Итоговую сумму покупатель должен быстро отличить от обычной строки количества. |
| ImagickDraw::getFontStretch | ImagickDraw::getFontStretch(): int | Узкий служебный номер должен наследовать Condensed из темы, а заголовок оставаться обычным. |
| ImagickDraw::setFontStretch | ImagickDraw::setFontStretch(int $stretch): bool | Номер заказа должен поместиться в ограниченном поле при прежней высоте букв. |
Покраска пикселей, вставка и legacy alpha — 5 методов
Залить выбранную область, вставить снимок собственного изображения и перенести старые вызовы.
| Метод и подробный разбор | Официальная сигнатура | Когда открыть |
|---|---|---|
| ImagickDraw::color | ImagickDraw::color(float $x, float $y, int $paint): bool | Заполнить одну замкнутую ячейку макета или поменять фирменный цвет сразу в нескольких одинаковых областях. |
| ImagickDraw::composite | ImagickDraw::composite(int $composite, float $x, float $y, float $width, float $height, Imagick $image): bool | Поместить готовый значок подтверждения поверх карточки в заданном месте и размере, сохранив прозрачные углы. |
| ImagickDraw::matte | ImagickDraw::matte(float $x, float $y, int $paint): bool | Старый пример предлагает удалить фон через matte, но на актуальной сборке такого метода нет. Нужно понять причину и всё равно получить прозрачный PNG. Версионная оговорка. В проверенной IM7-сборке метода нет; карточка показывает обработанный Error и современную замену. |
| ImagickDraw::setFillAlpha | ImagickDraw::setFillAlpha(float $alpha): bool | Старый код содержит setFillAlpha, и нужно сохранить полупрозрачную заливку без потери контуров при переходе на современное имя. Версионная оговорка. Устаревший alias: в проверенной сборке E_DEPRECATED; для нового кода используйте соответствующий Opacity. |
| ImagickDraw::setStrokeAlpha | ImagickDraw::setStrokeAlpha(float $alpha): bool | Ослабить контур второстепенного блока, сохранив непрозрачную золотистую заливку и прозрачные области вне фигуры. Версионная оговорка. Устаревший alias: в проверенной сборке E_DEPRECATED; для нового кода используйте соответствующий Opacity. |
Ресурсы: создание больших холстов и накопление сложных очередей расходует native-память; ограничивайте размеры входа и количество фигур, освобождайте больше не нужные объекты после последнего использования. Не исполняйте непроверенное пользовательское векторное описание как собственные доверенные команды. Для фото и фильтров потребуется отдельная область Imagick; для простой готовой картинки можно обойтись прямыми операциями Imagick.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


