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

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

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

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

Глава 326 · От первого контура к схеме

ImagickDraw: базовые пути — от первой линии до составной схемы

13 методов: начало и конец пути, перенос пера, замыкание, абсолютные и относительные линии, горизонтали, вертикали и кубические кривые. Понятные координаты, PNG и практические сценарии.

Путь — инструкция движения пера, из которой получится PNG

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

Открытый маршрут из двух связанных отрезков
Открытый маршрут из двух связанных отрезков Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Кто выполняет каждый шаг
  1. Imagick хранит холст и пиксели
  2. ImagickDraw записывает оформление и path-команды
  3. pathStart → Move/Line/Curve/Close → pathFinish описывает один путь
  4. drawImage($draw) растеризует команды на холсте
  5. writeImage сохраняет файл, который можно открыть или отправить

Здесь путь — геометрический contour/path, а не путь к файлу на диске. Результирующий PNG содержит пиксели; эти команды сами по себе не записывают редактируемый контур Photoshop/GIMP в метаданные TIFF. Базовые отдельные фигуры разобраны в линии, круги и многоугольники.

Первый путь: три точки, две линии

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

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(25, 120);
$draw->pathLineToAbsolute(100, 60);
$draw->pathLineToAbsolute(210, 100);
$draw->pathFinish();
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/first-path.png');
echo "first-path.png\n";

Сохраните как first.php и выполните php first.php. При успешной записи рядом появится first-path.png 240×160: бирюзовые линии из (25,120) в (100,60), затем в (210,100), как на иллюстрации выше. В консоли — first-path.png и перевод строки. Вводный код специально короткий: отказ записи здесь ещё не обработан; ниже в карточках он проверяется.

ЗаписьЧто произошло
$image = new Imagick()Создан объект изображения; $image — имя переменной
newImage(240,160,'white')Создан белый холст шириной 240, высотой 160
$draw = new ImagickDraw()Создан отдельный объект набора команд; он ещё не картинка
setStrokeColor / setStrokeWidthЗаданы цвет и толщина следа пера
setFillColor('none')Заливка отключена, остаётся открытая линия
pathStart / pathFinishНачало и конец списка path-команд
pathMoveToAbsolute(25,120)Перо поставлено в первую точку без рисования
pathLineToAbsolute(100,60)Нарисован отрезок к следующей точке; она стала текущей
drawImage($draw)Команды применились к пикселям холста
writeImage(__DIR__ . '/first-path.png')Файл записан рядом со скриптом; точка склеила каталог и имя

-> вызывает метод у объекта, скобки содержат его аргументы, ; завершает инструкцию. new создаёт объект. Это объяснено на нашем конкретном рисунке; подробнее — класс и объект. echo выводит имя файла в консоль, не рисует изображение.

Текущая точка и начало подконтура — две разные отметки

У пера есть текущая позиция и запомненное начало последнего подконтура. Для начала (25,120) первая LineTo приходит в (100,60); теперь текущая — (100,60), но начало осталось (25,120). Следующая LineTo заканчивается в (210,100). Move в другое место начнёт новый подконтур без соединительной линии; Close рисует линию к началу именно этого подконтура.

ДействиеТекущая точка послеНачало подконтура после
MoveToAbsolute(25,120)(25,120)(25,120)
LineToAbsolute(100,60)(100,60)(25,120)
LineToRelative(110,40)(210,100)(25,120)
Close(25,120)(25,120)
MoveToAbsolute(140,115)(140,115)(140,115)

Аналогия с пером помогает понять порядок движений, но у Imagick нет физического пера: команды сначала записываются, а затем растеризуются. На белом холсте x растёт вправо, y — вниз. Положительный dy опускает точку; отрицательный поднимает. На 240×160 целые адреса пикселей x=0..239 и y=0..159; геометрические координаты могут быть дробными. Толстая линия около края частично обрежется, поэтому оставляйте запас половины толщины и сглаживания.

Absolute — куда прийти; Relative — насколько сдвинуться

Для верхней линии известны конечные точки: (20,55)→(100,25)→(150,65). Та же форма ниже начинается в (20,125), а шаги — (80,-30), затем (50,40). Абсолютная координата описывает место на холсте, относительная — сдвиг от текущей позиции. Ни одна из них не является процентом размеров.

Верхний бирюзовый путь задан абсолютными точками, нижний оранжевый — относительными шагами; форма одинакова
Верхний бирюзовый путь задан абсолютными точками, нижний оранжевый — относительными шагами; форма одинакова Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Два способа записать одинаковую формуПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 55);
$draw->pathLineToAbsolute(100, 25);
$draw->pathLineToAbsolute(150, 65);
$draw->pathFinish();
$draw->setStrokeColor('#c25732');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 125);
$draw->pathLineToRelative(80, -30);
$draw->pathLineToRelative(50, 40);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/absolute-relative.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'absolute-relative.png', "\n";
$draw->clear();
$image->clear();

При успехе absolute-relative.png 240×180 содержит два одинаковых излома со сдвигом 70 по y. Консоль — absolute-relative.png. Второй шаг Relative(50,40) считается уже от конца первого: (100,95)→(150,135), а не от начального (20,125).

Для переноса относительного шаблона обычно достаточно изменить его первый MoveToAbsolute. Если внутри оставлены Absolute-команды, они продолжают указывать на прежние места — это не ошибка движка, а смешение двух систем. Управляющие точки внутри одной CurveToRelative имеют общую базу до вызова; это отдельно показано в карточке кубической кривой.

В примерах if проверяет успешность сохранения, ! означает отрицание, throw передаёт ошибку вызывающему коду. См. исключения. Дальше foreach перебирает массив: сначала первый элемент, затем следующий; $index — его номер с нуля. Ключи dx/dy подписывают смещения во вложенных массивах; это вложенные массивы до JSON. Смысл цикла раскрыт в разделе циклов.

Finish и Close решают разные задачи; заливка может обмануть глаз

Finish завершает список команд, Close добавляет замыкающую геометрию подконтура. Поэтому незамкнутый угол в pathFinish.png остаётся углом; pathClose.png превращает его в треугольник. При ненулевой заливке внутренняя область открытого контура может заполняться так, словно между концом и началом есть граница, но это не означает наличия соответствующей обводки. Для маршрутов и связей задавайте fill='none'.

Finish: два отрезка, диагональной обводки нет
Finish: два отрезка, диагональной обводки нет Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Close: добавлена диагональная сторона и включена мятная заливка
Close: добавлена диагональная сторона и включена мятная заливка Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.

Move не оставляет следа, Line/Curve оставляют. Один pathStart может содержать несколько подконтуров. Разные стили проще разделить на несколько завершённых путей, меняя fill/stroke между ними; это одновременно облегчает чтение кода. Когда геометрия — один простой прямоугольник, rectangle короче длинной последовательности path-команд.

Начать путь: собрать несколько связанных команд

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

pathStart открывает запись пути; move выбирает начальную позицию, line рисует участки, pathFinish завершает запись. Нельзя вызывать path-команды как независимые фигуры вне этой пары.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Закончить запись пути, не дорисовывая замыкающий край

Для открытого маршрута нужно завершить список команд и затем применить его к изображению. Соединять конец с началом нельзя: это добавило бы несуществующий участок.

pathFinish заканчивает определение пути. В нашем примере после двух отрезков остаётся угол: диагональ из (200,125) в (40,35) не появляется. Для её добавления служит отдельный pathClose.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Замкнуть текущий подконтур и получить цельную границу

На отчёте нужна закрашенная треугольная область с обводкой со всех сторон. Две стороны заданы явно, третью нужно провести к началу.

pathClose добавляет прямой участок из текущей точки (200,125) к началу текущего подконтура (40,35). Затем текущей снова становится (40,35), а pathFinish завершает весь путь.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Перенести перо без линии: независимые фрагменты

На технической схеме два раздельных соединения; диагональ между ними была бы ложной связью.

MoveToAbsolute задаёт новую абсолютную позицию и начало подконтура. Переход от (100,45) к (140,115) не рисуется. Только следующий LineTo снова оставляет след.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Перенести перо на смещение от текущей точки

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

До вызова текущая точка (100,45). Смещение (40,70) даёт новое начало (140,115), без линии между ними. Следующий относительный отрезок (80,0) оканчивается в (220,115).

Открыть синтаксис, параметры, два примера с результатами и ограничения

Провести отрезок к известным координатам

Измерения уже пересчитаны в точки отчётного изображения. Нужно соединить соседние точки в заданном порядке.

Начало берётся из текущей точки. Аргументы задают только конец: сначала (100,60), затем (210,100). После каждого вызова этот конец становится новым текущим положением.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Провести отрезок на заданный сдвиг

Известны длины и направления шагов: вправо-вверх, затем вправо-вниз. Их нужно последовательно откладывать от предыдущего конца.

Из (25,120) смещение (75,-60) приводит в (100,60). Следующая команда (110,40) отсчитывается уже от (100,60) и заканчивается в (210,100). Минус у y ведёт вверх.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Горизонталь до общей x-координаты

Несколько разделителей таблицы должны заканчиваться на одной правой границе, независимо от начальной позиции.

Меняется только x, y сохраняется. Из (30,45) команда H200 приводит в (200,45); после V110 команда H80 приводит в (80,110), то есть влево.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Горизонталь заданной длины от текущего положения

Маршрут состоит из участков известной протяжённости; удобно наращивать их, не считая заранее каждый абсолютный конец.

Из (30,45) h170 даёт (200,45). После спуска v65 текущая (200,110); h-120 заканчивается в (80,110). Отрицательный сдвиг ведёт влево.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Вертикаль до общей y-координаты

В диаграмме столбики разной высоты должны доходить до одной общей нижней линии.

Меняется только y, x сохраняется. Из (50,25) V130 приходит в (50,130); после H190 команда V60 идёт вверх к (190,60).

Открыть синтаксис, параметры, два примера с результатами и ограничения

Вертикаль на положительную или отрицательную высоту

Известна высота индикатора, а его опорная точка задаётся отдельно. Нужно поднимать линию от базовой отметки, не вычисляя каждый конец вручную.

Из (50,25) v105 ведёт в (50,130). После h140 позиция (190,130); v-70 приводит в (190,60). Минус двигает вверх, плюс — вниз.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Кубическая кривая между текущей точкой и заданным концом

На схеме систем нужна плавная связь с обходом центрального блока; прямые отрезки выглядят угловато.

Начало уже задано MoveTo в (20,130). Пары (65,15) и (175,15) — две управляющие точки, (220,130) — конец. Кривая обычно не проходит через управляющие точки; они задают направление и изгиб.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Та же кубическая кривая в локальных смещениях

Изгиб символа хочется повторять в разных местах без пересчёта обеих управляющих точек.

Все три пары отсчитываются от одной текущей точки ДО команды — (20,130): (45,-115) даёт (65,15), (155,-115) даёт (175,15), (200,0) даёт конец (220,130). Внутри одной команды база не перескакивает между управляющими точками.

Открыть синтаксис, параметры, два примера с результатами и ограничения

Составная схема заказа: панели, связи и обходной путь

Теперь собираем знакомые команды в один понятный результат: три панели по горизонтали соответствуют «получен → обрабатывается → готов». Прямые соединения показывают основной маршрут, верхняя кривая — дополнительную связь от первой к третьей, нижняя П-образная линия — возврат от третьей к первой. Подписи даны здесь, чтобы пример оставался про пути, а не зависел от установки шрифтов. Это изображение схемы; оно не запускает обработку заказов.

Три мятные панели, основной маршрут со стрелками, верхняя плавная связь и нижний возврат; PNG 600×320
Три мятные панели, основной маршрут со стрелками, верхняя плавная связь и нижний возврат; PNG 600×320 Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Собрать составной рисунок из нескольких подконтуровПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(600, 320, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathLineToHorizontalAbsolute(180);
$draw->pathLineToVerticalAbsolute(220);
$draw->pathLineToHorizontalAbsolute(20);
$draw->pathClose();
$draw->pathMoveToAbsolute(220, 100);
$draw->pathLineToHorizontalRelative(160);
$draw->pathLineToVerticalRelative(120);
$draw->pathLineToHorizontalRelative(-160);
$draw->pathClose();
$draw->pathMoveToAbsolute(420, 100);
$draw->pathLineToHorizontalRelative(160);
$draw->pathLineToVerticalRelative(120);
$draw->pathLineToHorizontalRelative(-160);
$draw->pathClose();
$draw->pathFinish();
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(180, 160);
$draw->pathLineToHorizontalAbsolute(220);
$draw->pathMoveToAbsolute(380, 160);
$draw->pathLineToHorizontalAbsolute(420);
$draw->pathMoveToAbsolute(100, 100);
$draw->pathCurveToAbsolute(200, 10, 400, 10, 500, 100);
$draw->pathMoveToAbsolute(500, 220);
$draw->pathLineToVerticalAbsolute(280);
$draw->pathLineToHorizontalAbsolute(100);
$draw->pathLineToVerticalAbsolute(220);
$draw->pathFinish();
$draw->setFillColor('#146c74');
$draw->pathStart();
$draw->pathMoveToAbsolute(211, 154);
$draw->pathLineToRelative(9, 6);
$draw->pathLineToRelative(-9, 6);
$draw->pathClose();
$draw->pathMoveToAbsolute(411, 154);
$draw->pathLineToRelative(9, 6);
$draw->pathLineToRelative(-9, 6);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/service-route.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'service-route.png', "\n";
$draw->clear();
$image->clear();

При успехе создаётся service-route.png 600×320, консоль — service-route.png. Первый path содержит три закрытые панели, второй — независимые открытые соединения без заливки, третий — две закрытые стрелки с заливкой. Move отделяет фрагменты, Close замыкает только текущий, Finish завершает каждый список.

Упражнение: в средней панели замените старт (220,100) на (230,90), не меняя относительные стороны 160,120,-160. Решение: панель сдвинется на (+10,-10), остальные панели останутся на месте. Прямые соединения используют абсолютные концы, поэтому их нужно подвести к новым границам вручную. Это полезная проверка: перенос локального контура не меняет координаты остальных элементов за вас.

Применить в своём сервисе и не потерять результат

  • Проверяйте, что расширение Imagick установлено. Нативный запуск этих примеров пока не подтверждён; php -l проверяет только синтаксис.
  • Ограничивайте ширину, высоту, число точек и команд. Входной JSON сначала декодируют и валидируют как данные, а не вставляют непроверенным текстом в MVG/SVG или команду оболочки.
  • Сохраняйте в заранее выбранный каталог с фиксированной политикой имён. Не превращайте имя от посетителя в произвольный путь на диске. writeImage проверяйте отдельно.
  • Для HTTP-выдачи отправляйте готовые байты PNG с Content-Type: image/png; не выводите перед ними диагностическое имя, HTML и предупреждения PHP. Ошибку логируйте и возвращайте согласованным ответом.
  • В очередях с большим числом картинок освобождайте объекты после записи. Не начинайте с многопоточности: сначала измерьте drawImage и запись, сократите сложность и используйте кэш.

Следующие восемь path-методов — quadratic, smooth и elliptic arc — будут разобраны отдельно. Этот блок раскрывает 13 базовых методов, не объявляет весь ImagickDraw или весь PHP Manual завершённым. Полезные переходы: готовые фигуры, ответ сайта, исключения, измерение скорости.

Функции и методы этой темы

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

ImagickDraw::pathStartСхема движения состоит из нескольких отрезков, а не одной готовой фигуры. Нужен контейнер, в котором команды будут образовывать путь. pathStart открывает запись пути; move выбирает начальную позицию, line рисует участки, pathFinish завершает запись. Нельзя вызывать path-команды как независимые фигуры вне этой пары.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathStart(): bool

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

pathStart открывает запись пути; move выбирает начальную позицию, line рисует участки, pathFinish завершает запись. Нельзя вызывать path-команды как независимые фигуры вне этой пары.

Сигнатура: ImagickDraw::pathStart(): bool

Параметров нет. Пустые скобки () всё равно нужны: они вызывают метод. Начало, текущая точка и список команд уже хранятся в объекте Draw; этот вызов меняет состояние списка, не принимает картинку отдельным аргументом.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathstart",
  "name": "ImagickDraw::pathStart",
  "purpose_en": "Declares the start of a path drawing list",
  "description_en": "Declares the start of a path drawing list which is terminated by a matching DrawPathFinish() command. All other DrawPath commands must be enclosed between a and a DrawPathFinish() command. This is because path drawing commands are subordinate commands and they do not function by themselves.",
  "signature": "ImagickDraw::pathStart(): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::pathStart example",
      "language": "php",
      "code_sha256": "0bf05f1348dd3fbd23053b310718c31a92f717319b1885470d927625b01e8967"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathstart.php",
  "official_page_sha256": "deb55b5f61456c5111ba07af094f5aed39725177c64bd430c9030b4a87cfce23",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathstart.xml",
  "xml_sha256": "3460aa4d38599eb74d9a05869f2d5a41804c530bcd2657539e7e73e722abf7fb",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Открытый маршрут через (25,120), (100,60), (210,100)
Открытый маршрут через (25,120), (100,60), (210,100) Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Открытый маршрут через (25,120), (100,60), (210,100)Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(25, 120);
$draw->pathLineToAbsolute(100, 60);
$draw->pathLineToAbsolute(210, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathstart-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathstart-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathstart-basic.png 240×160. Открытый маршрут через (25,120), (100,60), (210,100). Консоль выведет pathstart-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Два независимых оформления в одной картинке

Открытый маршрут курьера и закрашенная площадка имеют разные стили. Записываем их отдельными путями, каждый со своей парой Start/Finish.

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

$image = new Imagick();
$image->newImage(340, 170, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 130);
$draw->pathLineToAbsolute(100, 45);
$draw->pathLineToAbsolute(180, 90);
$draw->pathFinish();
$draw->setFillColor('#bdebe2');
$draw->setStrokeColor('#c25732');
$draw->pathStart();
$draw->pathMoveToAbsolute(225, 45);
$draw->pathLineToHorizontalAbsolute(300);
$draw->pathLineToVerticalAbsolute(130);
$draw->pathLineToHorizontalAbsolute(225);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/route-and-area.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'route-and-area.png', "\n";
$draw->clear();
$image->clear();

Результат: route-and-area.png 340×170; консоль — route-and-area.png. Слева открытый бирюзовый маршрут, справа мятная прямоугольная площадка с оранжевой границей. Новый pathStart начал отдельный список команд после завершённого первого; смена fill относится ко второму пути.

Проблемы, границы и стоимость

Вложенный pathStart без завершения предыдущего пути — ошибка построения списка. Новый путь нужен, например, при смене оформления; move внутри одного пути создаёт только новый подконтур.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathFinish, ImagickDraw::pathMoveToAbsolute, ImagickDraw::pathClose. Ошибки получения файла: файлы и права.

ImagickDraw::pathFinishДля открытого маршрута нужно завершить список команд и затем применить его к изображению. Соединять конец с началом нельзя: это добавило бы несуществующий участок. pathFinish заканчивает определение пути. В нашем примере после двух отрезков остаётся угол: диагональ из (200,125) в (40,35) не появляется. Для её добавления служит отдельный pathClose.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathFinish(): bool

Для открытого маршрута нужно завершить список команд и затем применить его к изображению. Соединять конец с началом нельзя: это добавило бы несуществующий участок.

pathFinish заканчивает определение пути. В нашем примере после двух отрезков остаётся угол: диагональ из (200,125) в (40,35) не появляется. Для её добавления служит отдельный pathClose.

Сигнатура: ImagickDraw::pathFinish(): bool

Параметров нет. Пустые скобки () всё равно нужны: они вызывают метод. Начало, текущая точка и список команд уже хранятся в объекте Draw; этот вызов меняет состояние списка, не принимает картинку отдельным аргументом.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathfinish",
  "name": "ImagickDraw::pathFinish",
  "purpose_en": "Terminates the current path",
  "description_en": "Terminates the current path.",
  "signature": "ImagickDraw::pathFinish(): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathfinish.php",
  "official_page_sha256": "bd4d4691443c6249f09006fe16a4f13c6cf31c99433ff237557bd68aa536e616",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathfinish.xml",
  "xml_sha256": "c857c9f925cbe0391b005d55c1d002ef9e5a457a956850362e2b2723c9904c5a",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Две стороны незамкнутого угла: верхняя горизонталь и правая вертикаль
Две стороны незамкнутого угла: верхняя горизонталь и правая вертикаль Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Две стороны незамкнутого угла: верхняя горизонталь и правая вертикальПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(40, 35);
$draw->pathLineToAbsolute(200, 35);
$draw->pathLineToAbsolute(200, 125);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathfinish-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathfinish-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathfinish-basic.png 240×160. Две стороны незамкнутого угла: верхняя горизонталь и правая вертикаль. Консоль выведет pathfinish-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

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

Нужно показать маршрут и крупную отметку последней остановки. Путь закончился; затем вызываем уже знакомый circle как самостоятельную фигуру, не как path-команду.

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

$image = new Imagick();
$image->newImage(300, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(30, 125);
$draw->pathLineToHorizontalAbsolute(130);
$draw->pathLineToAbsolute(250, 55);
$draw->pathFinish();
$draw->setFillColor('#c25732');
$draw->setStrokeColor('#c25732');
$draw->circle(250, 55, 262, 55);
$image->drawImage($draw);
$path = __DIR__ . '/route-end-marker.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'route-end-marker.png', "\n";
$draw->clear();
$image->clear();

Результат: route-end-marker.png 300×160; консоль — route-end-marker.png. Открытая бирюзовая ломаная заканчивается оранжевым кругом радиусом 12. Соединения от круга к началу нет. pathFinish закрывает запись пути, а circle остаётся отдельной командой рисования.

Проблемы, границы и стоимость

Не заменяйте pathClose на pathFinish и наоборот. Finish не сохраняет PNG и не вызывает drawImage. Не оставляйте путь незавершённым в надежде, что writeImage исправит его.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathStart, ImagickDraw::pathClose. Ошибки получения файла: файлы и права.

ImagickDraw::pathCloseНа отчёте нужна закрашенная треугольная область с обводкой со всех сторон. Две стороны заданы явно, третью нужно провести к началу. pathClose добавляет прямой участок из текущей точки (200,125) к началу текущего подконтура (40,35). Затем текущей снова становится (40,35), а pathFinish завершает весь путь.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathClose(): bool

На отчёте нужна закрашенная треугольная область с обводкой со всех сторон. Две стороны заданы явно, третью нужно провести к началу.

pathClose добавляет прямой участок из текущей точки (200,125) к началу текущего подконтура (40,35). Затем текущей снова становится (40,35), а pathFinish завершает весь путь.

Сигнатура: ImagickDraw::pathClose(): bool

Параметров нет. Пустые скобки () всё равно нужны: они вызывают метод. Начало, текущая точка и список команд уже хранятся в объекте Draw; этот вызов меняет состояние списка, не принимает картинку отдельным аргументом.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathclose",
  "name": "ImagickDraw::pathClose",
  "purpose_en": "Adds a path element to the current path",
  "description_en": "Adds a path element to the current path which closes the current subpath by drawing a straight line from the current point to the current subpath's most recent starting point (usually, the most recent moveto point).",
  "signature": "ImagickDraw::pathClose(): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathclose.php",
  "official_page_sha256": "6b986b322b726d38fec797049a3dcdcc2e241a98d5aac3b9273d1c224edd5270",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathclose.xml",
  "xml_sha256": "7c9516af0154eb6da759cbcdf94dad5fb0b9e35f81422a631a27cce530f282aa",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Мятный треугольник с тремя бирюзовыми сторонами
Мятный треугольник с тремя бирюзовыми сторонами Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Мятный треугольник с тремя бирюзовыми сторонамиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$draw->pathStart();
$draw->pathMoveToAbsolute(40, 35);
$draw->pathLineToAbsolute(200, 35);
$draw->pathLineToAbsolute(200, 125);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathclose-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathclose-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathclose-basic.png 240×160. Мятный треугольник с тремя бирюзовыми сторонами. Консоль выведет pathclose-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Замкнутая деталь и выносная линия из её начального угла

На техническом эскизе сначала нужна цельная граница детали, затем короткий вынос вверх-влево именно из начального угла. Возврат текущей точки после Close убирает ручной пересчёт.

Замкнутая деталь и выносная линия из её начального углаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(40, 40);
$draw->pathLineToHorizontalAbsolute(180);
$draw->pathLineToVerticalAbsolute(120);
$draw->pathLineToHorizontalAbsolute(40);
$draw->pathClose();
$draw->pathLineToRelative(-20, -20);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/detail-with-callout.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'detail-with-callout.png', "\n";
$draw->clear();
$image->clear();

Результат: detail-with-callout.png 240×160; консоль — detail-with-callout.png. Прямоугольная граница (40,40)—(180,120) и диагональный вынос из (40,40) в (20,20). Последний Relative начинается в (40,40), поскольку Close вернул текущую точку к началу, а не оставил в (40,120).

Проблемы, границы и стоимость

Закрывается последний подконтур, а не все фигуры в pathStart. Close даёт замкнутый стык обводки; обычный LineTo назад к первой точке может оставить два окончания linecap вместо одного linejoin. При последующей Relative отсчёт идёт от начала закрытого подконтура.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathFinish, ImagickDraw::pathMoveToAbsolute, ImagickDraw::pathLineToRelative. Ошибки получения файла: файлы и права.

ImagickDraw::pathMoveToAbsoluteНа технической схеме два раздельных соединения; диагональ между ними была бы ложной связью. MoveToAbsolute задаёт новую абсолютную позицию и начало подконтура. Переход от (100,45) к (140,115) не рисуется. Только следующий LineTo снова оставляет след.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathMoveToAbsolute(float $x, float $y): bool

На технической схеме два раздельных соединения; диагональ между ними была бы ложной связью.

MoveToAbsolute задаёт новую абсолютную позицию и начало подконтура. Переход от (100,45) к (140,115) не рисуется. Только следующий LineTo снова оставляет след.

Сигнатура: ImagickDraw::pathMoveToAbsolute(float $x, float $y): bool

ПараметрТипСмысл
$xfloatАбсолютная x-координата нового начала подконтура
$yfloatАбсолютная y-координата нового начала

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathmovetoabsolute",
  "name": "ImagickDraw::pathMoveToAbsolute",
  "purpose_en": "Starts a new sub-path",
  "description_en": "Starts a new sub-path at the given coordinate using absolute coordinates. The current point then becomes the specified coordinate.",
  "signature": "ImagickDraw::pathMoveToAbsolute(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the starting point"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the starting point"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathmovetoabsolute.php",
  "official_page_sha256": "857384db5a5d5101cea7426fa0567d877a43c8a5761d9fcf47adabca62d9b855",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathmovetoabsolute.xml",
  "xml_sha256": "316f8becbb2468ac886c6b5a653c4d16d21e56fd500acf0722e338a66bc2a46d",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Два раздельных горизонтальных отрезка, между ними нет диагонали
Два раздельных горизонтальных отрезка, между ними нет диагонали Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Два раздельных горизонтальных отрезка, между ними нет диагоналиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 45);
$draw->pathLineToAbsolute(100, 45);
$draw->pathMoveToAbsolute(140, 115);
$draw->pathLineToAbsolute(220, 115);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathmovetoabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathmovetoabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathmovetoabsolute-basic.png 240×160. Два раздельных горизонтальных отрезка, между ними нет диагонали. Консоль выведет pathmovetoabsolute-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Три раздельные парковочные ячейки

Рисуем повторяющиеся открытые сверху ячейки по известным абсолютным позициям. Между соседними ячейками не должно быть диагональных соединений.

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

$image = new Imagick();
$image->newImage(320, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
foreach ([30, 120, 210] as $x) {
    $draw->pathMoveToAbsolute($x, 35);
    $draw->pathLineToVerticalAbsolute(125);
    $draw->pathLineToHorizontalAbsolute($x + 55);
    $draw->pathLineToVerticalAbsolute(35);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/parking-slots.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'parking-slots.png', "\n";
$draw->clear();
$image->clear();

Результат: parking-slots.png 320×160; консоль — parking-slots.png. Три открытые сверху ячейки шириной 55; начала x=30,120,210. Каждая MoveTo создаёт отдельный подконтур, поэтому путь между ячейками отсутствует.

Проблемы, границы и стоимость

Слово move означает смену позиции, а не отрезок. Каждый новый move меняет точку, к которой вернётся pathClose. Не используйте move, если нужно сохранить непрерывное соединение.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathMoveToRelative, ImagickDraw::pathLineToAbsolute, ImagickDraw::pathClose. Ошибки получения файла: файлы и права.

ImagickDraw::pathMoveToRelativeПовторяющийся символ нужно поставить после предыдущего с заданным промежутком. Пересчитывать абсолютные координаты каждого фрагмента неудобно. До вызова текущая точка (100,45). Смещение (40,70) даёт новое начало (140,115), без линии между ними. Следующий относительный отрезок (80,0) оканчивается в (220,115).

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathMoveToRelative(float $x, float $y): bool

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

До вызова текущая точка (100,45). Смещение (40,70) даёт новое начало (140,115), без линии между ними. Следующий относительный отрезок (80,0) оканчивается в (220,115).

Сигнатура: ImagickDraw::pathMoveToRelative(float $x, float $y): bool

ПараметрТипСмысл
$xfloatСдвиг dx от текущего x; плюс вправо, минус влево
$yfloatСдвиг dy от текущего y; плюс вниз, минус вверх

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathmovetorelative",
  "name": "ImagickDraw::pathMoveToRelative",
  "purpose_en": "Starts a new sub-path",
  "description_en": "Starts a new sub-path at the given coordinate using relative coordinates. The current point then becomes the specified coordinate.",
  "signature": "ImagickDraw::pathMoveToRelative(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "target x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "target y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathmovetorelative.php",
  "official_page_sha256": "5958230d7319b4b004e92b3ce75e4459693210e3205479714205b2a9fc2ce2ab",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathmovetorelative.xml",
  "xml_sha256": "e28e50165883664511369c204b520444b15c25a7a5624107c10b79681755090d",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Два раздельных отрезка; второй начинается на 40 правее и на 70 ниже конца первого
Два раздельных отрезка; второй начинается на 40 правее и на 70 ниже конца первого Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Два раздельных отрезка; второй начинается на 40 правее и на 70 ниже конца первогоПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 45);
$draw->pathLineToAbsolute(100, 45);
$draw->pathMoveToRelative(40, 70);
$draw->pathLineToRelative(80, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathmovetorelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathmovetorelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathmovetorelative-basic.png 240×160. Два раздельных отрезка; второй начинается на 40 правее и на 70 ниже конца первого. Консоль выведет pathmovetorelative-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Повторить отдельный шеврон с промежутком

Нужен ряд одинаковых уголков на инструкции упаковки. Рисуем каждый двумя локальными шагами, затем поднимаем перо и пропускаем промежуток 20.

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

$image = new Imagick();
$image->newImage(360, 150, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(25, 95);
foreach ([1, 2, 3] as $symbol) {
    $draw->pathLineToRelative(40, -45);
    $draw->pathLineToRelative(40, 45);
    $draw->pathMoveToRelative(20, 0);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/packing-chevrons.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'packing-chevrons.png', "\n";
$draw->clear();
$image->clear();

Результат: packing-chevrons.png 360×150; консоль — packing-chevrons.png. Три несоединённых уголка с вершинами (65,50), (165,50), (265,50). После первого конец (105,95), MoveRelative(20,0) создаёт новое начало (125,95). Последний move только переставляет перо, не добавляя видимого следа.

Проблемы, границы и стоимость

Смещение считается от текущего конца, а не от последнего MoveTo. Не путайте его с переносом всего существующего рисунка: уже записанные команды не сдвигаются. Первый явный MoveToAbsolute делает начальную опорную точку понятной.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathMoveToAbsolute, ImagickDraw::pathLineToRelative. Ошибки получения файла: файлы и права.

ImagickDraw::pathLineToAbsoluteИзмерения уже пересчитаны в точки отчётного изображения. Нужно соединить соседние точки в заданном порядке. Начало берётся из текущей точки. Аргументы задают только конец: сначала (100,60), затем (210,100). После каждого вызова этот конец становится новым текущим положением.

PECL imagick 2 · imagick

ImagickDraw::pathLineToAbsolute(float $x, float $y): bool

Измерения уже пересчитаны в точки отчётного изображения. Нужно соединить соседние точки в заданном порядке.

Начало берётся из текущей точки. Аргументы задают только конец: сначала (100,60), затем (210,100). После каждого вызова этот конец становится новым текущим положением.

Сигнатура: ImagickDraw::pathLineToAbsolute(float $x, float $y): bool

ПараметрТипСмысл
$xfloatАбсолютная x-координата КОНЦА нового отрезка
$yfloatАбсолютная y-координата КОНЦА нового отрезка

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathlinetoabsolute",
  "name": "ImagickDraw::pathLineToAbsolute",
  "purpose_en": "Draws a line path",
  "description_en": "Draws a line path from the current point to the given coordinate using absolute coordinates. The coordinate then becomes the new current point.",
  "signature": "ImagickDraw::pathLineToAbsolute(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending x coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathlinetoabsolute.php",
  "official_page_sha256": "0015f54aedad3063270f37a127bb517f37d7c5a34c9b3512ce5258de18730271",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathlinetoabsolute.xml",
  "xml_sha256": "ae23c7808be039541690ee391bf9fba214d775a33ab3886dadd41b667c12c64a",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Ломаная из двух связанных отрезков через три абсолютные точки
Ломаная из двух связанных отрезков через три абсолютные точки Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Ломаная из двух связанных отрезков через три абсолютные точкиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(25, 120);
$draw->pathLineToAbsolute(100, 60);
$draw->pathLineToAbsolute(210, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathlinetoabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathlinetoabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathlinetoabsolute-basic.png 240×160. Ломаная из двух связанных отрезков через три абсолютные точки. Консоль выведет pathlinetoabsolute-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Линия заявок из четырёх числовых наблюдений

В массиве четыре количества заявок: 20,90,45,110. Превращаем индекс в x, значение — в y и соединяем соседние периоды.

Линия заявок из четырёх числовых наблюденийПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$values = [20, 90, 45, 110];
$draw->pathStart();
foreach ($values as $index => $value) {
    $x = 30 + $index * 80;
    $y = 150 - $value;
    if ($index === 0) {
        $draw->pathMoveToAbsolute($x, $y);
    } else {
        $draw->pathLineToAbsolute($x, $y);
    }
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/requests-path.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'requests-path.png', "\n";
$draw->clear();
$image->clear();

Результат: requests-path.png 320×180; консоль — requests-path.png. Ломаная через (30,130), (110,60), (190,105), (270,40). Первый элемент задаёт начало без лишнего отрезка; следующие рисуют линию. Шкала 1 значение = 1 пиксель условная: для отчёта дополнительно нужны диапазон, оси и подписи.

Проблемы, границы и стоимость

В сигнатуре нет аргументов начала: перед первым отрезком задайте MoveTo. Неточности коротких подписей параметров в PHP Manual не меняют семантику: x и y здесь координаты конца. Для готового массива вершин без смешанных команд проще polyline.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathMoveToAbsolute, ImagickDraw::pathLineToRelative, ImagickDraw::pathLineToHorizontalAbsolute. Ошибки получения файла: файлы и права.

ImagickDraw::pathLineToRelativeИзвестны длины и направления шагов: вправо-вверх, затем вправо-вниз. Их нужно последовательно откладывать от предыдущего конца. Из (25,120) смещение (75,-60) приводит в (100,60). Следующая команда (110,40) отсчитывается уже от (100,60) и заканчивается в (210,100). Минус у y ведёт вверх.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathLineToRelative(float $x, float $y): bool

Известны длины и направления шагов: вправо-вверх, затем вправо-вниз. Их нужно последовательно откладывать от предыдущего конца.

Из (25,120) смещение (75,-60) приводит в (100,60). Следующая команда (110,40) отсчитывается уже от (100,60) и заканчивается в (210,100). Минус у y ведёт вверх.

Сигнатура: ImagickDraw::pathLineToRelative(float $x, float $y): bool

ПараметрТипСмысл
$xfloatСдвиг dx конца от текущего x
$yfloatСдвиг dy конца от текущего y

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathlinetorelative",
  "name": "ImagickDraw::pathLineToRelative",
  "purpose_en": "Draws a line path",
  "description_en": "Draws a line path from the current point to the given coordinate using relative coordinates. The coordinate then becomes the new current point.",
  "signature": "ImagickDraw::pathLineToRelative(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathlinetorelative.php",
  "official_page_sha256": "915c4c983f052c620d804d995ab762583b3d5d29d771cdc5e002b71caa01e830",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathlinetorelative.xml",
  "xml_sha256": "6a23be44223b890e88164c283533a49ee83c0adbde01bb156fb4d4fa21fa2bc0",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Тот же открытый маршрут, записанный смещениями двух участков
Тот же открытый маршрут, записанный смещениями двух участков Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Тот же открытый маршрут, записанный смещениями двух участковПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(25, 120);
$draw->pathLineToRelative(75, -60);
$draw->pathLineToRelative(110, 40);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathlinetorelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathlinetorelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathlinetorelative-basic.png 240×160. Тот же открытый маршрут, записанный смещениями двух участков. Консоль выведет pathlinetorelative-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Контур упаковки из списка смещений

Выкройка задана последовательностью векторов относительно предыдущего узла. Список можно хранить как шаблон и устанавливать в другом начальном положении.

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

$image = new Imagick();
$image->newImage(300, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$steps = [
    ['dx' => 60, 'dy' => -25], ['dx' => 60, 'dy' => 25],
    ['dx' => 0, 'dy' => 70], ['dx' => -60, 'dy' => 25],
    ['dx' => -60, 'dy' => -25], ['dx' => 0, 'dy' => -70],
];
$draw->pathStart();
$draw->pathMoveToAbsolute(80, 50);
foreach ($steps as $step) {
    $draw->pathLineToRelative($step['dx'], $step['dy']);
}
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/package-outline.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'package-outline.png', "\n";
$draw->clear();
$image->clear();

Результат: package-outline.png 300×180; консоль — package-outline.png. Мятный шестиугольник через (80,50),(140,25),(200,50),(200,120),(140,145),(80,120). Сумма dx и dy равна нулю, поэтому последний шаг вернулся в начало; Close делает контур явно замкнутым для стыка обводки.

Проблемы, границы и стоимость

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

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathLineToAbsolute, ImagickDraw::pathMoveToRelative, ImagickDraw::pathLineToVerticalRelative. Ошибки получения файла: файлы и права.

ImagickDraw::pathLineToHorizontalAbsoluteНесколько разделителей таблицы должны заканчиваться на одной правой границе, независимо от начальной позиции. Меняется только x, y сохраняется. Из (30,45) команда H200 приводит в (200,45); после V110 команда H80 приводит в (80,110), то есть влево.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathLineToHorizontalAbsolute(float $x): bool

Несколько разделителей таблицы должны заканчиваться на одной правой границе, независимо от начальной позиции.

Меняется только x, y сохраняется. Из (30,45) команда H200 приводит в (200,45); после V110 команда H80 приводит в (80,110), то есть влево.

Сигнатура: ImagickDraw::pathLineToHorizontalAbsolute(float $x): bool

ПараметрТипСмысл
$xfloatАбсолютная конечная x-координата; y остаётся прежним

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathlinetohorizontalabsolute",
  "name": "ImagickDraw::pathLineToHorizontalAbsolute",
  "purpose_en": "Draws a horizontal line path",
  "description_en": "Draws a horizontal line path from the current point to the target point using absolute coordinates. The target point then becomes the new current point.",
  "signature": "ImagickDraw::pathLineToHorizontalAbsolute(float $x): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathlinetohorizontalabsolute.php",
  "official_page_sha256": "7d88d42b0f7b713b464a4f63fb59c7449b6ffdd5d59a556a8d5bc87c6e4bf7c9",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathlinetohorizontalabsolute.xml",
  "xml_sha256": "957a041272f9b1fb994afecb3f72f04189e6273d8ffdf153ac0b2d2c2adeac53",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Ступень из горизонталей на y=45 и y=110, соединённых справа
Ступень из горизонталей на y=45 и y=110, соединённых справа Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Ступень из горизонталей на y=45 и y=110, соединённых справаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(30, 45);
$draw->pathLineToHorizontalAbsolute(200);
$draw->pathLineToVerticalAbsolute(110);
$draw->pathLineToHorizontalAbsolute(80);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathlinetohorizontalabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathlinetohorizontalabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathlinetohorizontalabsolute-basic.png 240×160. Ступень из горизонталей на y=45 и y=110, соединённых справа. Консоль выведет pathlinetohorizontalabsolute-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Разделители строк с общей правой границей

В PNG-таблице есть строки на разной высоте. Все линии должны закончиться на x=280, а начаться на x=30.

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

$image = new Imagick();
$image->newImage(320, 170, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
foreach ([40, 85, 130] as $y) {
    $draw->pathMoveToAbsolute(30, $y);
    $draw->pathLineToHorizontalAbsolute(280);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/table-rules.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'table-rules.png', "\n";
$draw->clear();
$image->clear();

Результат: table-rules.png 320×170; консоль — table-rules.png. Три горизонтальные линии от x=30 до x=280 на y=40,85,130. Аргумент 280 — единая конечная координата, а длина каждой линии здесь 250.

Проблемы, границы и стоимость

Аргумент — конечная x-координата, не длина. Если x меньше текущего, линия идёт влево. Нужна диагональ — выбирайте LineToAbsolute, меняющий сразу обе координаты.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathLineToHorizontalRelative, ImagickDraw::pathLineToVerticalAbsolute, ImagickDraw::pathLineToAbsolute. Ошибки получения файла: файлы и права.

ImagickDraw::pathLineToHorizontalRelativeМаршрут состоит из участков известной протяжённости; удобно наращивать их, не считая заранее каждый абсолютный конец. Из (30,45) h170 даёт (200,45). После спуска v65 текущая (200,110); h-120 заканчивается в (80,110). Отрицательный сдвиг ведёт влево.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathLineToHorizontalRelative(float $x): bool

Маршрут состоит из участков известной протяжённости; удобно наращивать их, не считая заранее каждый абсолютный конец.

Из (30,45) h170 даёт (200,45). После спуска v65 текущая (200,110); h-120 заканчивается в (80,110). Отрицательный сдвиг ведёт влево.

Сигнатура: ImagickDraw::pathLineToHorizontalRelative(float $x): bool

ПараметрТипСмысл
$xfloatГоризонтальный сдвиг dx; y остаётся прежним

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathlinetohorizontalrelative",
  "name": "ImagickDraw::pathLineToHorizontalRelative",
  "purpose_en": "Draws a horizontal line",
  "description_en": "Draws a horizontal line path from the current point to the target point using relative coordinates. The target point then becomes the new current point.",
  "signature": "ImagickDraw::pathLineToHorizontalRelative(float $x): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathlinetohorizontalrelative.php",
  "official_page_sha256": "72fc75a566ba3ab64b9515cd303ae57de94dde69cfbc8a09e92542313a0506ae",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathlinetohorizontalrelative.xml",
  "xml_sha256": "3285dabeec734ade354c19b5e488e6470bf4eaa77e5f4eb6cdaff8c4ea1f55d8",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Горизонтальная ступень со сдвигами +170 и -120
Горизонтальная ступень со сдвигами +170 и -120 Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Горизонтальная ступень со сдвигами +170 и -120Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(30, 45);
$draw->pathLineToHorizontalRelative(170);
$draw->pathLineToVerticalRelative(65);
$draw->pathLineToHorizontalRelative(-120);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathlinetohorizontalrelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathlinetohorizontalrelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathlinetohorizontalrelative-basic.png 240×160. Горизонтальная ступень со сдвигами +170 и -120. Консоль выведет pathlinetohorizontalrelative-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Ступенчатый маршрут по длинам участков

Для схемы монтажных переходов известны три горизонтальных участка 60,120,80 и одинаковый спуск 25 после каждого. Суммирование концов берёт на себя текущая точка пути.

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

$image = new Imagick();
$image->newImage(320, 140, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$lengths = [60, 120, 80];
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 30);
foreach ($lengths as $length) {
    $draw->pathLineToHorizontalRelative($length);
    $draw->pathLineToVerticalRelative(25);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/installation-steps.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'installation-steps.png', "\n";
$draw->clear();
$image->clear();

Результат: installation-steps.png 320×140; консоль — installation-steps.png. Лестница: (20,30)→(80,30)→(80,55)→(200,55)→(200,80)→(280,80)→(280,105). Все горизонтали задаются длиной от предыдущего конца, а не правой координатой.

Проблемы, границы и стоимость

Не передавайте абсолютный правый край вместо смещения: от x=30 аргумент 200 даст x=230. h0 не рисует протяжённый участок. Величина сдвига измеряется в единицах холста.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathLineToHorizontalAbsolute, ImagickDraw::pathLineToVerticalRelative. Ошибки получения файла: файлы и права.

ImagickDraw::pathLineToVerticalAbsoluteВ диаграмме столбики разной высоты должны доходить до одной общей нижней линии. Меняется только y, x сохраняется. Из (50,25) V130 приходит в (50,130); после H190 команда V60 идёт вверх к (190,60).

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathLineToVerticalAbsolute(float $y): bool

В диаграмме столбики разной высоты должны доходить до одной общей нижней линии.

Меняется только y, x сохраняется. Из (50,25) V130 приходит в (50,130); после H190 команда V60 идёт вверх к (190,60).

Сигнатура: ImagickDraw::pathLineToVerticalAbsolute(float $y): bool

ПараметрТипСмысл
$yfloatАбсолютная конечная y-координата; x остаётся прежним

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathlinetoverticalabsolute",
  "name": "ImagickDraw::pathLineToVerticalAbsolute",
  "purpose_en": "Draws a vertical line",
  "description_en": "Draws a vertical line path from the current point to the target point using absolute coordinates. The target point then becomes the new current point.",
  "signature": "ImagickDraw::pathLineToVerticalAbsolute(float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathlinetoverticalabsolute.php",
  "official_page_sha256": "c9f18d027255a131f8984d11af1541df5734891154e6db7e3fee19e971dde37b",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathlinetoverticalabsolute.xml",
  "xml_sha256": "5784046af7b3c2ed0ca9d7db65d66ff65dcf9f6ffb7cc791af6b2831ffe0264c",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Две вертикальные стороны с общей нижней горизонталью
Две вертикальные стороны с общей нижней горизонталью Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Две вертикальные стороны с общей нижней горизонтальюПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(50, 25);
$draw->pathLineToVerticalAbsolute(130);
$draw->pathLineToHorizontalAbsolute(190);
$draw->pathLineToVerticalAbsolute(60);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathlinetoverticalabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathlinetoverticalabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathlinetoverticalabsolute-basic.png 240×160. Две вертикальные стороны с общей нижней горизонталью. Консоль выведет pathlinetoverticalabsolute-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Столбики до общей нижней отметки

Есть три верхних положения столбиков диаграммы, а низ у них общий: y=150. Толстая вертикальная обводка позволяет показать простую столбчатую диаграмму без отдельных прямоугольников.

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

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$bars = [
    ['x' => 60, 'top' => 105],
    ['x' => 150, 'top' => 45],
    ['x' => 240, 'top' => 80],
];
$draw->setStrokeWidth(24);
$draw->pathStart();
foreach ($bars as $bar) {
    $draw->pathMoveToAbsolute($bar['x'], $bar['top']);
    $draw->pathLineToVerticalAbsolute(150);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/common-baseline.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'common-baseline.png', "\n";
$draw->clear();
$image->clear();

Результат: common-baseline.png 320×180; консоль — common-baseline.png. Три бирюзовых столбика толщиной 24 с общей нижней координатой y=150; их геометрические высоты 45,105,70. Для строгого прямоугольного заполнения и полного контроля границ можно выбрать rectangle.

Проблемы, границы и стоимость

Аргумент — конечная y-координата. Меньшее значение рисует вверх, ведь экранная ось y направлена вниз. Для математической диаграммы сначала пересчитайте значения в экранные координаты.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathLineToVerticalRelative, ImagickDraw::pathLineToHorizontalAbsolute. Ошибки получения файла: файлы и права.

ImagickDraw::pathLineToVerticalRelativeИзвестна высота индикатора, а его опорная точка задаётся отдельно. Нужно поднимать линию от базовой отметки, не вычисляя каждый конец вручную. Из (50,25) v105 ведёт в (50,130). После h140 позиция (190,130); v-70 приводит в (190,60). Минус двигает вверх, плюс — вниз.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathLineToVerticalRelative(float $y): bool

Известна высота индикатора, а его опорная точка задаётся отдельно. Нужно поднимать линию от базовой отметки, не вычисляя каждый конец вручную.

Из (50,25) v105 ведёт в (50,130). После h140 позиция (190,130); v-70 приводит в (190,60). Минус двигает вверх, плюс — вниз.

Сигнатура: ImagickDraw::pathLineToVerticalRelative(float $y): bool

ПараметрТипСмысл
$yfloatВертикальный сдвиг dy; x остаётся прежним

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathlinetoverticalrelative",
  "name": "ImagickDraw::pathLineToVerticalRelative",
  "purpose_en": "Draws a vertical line path",
  "description_en": "Draws a vertical line path from the current point to the target point using relative coordinates. The target point then becomes the new current point.",
  "signature": "ImagickDraw::pathLineToVerticalRelative(float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathlinetoverticalrelative.php",
  "official_page_sha256": "b045bbef21db1431de3c6cbbaef37a828330251fdadbc48ca534a3fe64d03593",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathlinetoverticalrelative.xml",
  "xml_sha256": "976ffb8bacb9d92cad132f01f5810c00c660971176fd2d09626b283e681def03",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Вертикальная ступень со спуском +105 и подъёмом -70
Вертикальная ступень со спуском +105 и подъёмом -70 Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Вертикальная ступень со спуском +105 и подъёмом -70Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(50, 25);
$draw->pathLineToVerticalRelative(105);
$draw->pathLineToHorizontalRelative(140);
$draw->pathLineToVerticalRelative(-70);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathlinetoverticalrelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathlinetoverticalrelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathlinetoverticalrelative-basic.png 240×160. Вертикальная ступень со спуском +105 и подъёмом -70. Консоль выведет pathlinetoverticalrelative-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Показать процент как подъём от нижней базы

Панель отчёта показывает готовность 25%,70%,95%. Нижняя точка задана y=145, а максимальная высота 120: положительный процент превращаем в отрицательное движение вверх.

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

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$percentages = [25, 70, 95];
$draw->setStrokeWidth(24);
$draw->pathStart();
foreach ($percentages as $index => $percent) {
    $height = 120 * $percent / 100;
    $draw->pathMoveToAbsolute(60 + $index * 90, 145);
    $draw->pathLineToVerticalRelative(-$height);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/completion-columns.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'completion-columns.png', "\n";
$draw->clear();
$image->clear();

Результат: completion-columns.png 320×180; консоль — completion-columns.png. Столбики высотой 30,84,114 идут вверх от y=145; верхние концы y=115,61,31. Перед использованием внешнего процента проверяйте 0..100: отрицательная или слишком большая высота — неверные входные данные, а не повод менять направление оси.

Проблемы, границы и стоимость

Высота -70 не является абсолютной координатой y=-70. Чтобы столбец рос вверх от y=145, передайте отрицательное смещение. Проверяйте допустимый диапазон измерений перед пересчётом масштаба.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathLineToVerticalAbsolute, ImagickDraw::pathLineToHorizontalRelative. Ошибки получения файла: файлы и права.

ImagickDraw::pathCurveToAbsoluteНа схеме систем нужна плавная связь с обходом центрального блока; прямые отрезки выглядят угловато. Начало уже задано MoveTo в (20,130). Пары (65,15) и (175,15) — две управляющие точки, (220,130) — конец. Кривая обычно не проходит через управляющие точки; они задают направление и изгиб.

PECL imagick 2, PECL imagick 3 · imagick

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::pathCurveToAbsolute(float $x1, float $y1, float $x2, float $y2, float $x, float $y): bool

ПараметрТипСмысл
$x1floatАбсолютный x первой управляющей точки
$y1floatАбсолютный y первой управляющей точки
$x2floatАбсолютный x второй управляющей точки
$y2floatАбсолютный y второй управляющей точки
$xfloatАбсолютный x конца кривой
$yfloatАбсолютный y конца кривой

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

В короткой официальной подписи y2 ошибочно упомянута первая управляющая точка; по описанию команды и SVG-модели это y второй управляющей точки. Снимок ниже сохраняет исходную неточность, русская таблица исправляет её смысл.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathcurvetoabsolute",
  "name": "ImagickDraw::pathCurveToAbsolute",
  "purpose_en": "Draws a cubic Bezier curve",
  "description_en": "Draws a cubic Bezier curve from the current point to (x,y) using (x1,y1) as the control point at the beginning of the curve and (x2,y2) as the control point at the end of the curve using absolute coordinates. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.",
  "signature": "ImagickDraw::pathCurveToAbsolute(float $x1, float $y1, float $x2, float $y2, float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x1",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the first control point"
    },
    {
      "name": "y1",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the first control point"
    },
    {
      "name": "x2",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the second control point"
    },
    {
      "name": "y2",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the first control point"
    },
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the curve end"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the curve end"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetoabsolute.php",
  "official_page_sha256": "b6c28f18941efca7ec5e807e8328ec90d950ff61ee429a0cab262ebf497566da",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoabsolute.xml",
  "xml_sha256": "0fa658de7087e8bbf90d1239cb24a8a6609d18cc1b7d0448084993b5e4ba8855",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Плавная верхняя арка из (20,130) в (220,130)
Плавная верхняя арка из (20,130) в (220,130) Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Плавная верхняя арка из (20,130) в (220,130)Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 130);
$draw->pathCurveToAbsolute(65, 15, 175, 15, 220, 130);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathcurvetoabsolute-basic.png 240×160. Плавная верхняя арка из (20,130) в (220,130). Консоль выведет pathcurvetoabsolute-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Две плавно соединённые части S-образной связи

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

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

$image = new Imagick();
$image->newImage(340, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(25, 100);
$draw->pathCurveToAbsolute(70, 20, 130, 20, 170, 100);
$draw->pathCurveToAbsolute(210, 180, 270, 180, 315, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/s-connection.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 's-connection.png', "\n";
$draw->clear();
$image->clear();

Результат: s-connection.png 340×200; консоль — s-connection.png. Две кубические части соединены в (170,100): первая поднимается, вторая опускается. Конец первой — начало второй; управляющая точка перед стыком (130,20) и после него (210,180) лежат на одной прямой со стыком и по разные стороны. Поэтому направление перехода согласовано без команды Smooth.

Проблемы, границы и стоимость

Шесть аргументов — три пары координат, а не три точки, через которые обязательно пройдёт линия. После вызова текущая точка равна концу (220,130), а не второй управляющей точке. Для соединения измерений без изменения их траектории используйте линии.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathCurveToRelative, ImagickDraw::pathLineToAbsolute, ImagickDraw::pathMoveToAbsolute. Ошибки получения файла: файлы и права.

ImagickDraw::pathCurveToRelativeИзгиб символа хочется повторять в разных местах без пересчёта обеих управляющих точек. Все три пары отсчитываются от одной текущей точки ДО команды — (20,130): (45,-115) даёт (65,15), (155,-115) даёт (175,15), (200,0) даёт конец (220,130). Внутри одной команды база не перескакивает между управляющими точками.

PECL imagick 2, PECL imagick 3 · imagick

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). Внутри одной команды база не перескакивает между управляющими точками.

Сигнатура: ImagickDraw::pathCurveToRelative(float $x1, float $y1, float $x2, float $y2, float $x, float $y): bool

ПараметрТипСмысл
$x1floatdx первой управляющей точки от начала команды
$y1floatdy первой управляющей точки от начала команды
$x2floatdx второй управляющей точки от того же начала
$y2floatdy второй управляющей точки от того же начала
$xfloatdx конца от того же начала
$yfloatdy конца от того же начала

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числа задают единицы холста; при отсутствии преобразований одна единица соответствует пикселю. Допустимы дробные координаты, влияющие на сглаживание. Имена x/y у Relative в сигнатуре не делают их абсолютными: это смещения.

Возвращаемое значение. Официальная сигнатура объявляет bool; текст return в снимке Manual говорит «Nothing is returned». Это пробел документации: актуальная реализация Imagick возвращает true после добавления команды. Bool не содержит изображение. Из этих вызовов не строят цепочку через ->; сохранение происходит только после drawImage и writeImage.

Доступность и отказы. PECL imagick 2, PECL imagick 3; в нашем снимке не указаны deprecated/removed. Страница отмечена как не полностью документированная, а разделы errors/changelog пусты. Это не гарантия отсутствия ошибок. Неверные типы дают TypeError, неверная последовательность/параметры могут привести к ImagickDrawException или ошибке применения пути. Запись файла может вернуть false или вызвать ImagickException. Сначала соберите завершённый путь, затем примените и сохраните его; в примерах отказ записи проверен. Ловите исключения на границе задания сайта, не подменяйте ошибку пустым успешным PNG.

Сохранённый полный контракт PHP Manual для сверки

Оригинальный снимок сохранён поле в поле, включая описания, формальные пробелы, версии, ссылки и хеши. Русское объяснение выше раскрывает фактическую семантику.

{
  "id": "imagickdraw.pathcurvetorelative",
  "name": "ImagickDraw::pathCurveToRelative",
  "purpose_en": "Draws a cubic Bezier curve",
  "description_en": "Draws a cubic Bezier curve from the current point to (x,y) using (x1,y1) as the control point at the beginning of the curve and (x2,y2) as the control point at the end of the curve using relative coordinates. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.",
  "signature": "ImagickDraw::pathCurveToRelative(float $x1, float $y1, float $x2, float $y2, float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x1",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of starting control point"
    },
    {
      "name": "y1",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of starting control point"
    },
    {
      "name": "x2",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of ending control point"
    },
    {
      "name": "y2",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of ending control point"
    },
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetorelative.php",
  "official_page_sha256": "9e31c9b1a711d84fed8c2d0fcbf46aea33b5a29886a80ca53b6ee53dc761caca",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetorelative.xml",
  "xml_sha256": "c48e6ffe01a9fa8994793e3e7381bdde0fb46508b403a78fe2e19229ee7ddd72",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Та же верхняя арка, что и в Absolute, с локальными смещениями
Та же верхняя арка, что и в Absolute, с локальными смещениями Иллюстрация отрисована ImageMagick CLI по тем же командам пути; это не подтверждение выполнения PHP Imagick.
Минимальное применение: Та же верхняя арка, что и в Absolute, с локальными смещениямиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 130);
$draw->pathCurveToRelative(45, -115, 155, -115, 200, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetorelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetorelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathcurvetorelative-basic.png 240×160. Та же верхняя арка, что и в Absolute, с локальными смещениями. Консоль выведет pathcurvetorelative-basic.png и перевод строки. Для применения именно рассматриваемого метода показано необходимое окружение Start/Move/Finish: эти команды не работают сами по себе вне пути. Все координаты и фон заданы кодом, внешние файлы не требуются.

Практическая задача: Повторяемая волна из локального шаблона

Внизу отчётного изображения нужна повторяемая плавная волна. Один период состоит из верхней и нижней дуги одинакового размера, а следующий начинается в конце предыдущего.

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

$image = new Imagick();
$image->newImage(540, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
foreach ([1, 2, 3] as $period) {
    $draw->pathCurveToRelative(20, -60, 60, -60, 80, 0);
    $draw->pathCurveToRelative(20, 60, 60, 60, 80, 0);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/repeated-wave.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'repeated-wave.png', "\n";
$draw->clear();
$image->clear();

Результат: repeated-wave.png 540×200; консоль — repeated-wave.png. Три периода по 160 единиц: старт (20,100), итог (500,100). В каждом верхняя половина заканчивается на 80 правее, затем нижняя ещё на 80. Это управляемый декоративный узор, не график измеренного сигнала: точки управления не подменяют реальные данные.

Проблемы, границы и стоимость

Нельзя вторую пару прибавлять к первой управляющей точке, а конец — ко второй: это даст другую кривую. После всей команды база обновится до конечной точки; следующая Relative будет считаться уже от неё. Относительные координаты удобны для повторяемого узора, а не автоматически вычисленной интерполяции данных.

Запись path-команды и получение PNG — разные этапы. Растеризация выполняется при drawImage; сложный длинный путь может отнять заметно больше времени, чем добавление команд. Ограничивайте размеры холста и число команд, измеряйте полную операцию и переиспользуйте статичный PNG. Память зависит от площади, числа каналов и внутренних буферов; число пикселей само по себе не равно числу байтов. Для простого контура достаточно готовых геометрических методов, для интерактивной схемы в браузере часто уместен SVG/canvas, для редактируемого контура нужно отдельно хранить его данные.

Продолжить: ImagickDraw::pathCurveToAbsolute, ImagickDraw::pathLineToRelative, ImagickDraw::pathMoveToRelative. Ошибки получения файла: файлы и права.

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

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

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

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

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