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

Дерево руководства
Глава 327 · После базовых путей
ImagickDraw: квадратичные кривые, Smooth и эллиптические дуги
Восемь оставшихся path-методов: управляющие точки, отражение и fallback, относительная база, радиусы/поворот/флаги эллипса; от первой арки до значка магазина.
Какие формы получатся и что нужно знать перед началом
Для значка магазина нужна округлая ручка, для ярлыка — выгнутая панель, для составной схемы — плавно продолжающийся соединитель. Здесь разбираем последние восемь path-методов: квадратичные кривые, два вида Smooth и эллиптические дуги. Сначала получим короткую арку, затем поймём скрытые управляющие точки; флаги дуги разберём после кривых.

В базовой главе путей объяснены pathStart/Finish, Move/Line, текущая точка и Absolute/Relative. Кратко: Move ставит перо без линии; каждый участок начинается в текущей позиции, после рисования ею становится конец; Relative задаёт смещение от этой позиции. Эти значения нужны здесь, поэтому повторим их на конкретных числах. Объект Draw записывает команды, объект Imagick хранит пиксели; drawImage применяет список, writeImage сохраняет PNG.
- Начальная точка задаётся MoveTo
- Параметры кривой задают управляющие точки или свойства эллипса
- Последняя пара становится новым концом/текущей точкой
- Finish завершает список, drawImage меняет пиксели
- writeImage создаёт открываемый PNG; echo сообщает имя
Первая арка: начало, одна управляющая точка, конец
<?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, 130);
$draw->pathCurveToQuadraticBezierAbsolute(120, 20, 220, 130);
$draw->pathFinish();
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/first-quadratic.png');
echo "first-quadratic.png\n";
Сохраните как first.php и выполните php first.php. При успешной записи появится first-quadratic.png 240×180 с верхней бирюзовой аркой, как выше; консоль — first-quadratic.png и перевод строки. Вводный пример намеренно короткий, без обработки записи; ниже программы проверяют writeImage.
| Часть записи | Конкретное значение | Что значит |
|---|---|---|
| MoveTo(20,130) | Начало P0=(20,130) | С этого положения начнётся кривая |
| Первые два аргумента Q | C=(120,20) | Управляющая точка тянет линию вверх |
| Последние два аргумента Q | P1=(220,130) | Конец и новая текущая точка |
| Одна управляющая вместо двух | Четыре числа в Q | Это квадратичная, не кубическая кривая |
| fill none | Только обводка | Между концами не рисуется закрашенная область |
Буква Q здесь — короткое обозначение той же команды в SVG/MVG, не отдельная PHP-функция. $draw — переменная с объектом; -> вызывает его метод, скобки содержат параметры, ; завершает инструкцию. Смысл класса и объекта раскрыт в базовом объяснении. Координаты x растут вправо, y — вниз. Управляющая точка — ручка формы, через которую сама линия проходить не обязана.
Smooth: отражение конкретной предыдущей точки
Для квадратичной пары первая кривая приходит в P=(120,100), управляется C=(70,20). Чтобы продолжить её без новой явной управляющей, отражаем C через P: C′=P+(P−C)=(170,180). Это не зеркалирование всего рисунка; меняется только скрытая управляющая следующего участка. У кубической кривой отражается её вторая управляющая: при C2=(90,20) и том же P получается C1′=(150,180). Явная вторая управляющая новой кубической задаётся отдельно.


| Команда | Откуда берётся скрытая точка | Когда отражение не применяется |
|---|---|---|
| Quadratic Smooth T/t | Предыдущая Q/q/T/t; отражается её единственная управляющая | После Move, Line, cubic C/S, arc |
| Cubic Smooth S/s | Предыдущая C/c/S/s; отражается её вторая управляющая | После Move, Line, quadratic Q/T, arc |
В запасном случае скрытая точка совпадает с текущей. Поэтому Smooth не означает «сделай плавно после чего угодно». Между разными семействами кривых нужно явно согласовать управляющие точки. У каждой новой команды память обновляется, включая точки, вычисленные неявно.
Один и тот же Smooth после кривой и после линии
Слева предыдущая квадратичная команда дала точку для отражения; справа перед T стоит Line. У линии нет квадратичной управляющей, поэтому скрытая точка правого T совпадает с началом (360,100). Когда конец тоже лежит на y=100, участок получается прямым: название Smooth не заставляет его изгибаться.

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(480, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathCurveToQuadraticBezierAbsolute(70, 20, 120, 100);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(220, 100);
$draw->pathFinish();
$draw->setStrokeColor('#c25732');
$draw->pathStart();
$draw->pathMoveToAbsolute(260, 100);
$draw->pathLineToAbsolute(360, 100);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(460, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/fallback-comparison.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'fallback-comparison.png', "\n";
$draw->clear();
$image->clear();
При успехе создаётся fallback-comparison.png 480×200, консоль — fallback-comparison.png. Слева две противоположные квадратичные арки; справа линия от x=260 до x=460 на y=100 без изгиба. Правая T использует управляющую (360,100), потому что предыдущая команда Line не принадлежит семейству Q/T.
Дальнейшие программы используют if (!$image->writeImage(...)): отрицание ! проверяет отказ, throw сообщает его вызывающему коду. См. исключения. foreach повторяет команды для элементов массива; порядок и номер элемента объяснены в циклах.
Относительные пары одной команды имеют общую базу
| Вызов при текущей P=(20,130) | Координаты после пересчёта |
|---|---|
| q(100,-110,200,0) | Управляющая (120,20), конец (220,130) |
| s(70,80,100,0) при другой P=(120,100) | Явная вторая управляющая (190,180), конец (220,100); первая отражается отдельно |
| a(70,50,0,false,true,80,-40) при P=(80,110) | Радиусы 70/50, поворот 0°, конечная (160,70); размеры не являются смещениями |
Relative не означает проценты и не заставляет каждую пару считаться от предыдущей пары. Точка отсчёта берётся до команды; обновляется после её полного завершения. Для повторения локального контура меняют первый MoveTo. Для знакомых простых фигур иногда достаточно готовой ellipse или bezier.
Дуга эллипса: радиусы, поворот, два флага и особые случаи
Arc в path задаётся началом и концом, радиусами и двумя флагами. Центр не передаётся: движок подбирает эллипс, на котором лежат эти концы. rotation поворачивает оси эллипса в градусах; это не угол начала дуги. Если rx=ry, поворот окружности не меняет её форму. На обычном изображении ось y направлена вниз: положительный sweep воспринимается по часовой стрелке; после отражений/преобразований смотрите на изменённую систему координат.

| Условие | Правило endpoint-дуги SVG/MVG и практический выбор |
|---|---|
| large_arc=false / true | Малая / большая из подходящих дуг. Для ровно 180° по длине они не различаются |
| sweep=false / true | Отрицательное / положительное направление обхода; это отдельный выбор, не синоним большой дуги |
| Начало равно концу | Дуга не задаёт полный эллипс; пропускается. Сделайте две дуги с промежуточным концом или ellipse |
| rx=0 либо ry=0 | Дуга становится прямым участком к конечной точке |
| Отрицательный радиус | SVG-пересчёт использует абсолютную величину; прикладной ввод лучше нормализовать/отклонить явно |
| Радиусы слишком малы для двух концов | Радиусы увеличиваются с сохранением отношения, чтобы получить допустимый эллипс; не рассчитывайте на неизменный размер |
| Нужно заданное направление между двумя концами | Проверьте оба флага на небольшой диагностической картинке; четыре варианта ниже создаются одним примером |
Это стандартные правила геометрии endpoint-дуг; отдельная версия нативного растеризатора может иметь свои пограничные дефекты. В прикладной задаче фиксируйте версии и проверяйте нужный контур. Здесь нет заявления, что PHP-расширение уже исполнило все эти случаи.
Квадратичная кривая: изгиб с одной управляющей точкой
Нужна плавная верхняя грань ярлыка или простая арка между двумя позициями. Двух управляющих точек кубической кривой для этой формы не требуется.
Начало уже стоит в (20,130); управляющая точка (120,20) тянет линию вверх; конец (220,130) завершает участок. Через управляющую точку кривая обычно не проходит: середина нашего участка имеет y=75, а не 20.
Открыть параметры, два примера с результатами, ограничения и соседние методы
Квадратичная кривая в локальном шаблоне
Закруглённую вкладку нужно повторять в нескольких местах изображения, сохранив форму без пересчёта абсолютных управляющих координат.
От текущей (20,130) смещение (100,-110) даёт управляющую (120,20), а (200,0) — конец (220,130). Обе пары считаются от одного начала команды, не одна от другой.
Открыть параметры, два примера с результатами, ограничения и соседние методы
Продолжить квадратичную кривую отражённой точкой
Составная линия должна пройти через общий узел без ручного повторного вычисления управляющей точки следующей половины.
После Q с управляющей C=(70,20) и концом P=(120,100) команда SmoothAbsolute(220,100) использует отражённую C′=(170,180). Её вычисление: C′=2P−C. Аргументы задают только абсолютный конец новой квадратичной кривой.
Открыть параметры, два примера с результатами, ограничения и соседние методы
Цепочка квадратичных продолжений относительными концами
Для повторяемого мягкого контура удобно задать первую кривую явно, а следующие концы — одинаковыми локальными шагами.
После q(50,-80,100,0) текущая (120,100), предыдущая управляющая (70,20). t(100,0) получает конец (220,100), а отражённую управляющую (170,180) вычисляет автоматически. База смещения конца — текущая точка, не отражённая.
Открыть параметры, два примера с результатами, ограничения и соседние методы
Кубическое продолжение: первая управляющая отражается
Нужен S-образный соединитель: первая половина задана двумя управляющими точками, следующую хочется продолжить с согласованным направлением.
Предыдущая C закончилась в P=(120,100), её вторая управляющая C2=(90,20). Новая первая управляющая автоматически C1′=(150,180); передаём только вторую (190,180) и конец (220,100).
Открыть параметры, два примера с результатами, ограничения и соседние методы
Кубическое продолжение в смещениях от текущего узла
Узор ленты или повторяющаяся плавная связь собирается из одинаковых модулей. Отражение экономит одну пару чисел, а Relative оставляет модуль локальным.
Начало второго участка P=(120,100). (70,80) даёт вторую управляющую (190,180); (100,0) даёт конец (220,100). Первая управляющая отражается из прежней C2 в (150,180), независимо от переданной второй пары.
Открыть параметры, два примера с результатами, ограничения и соседние методы
Эллиптическая дуга к абсолютной конечной точке
Нужно соединить две позиции участком настоящего эллипса: например, ручка значка пакета или овальный вырез, а не произвольная кривая Безье.
Начало (80,110) уже задано Move. Радиусы 70 и 50 определяют форму эллипса, rotation=0 — его поворот; false выбирает малую дугу, true — положительное направление. Конец задан абсолютной точкой (160,70). Центр движок вычисляет сам.
Открыть параметры, два примера с результатами, ограничения и соседние методы
Эллиптическая дуга с относительным концом
Овальный значок нужно собрать как локальный замкнутый контур из двух дуг. Радиусы и поворот остаются свойствами эллипса, а конец каждой дуги задаётся сдвигом.
Из (80,110) последняя пара (80,-40) приводит в (160,70). Первые rx=70, ry=50 и rotation=0 не прибавляются к текущей точке: относительными являются только конечные x/y.
Открыть параметры, два примера с результатами, ограничения и соседние методы
Значок магазина: корпус, ручка и плавная полоса
Соединим изученное в видимый результат, который можно использовать как PNG-значок магазина или доставки. Мятный корпус ограничен прямыми сторонами и квадратичным нижним краем. Ручка — полуокружность эллиптической командой с равными радиусами. Внутренняя полоса состоит из явной кубической части и Smooth-продолжения. Это готовая растровая иконка, не обработчик заказа и не интерактивная кнопка.

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(400, 320, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
$draw->pathMoveToAbsolute(90, 100);
$draw->pathLineToHorizontalAbsolute(310);
$draw->pathLineToAbsolute(330, 270);
$draw->pathCurveToQuadraticBezierRelative(-130, 40, -260, 0);
$draw->pathClose();
$draw->pathFinish();
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(145, 100);
$draw->pathEllipticArcRelative(55, 55, 0, false, true, 110, 0);
$draw->pathFinish();
$draw->pathStart();
$draw->pathMoveToAbsolute(120, 190);
$draw->pathCurveToAbsolute(140, 150, 170, 150, 190, 190);
$draw->pathCurveToSmoothRelative(50, 40, 80, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/shop-bag.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'shop-bag.png', "\n";
$draw->clear();
$image->clear();
При успехе создаётся shop-bag.png 400×320, консоль — shop-bag.png. Корпус начинается (90,100), после стороны приходит в (330,270); относительная Q использует управляющую (200,310) и конец (70,270). Ручка идёт из (145,100) в (255,100) радиусом 55. Полоса заканчивается в (270,190), вторая её часть продолжает первую отражением.
Упражнение: сделайте ручку выше, не двигая её концы. Решение: у ручки измените радиусы с (55,55) на (55,75), оставив конец-смещение (110,0). Получится верхняя половина эллипса; одной смены rotation для окружности недостаточно. Затем измените вторую управляющую SmoothRelative с (50,40) на (50,20): нижний изгиб полосы станет слабее, конец останется прежним.
Перенести приём в свой проект
- Не начинайте со Smooth, если не знаете предыдущий тип кривой: сначала выпишите текущую точку и обе управляющие в абсолютных координатах, проверьте форму, затем сокращайте запись.
- Проверяйте входные размеры, числовые координаты, значения флагов и диапазоны задания. Не вставляйте пользовательский текст в MVG/SVG или командную строку.
- Сохраняйте файлы в фиксированном каталоге с безопасными именами. Непроверенный путь пользователя не должен выходить за его границы; отдельно обрабатывайте ошибку записи.
- В HTTP-ответ отправляют готовые байты PNG с Content-Type: image/png; диагностика echo из учебных программ не должна попадать перед бинарными данными.
- Для длительной очереди освобождайте Draw/Imagick после работы; проверяйте нужные пограничные контуры на версии, используемой сервером. Одного синтаксического lint для этого недостаточно.
С этим дополнением разобраны все 21 path-метод из сохранённого дерева ImagickDraw: 13 базовых и эти 8. Это не объявление всего ImagickDraw или полного PHP Manual завершёнными. Другие настройки, оформление текста, заливки и композиция имеют отдельные разделы. Дальше полезны файлы, исключения и измерение времени.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
ImagickDraw::pathCurveToQuadraticBezierAbsoluteНужна плавная верхняя грань ярлыка или простая арка между двумя позициями. Двух управляющих точек кубической кривой для этой формы не требуется. Начало уже стоит в (20,130); управляющая точка (120,20) тянет линию вверх; конец (220,130) завершает участок. Через управляющую точку кривая обычно не проходит: середина нашего участка имеет y=75, а не 20.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pathCurveToQuadraticBezierAbsolute(float $x1, float $y1, float $x_end, float $y): boolНужна плавная верхняя грань ярлыка или простая арка между двумя позициями. Двух управляющих точек кубической кривой для этой формы не требуется.
Начало уже стоит в (20,130); управляющая точка (120,20) тянет линию вверх; конец (220,130) завершает участок. Через управляющую точку кривая обычно не проходит: середина нашего участка имеет y=75, а не 20.
Сигнатура: ImagickDraw::pathCurveToQuadraticBezierAbsolute(float $x1, float $y1, float $x_end, float $y): bool
| Параметр | Тип | Что передать |
|---|---|---|
$x1 | float | Абсолютный x управляющей точки |
$y1 | float | Абсолютный y управляющей точки |
$x_end | float | Абсолютный x конца |
$y | float | Абсолютный y конца |
Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.
Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.
Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.
Полный сохранённый контракт PHP Manual
Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.
{
"id": "imagickdraw.pathcurvetoquadraticbezierabsolute",
"name": "ImagickDraw::pathCurveToQuadraticBezierAbsolute",
"purpose_en": "Draws a quadratic Bezier curve",
"description_en": "Draws a quadratic Bezier curve from the current point to (x,y) using (x1,y1) as the control point 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::pathCurveToQuadraticBezierAbsolute(float $x1, float $y1, float $x_end, 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 control point"
},
{
"name": "y1",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "y coordinate of the control point"
},
{
"name": "x_end",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x coordinate of the end point"
},
{
"name": "y",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "y coordinate of the end point"
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::pathCurveToQuadraticBezierAbsolute example",
"language": "php",
"code_sha256": "f4ecca82d68901fa89c20a5be9de4b643e888008a420cf6bd1dc2c1f8efade65"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierabsolute.php",
"official_page_sha256": "64e7b4338df2c5a48f6a9f536384bc64456e56c04e8043b0114e12094ac923b7",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoquadraticbezierabsolute.xml",
"xml_sha256": "d35e1b736fa055e18f91589f15a9c4753afc079a585e7d2243a7bcc47d34be29",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_paths.py"
}
<?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, 130);
$draw->pathCurveToQuadraticBezierAbsolute(120, 20, 220, 130);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoquadraticbezierabsolute-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoquadraticbezierabsolute-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся pathcurvetoquadraticbezierabsolute-basic.png 240×180. Одна симметричная верхняя арка из (20,130) в (220,130). Консоль — pathcurvetoquadraticbezierabsolute-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.
Практическая задача: Панель ярлыка с выпуклым верхом
Закрываем область для цветной подложки: верхний край изгибается, остальные стороны прямые. Это самостоятельный фон ярлыка, к которому позже можно добавить текст.
<?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');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
$draw->pathMoveToAbsolute(30, 150);
$draw->pathLineToAbsolute(30, 50);
$draw->pathCurveToQuadraticBezierAbsolute(160, 10, 290, 50);
$draw->pathLineToAbsolute(290, 150);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/arched-label.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'arched-label.png', "\n";
$draw->clear();
$image->clear();
Результат: arched-label.png 320×180; консоль — arched-label.png. Мятная панель с прямыми боками и нижней гранью; верхний изгиб проходит через (30,50) и (290,50), достигает y=30 в середине. Управляющая (160,10) лежит выше самой кривой.
Что проверить и чем заменить
Управляющая точка задаёт форму, а не дополнительную обязательную вершину. После команды текущая точка становится (220,130). Если нужна раздельная настройка касательной в обоих концах, используйте кубическую CurveTo из базовой главы.
Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.
Рядом: ImagickDraw::pathCurveToQuadraticBezierRelative, ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute. Устройство текущей точки: базовые пути.
ImagickDraw::pathCurveToQuadraticBezierRelativeЗакруглённую вкладку нужно повторять в нескольких местах изображения, сохранив форму без пересчёта абсолютных управляющих координат. От текущей (20,130) смещение (100,-110) даёт управляющую (120,20), а (200,0) — конец (220,130). Обе пары считаются от одного начала команды, не одна от другой.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pathCurveToQuadraticBezierRelative(float $x1, float $y1, float $x_end, float $y): boolЗакруглённую вкладку нужно повторять в нескольких местах изображения, сохранив форму без пересчёта абсолютных управляющих координат.
От текущей (20,130) смещение (100,-110) даёт управляющую (120,20), а (200,0) — конец (220,130). Обе пары считаются от одного начала команды, не одна от другой.
Сигнатура: ImagickDraw::pathCurveToQuadraticBezierRelative(float $x1, float $y1, float $x_end, float $y): bool
| Параметр | Тип | Что передать |
|---|---|---|
$x1 | float | dx управляющей точки от текущего начала команды |
$y1 | float | dy управляющей точки от того же начала |
$x_end | float | dx конца от того же начала |
$y | float | dy конца от того же начала |
Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.
Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.
Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.
Полный сохранённый контракт PHP Manual
Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.
{
"id": "imagickdraw.pathcurvetoquadraticbezierrelative",
"name": "ImagickDraw::pathCurveToQuadraticBezierRelative",
"purpose_en": "Draws a quadratic Bezier curve",
"description_en": "Draws a quadratic Bezier curve from the current point to (x,y) using (x1,y1) as the control point 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::pathCurveToQuadraticBezierRelative(float $x1, float $y1, float $x_end, float $y): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "x1",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "starting x coordinate"
},
{
"name": "y1",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "starting y coordinate"
},
{
"name": "x_end",
"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.pathcurvetoquadraticbezierrelative.php",
"official_page_sha256": "05b9f59675de4dd2348628eeb92d68988f0f41aa72f90ec1f210a45e72ecf713",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoquadraticbezierrelative.xml",
"xml_sha256": "500e554c52c4526e85348ea254b24cdda49cf745ee57eb14f5b89240c5ffc08e",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_paths.py"
}
<?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, 130);
$draw->pathCurveToQuadraticBezierRelative(100, -110, 200, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoquadraticbezierrelative-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoquadraticbezierrelative-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся pathcurvetoquadraticbezierrelative-basic.png 240×180. Та же верхняя арка, записанная относительными смещениями. Консоль — pathcurvetoquadraticbezierrelative-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.
Практическая задача: Три одинаковые вкладки из локального контура
На печатной инструкции нужно показать три места под ярлыки. Меняем только начальные x-позиции, а форму каждой вкладки описываем смещениями.
<?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');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
foreach ([20, 120, 220] as $x) {
$draw->pathMoveToAbsolute($x, 130);
$draw->pathLineToRelative(0, -70);
$draw->pathCurveToQuadraticBezierRelative(35, -40, 70, 0);
$draw->pathLineToRelative(0, 70);
$draw->pathClose();
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/repeated-tabs.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'repeated-tabs.png', "\n";
$draw->clear();
$image->clear();
Результат: repeated-tabs.png 320×180; консоль — repeated-tabs.png. Три мятные вкладки шириной 70 с нижней гранью y=130 и выпуклым верхом: кривая начинается на y=60, её середина y=40. Независимые Move отделяют контуры, чтобы между вкладками не возникла линия.
Что проверить и чем заменить
Последняя пара не прибавляется к управляющей точке. Relative меняет только смысл координат, не степень кривой. Текущая точка обновится до конца после всей команды; следующая Relative получит новую базу.
Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.
Рядом: ImagickDraw::pathCurveToQuadraticBezierAbsolute, ImagickDraw::pathCurveToQuadraticBezierSmoothRelative. Устройство текущей точки: базовые пути.
ImagickDraw::pathCurveToQuadraticBezierSmoothAbsoluteСоставная линия должна пройти через общий узел без ручного повторного вычисления управляющей точки следующей половины. После Q с управляющей C=(70,20) и концом P=(120,100) команда SmoothAbsolute(220,100) использует отражённую C′=(170,180). Её вычисление: C′=2P−C. Аргументы задают только абсолютный конец новой квадратичной кривой.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): boolСоставная линия должна пройти через общий узел без ручного повторного вычисления управляющей точки следующей половины.
После Q с управляющей C=(70,20) и концом P=(120,100) команда SmoothAbsolute(220,100) использует отражённую C′=(170,180). Её вычисление: C′=2P−C. Аргументы задают только абсолютный конец новой квадратичной кривой.
Сигнатура: ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): bool
| Параметр | Тип | Что передать |
|---|---|---|
$x | float | Абсолютный x конца; управляющая вычисляется отражением |
$y | float | Абсолютный y конца |
Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.
Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.
Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Эта страница содержит развёрнутое описание правила отражения. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.
Полный сохранённый контракт PHP Manual
Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.
{
"id": "imagickdraw.pathcurvetoquadraticbeziersmoothabsolute",
"name": "ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute",
"purpose_en": "Draws a quadratic Bezier curve",
"description_en": "Draws a quadratic Bezier curve (using absolute coordinates) from the current point to (x,y). The control point is assumed to be the reflection of the control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not a DrawPathCurveToQuadraticBezierAbsolute, DrawPathCurveToQuadraticBezierRelative, DrawPathCurveToQuadraticBezierSmoothAbsolut or DrawPathCurveToQuadraticBezierSmoothRelative, assume the control point is coincident with the current point.). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier. This function cannot be used to continue a cubic Bezier curve smoothly. It can only continue from a quadratic curve smoothly.",
"signature": "ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"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": [
{
"title": "ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute example",
"language": "php",
"code_sha256": "be358c65e33c861bf4ed630774eeda05d3a7fc7d805155402ac85e8f9c39023d"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothabsolute.php",
"official_page_sha256": "c53198b666dbb3538e24215e33fb9994b305f70f681fedbbd62286ad69ddedca",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoquadraticbeziersmoothabsolute.xml",
"xml_sha256": "c915d16796d0544cd04865e957f3b4a2c3d0d5d0272f88fcb37102a16216cbab",
"official_undocumented_marker": false,
"owner": "imagick_reference_draw_paths.py"
}
<?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, 100);
$draw->pathCurveToQuadraticBezierAbsolute(70, 20, 120, 100);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(220, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoquadraticbeziersmoothabsolute-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoquadraticbeziersmoothabsolute-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся pathcurvetoquadraticbeziersmoothabsolute-basic.png 240×180. Две квадратичные половины: первая вверх, вторая вниз через общий узел (120,100). Консоль — pathcurvetoquadraticbeziersmoothabsolute-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.
Практическая задача: Продолжение после линии: увидеть запасное правило
В соединителе перед кривой стоит прямой участок. Проверяем реальное поведение Smooth, чтобы не ожидать отражения несуществующей управляющей точки линии.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(30, 80);
$draw->pathLineToAbsolute(100, 80);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(200, 140);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(290, 80);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/line-then-quadratic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'line-then-quadratic.png', "\n";
$draw->clear();
$image->clear();
Результат: line-then-quadratic.png 320×220; консоль — line-then-quadratic.png. Отрезок до (100,80), затем квадратичный участок с управляющей в самой (100,80) до (200,140), затем участок с отражённой управляющей (300,200) к (290,80). Первый T не получил точку от линии; второй уже отражает управляющую предыдущего T.
Что проверить и чем заменить
Отражение используется только после quadratic Q/q/T/t. После Move, Line, cubic C/S или дуги подходящей предыдущей квадратичной точки нет — управляющая совпадёт с текущей. Эта команда не продолжает кубическую кривую по её последней управляющей точке.
Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.
Рядом: ImagickDraw::pathCurveToQuadraticBezierSmoothRelative, ImagickDraw::pathCurveToQuadraticBezierAbsolute, ImagickDraw::pathCurveToSmoothAbsolute. Устройство текущей точки: базовые пути.
ImagickDraw::pathCurveToQuadraticBezierSmoothRelativeДля повторяемого мягкого контура удобно задать первую кривую явно, а следующие концы — одинаковыми локальными шагами. После q(50,-80,100,0) текущая (120,100), предыдущая управляющая (70,20). t(100,0) получает конец (220,100), а отражённую управляющую (170,180) вычисляет автоматически. База смещения конца — текущая точка, не отражённая.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): boolДля повторяемого мягкого контура удобно задать первую кривую явно, а следующие концы — одинаковыми локальными шагами.
После q(50,-80,100,0) текущая (120,100), предыдущая управляющая (70,20). t(100,0) получает конец (220,100), а отражённую управляющую (170,180) вычисляет автоматически. База смещения конца — текущая точка, не отражённая.
Сигнатура: ImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): bool
| Параметр | Тип | Что передать |
|---|---|---|
$x | float | dx конца от текущей точки; управляющая вычисляется отдельно |
$y | float | dy конца от текущей точки |
Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.
Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.
Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.
Полный сохранённый контракт PHP Manual
Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.
{
"id": "imagickdraw.pathcurvetoquadraticbeziersmoothrelative",
"name": "ImagickDraw::pathCurveToQuadraticBezierSmoothRelative",
"purpose_en": "Draws a quadratic Bezier curve",
"description_en": "Draws a quadratic Bezier curve (using relative coordinates) from the current point to (x, y). The control point is assumed to be the reflection of the control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not a DrawPathCurveToQuadraticBezierAbsolute, DrawPathCurveToQuadraticBezierRelative, DrawPathCurveToQuadraticBezierSmoothAbsolut or DrawPathCurveToQuadraticBezierSmoothRelative, assume the control point is coincident with the current point). At the end of the command, the new current point becomes the final (x, y) coordinate pair used in the polybezier. This function cannot be used to continue a cubic Bezier curve smoothly. It can only continue from a quadratic curve smoothly.",
"signature": "ImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"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": [
{
"title": "ImagickDraw::pathCurveToQuadraticBezierSmoothRelative example",
"language": "php",
"code_sha256": "be358c65e33c861bf4ed630774eeda05d3a7fc7d805155402ac85e8f9c39023d"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothrelative.php",
"official_page_sha256": "871a3f73d6ddfff01d34aef3c0b52f3cab13bcd3bc531b37894818b23f036d79",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoquadraticbeziersmoothrelative.xml",
"xml_sha256": "56298a60928f9c9e64576b9adeed2762ca67d58355c11175511ccfb4b1d5049c",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_paths.py"
}
<?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, 100);
$draw->pathCurveToQuadraticBezierRelative(50, -80, 100, 0);
$draw->pathCurveToQuadraticBezierSmoothRelative(100, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoquadraticbeziersmoothrelative-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoquadraticbeziersmoothrelative-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся pathcurvetoquadraticbeziersmoothrelative-basic.png 240×180. Та же гладкая пара квадратичных участков, записанная относительными координатами. Консоль — pathcurvetoquadraticbeziersmoothrelative-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.
Практическая задача: Мягкая волнистая граница инструкции
Первый изгиб задан явно, затем три продолжения должны чередоваться без ручной записи каждой управляющей точки.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(380, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 80);
$draw->pathCurveToQuadraticBezierRelative(40, -50, 80, 0);
foreach ([1, 2, 3] as $section) {
$draw->pathCurveToQuadraticBezierSmoothRelative(80, 0);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/quadratic-border.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'quadratic-border.png', "\n";
$draw->clear();
$image->clear();
Результат: quadratic-border.png 380×160; консоль — quadratic-border.png. Четыре чередующихся верхних/нижних изгиба по 80 единиц: от (20,80) до (340,80). Вершины кривых находятся на y=55 и y=105. Каждое продолжение отражает управляющую предыдущего участка. Это декоративный контур, не сглаживание измеренного сигнала.
Что проверить и чем заменить
После каждого T/t отражается управляющая предыдущего участка, в том числе вычисленная неявно. Если вставить Move/Line или кубическую команду, цепочка квадратичной памяти прервётся и сработает запасное правило с управляющей в текущей точке.
Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.
Рядом: ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute, ImagickDraw::pathCurveToQuadraticBezierRelative. Устройство текущей точки: базовые пути.
ImagickDraw::pathCurveToSmoothAbsoluteНужен S-образный соединитель: первая половина задана двумя управляющими точками, следующую хочется продолжить с согласованным направлением. Предыдущая C закончилась в P=(120,100), её вторая управляющая C2=(90,20). Новая первая управляющая автоматически C1′=(150,180); передаём только вторую (190,180) и конец (220,100).
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pathCurveToSmoothAbsolute(float $x2, float $y2, float $x, float $y): boolНужен S-образный соединитель: первая половина задана двумя управляющими точками, следующую хочется продолжить с согласованным направлением.
Предыдущая C закончилась в P=(120,100), её вторая управляющая C2=(90,20). Новая первая управляющая автоматически C1′=(150,180); передаём только вторую (190,180) и конец (220,100).
Сигнатура: ImagickDraw::pathCurveToSmoothAbsolute(float $x2, float $y2, float $x, float $y): bool
| Параметр | Тип | Что передать |
|---|---|---|
$x2 | float | Абсолютный x второй управляющей новой кривой |
$y2 | float | Абсолютный y второй управляющей |
$x | float | Абсолютный x конца |
$y | float | Абсолютный y конца |
Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.
Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.
Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.
Полный сохранённый контракт PHP Manual
Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.
{
"id": "imagickdraw.pathcurvetosmoothabsolute",
"name": "ImagickDraw::pathCurveToSmoothAbsolute",
"purpose_en": "Draws a cubic Bezier curve",
"description_en": "Draws a cubic Bezier curve from the current point to (x,y) using absolute coordinates. The first control point is assumed to be the reflection of the second control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not an DrawPathCurveToAbsolute, DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute or DrawPathCurveToSmoothRelative, assume the first control point is coincident with the current point.) (x2,y2) is the second control point (i.e., the control point at the end of the curve). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.",
"signature": "ImagickDraw::pathCurveToSmoothAbsolute(float $x2, float $y2, float $x, float $y): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"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 second control point"
},
{
"name": "x",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x coordinate of the ending point"
},
{
"name": "y",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "y coordinate of the ending 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.pathcurvetosmoothabsolute.php",
"official_page_sha256": "756341dea9211309b65f36b812eb073d42424b778c34bf3bc4ba5bf43c0165d3",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetosmoothabsolute.xml",
"xml_sha256": "40e6d335c0cca9bd9309dda9d633b966e4a1f7387e8e98caab34833e5bf24f2f",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_paths.py"
}
<?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, 100);
$draw->pathCurveToAbsolute(50, 20, 90, 20, 120, 100);
$draw->pathCurveToSmoothAbsolute(190, 180, 220, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetosmoothabsolute-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetosmoothabsolute-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся pathcurvetosmoothabsolute-basic.png 240×180. Кубическая S-образная связь с верхней и нижней половинами. Консоль — pathcurvetosmoothabsolute-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.
Практическая задача: Исправить ожидание плавного выхода из прямого блока
Сравниваем соединение после Line: сверху Smooth с автоматической первой точкой, снизу явная кубическая CurveTo с нужной горизонтальной касательной.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(280, 260, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 50);
$draw->pathLineToAbsolute(70, 50);
$draw->pathCurveToSmoothAbsolute(150, 150, 250, 80);
$draw->pathFinish();
$draw->setStrokeColor('#c25732');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 150);
$draw->pathLineToAbsolute(70, 150);
$draw->pathCurveToAbsolute(120, 150, 150, 250, 250, 180);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/explicit-cubic-exit.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'explicit-cubic-exit.png', "\n";
$draw->clear();
$image->clear();
Результат: explicit-cubic-exit.png 280×260; консоль — explicit-cubic-exit.png. Сверху бирюзовый соединитель: S после линии берёт первую управляющую в (70,50), не отражает направление прямого участка. Снизу оранжевый: первая явная управляющая (120,150) задаёт горизонтальный выход. Если важна конкретная касательная, используйте явную C, а не название Smooth.
Что проверить и чем заменить
Подходящий предшественник — только cubic C/c/S/s. После quadratic или Line первая управляющая приравнивается текущей; название Smooth не обещает визуальную плавность с любой предыдущей фигурой. Для намеренного угла или особой касательной задайте обе точки явно в CurveTo.
Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.
Рядом: ImagickDraw::pathCurveToSmoothRelative, ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute. Устройство текущей точки: базовые пути.
ImagickDraw::pathCurveToSmoothRelativeУзор ленты или повторяющаяся плавная связь собирается из одинаковых модулей. Отражение экономит одну пару чисел, а Relative оставляет модуль локальным. Начало второго участка P=(120,100). (70,80) даёт вторую управляющую (190,180); (100,0) даёт конец (220,100). Первая управляющая отражается из прежней C2 в (150,180), независимо от переданной второй пары.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pathCurveToSmoothRelative(float $x2, float $y2, float $x, float $y): boolУзор ленты или повторяющаяся плавная связь собирается из одинаковых модулей. Отражение экономит одну пару чисел, а Relative оставляет модуль локальным.
Начало второго участка P=(120,100). (70,80) даёт вторую управляющую (190,180); (100,0) даёт конец (220,100). Первая управляющая отражается из прежней C2 в (150,180), независимо от переданной второй пары.
Сигнатура: ImagickDraw::pathCurveToSmoothRelative(float $x2, float $y2, float $x, float $y): bool
| Параметр | Тип | Что передать |
|---|---|---|
$x2 | float | dx второй управляющей от текущей точки до вызова |
$y2 | float | dy второй управляющей от той же базы |
$x | float | dx конца от той же базы |
$y | float | dy конца от той же базы |
Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.
Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.
Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.
Полный сохранённый контракт PHP Manual
Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.
{
"id": "imagickdraw.pathcurvetosmoothrelative",
"name": "ImagickDraw::pathCurveToSmoothRelative",
"purpose_en": "Draws a cubic Bezier curve",
"description_en": "Draws a cubic Bezier curve from the current point to (x,y) using relative coordinates. The first control point is assumed to be the reflection of the second control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not an DrawPathCurveToAbsolute, DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute or DrawPathCurveToSmoothRelative, assume the first control point is coincident with the current point.) (x2,y2) is the second control point (i.e., the control point at the end of the curve). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.",
"signature": "ImagickDraw::pathCurveToSmoothRelative(float $x2, float $y2, float $x, float $y): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"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 second control point"
},
{
"name": "x",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x coordinate of the ending point"
},
{
"name": "y",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "y coordinate of the ending 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.pathcurvetosmoothrelative.php",
"official_page_sha256": "3e5fa0f4a12b87bbcfae20e0621298d35ab468a870120c1f26825b7d4feec551",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetosmoothrelative.xml",
"xml_sha256": "ba6e1311d3600bcf82e0daf07e286da0be4202973588b8b1b92041b9203cce98",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_paths.py"
}
<?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, 100);
$draw->pathCurveToRelative(30, -80, 70, -80, 100, 0);
$draw->pathCurveToSmoothRelative(70, 80, 100, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetosmoothrelative-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetosmoothrelative-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся pathcurvetosmoothrelative-basic.png 240×180. Тот же кубический S-переход, заданный локальными смещениями. Консоль — pathcurvetosmoothrelative-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.
Практическая задача: Полоса повторяемого кубического узора
Для маркировки отчёта нужна последовательность крупных плавных изгибов. Задаём начальную кривую и поочерёдно вторые управляющие вверх/вниз; первая отражается из предыдущего участка.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(460, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathCurveToRelative(30, -80, 70, -80, 100, 0);
foreach ([80, -80, 80] as $controlY) {
$draw->pathCurveToSmoothRelative(70, $controlY, 100, 0);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/cubic-ribbon.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'cubic-ribbon.png', "\n";
$draw->clear();
$image->clear();
Результат: cubic-ribbon.png 460×200; консоль — cubic-ribbon.png. Четыре кубических полуволны от (20,100) до (420,100), чередующиеся вверх и вниз. После каждого S текущая точка сдвигается на 100 вправо; отражение берёт новую предыдущую вторую управляющую, не одну исходную точку для всего цикла.
Что проверить и чем заменить
Обе явные пары считаются от P до команды. Нельзя конец прибавлять к новой второй управляющей точке. После каждого S/s текущий конец и вторая управляющая запоминаются для следующего отражения; после команды другого семейства отражение сбрасывается.
Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.
Рядом: ImagickDraw::pathCurveToSmoothAbsolute, ImagickDraw::pathCurveToQuadraticBezierSmoothRelative. Устройство текущей точки: базовые пути.
ImagickDraw::pathEllipticArcAbsoluteНужно соединить две позиции участком настоящего эллипса: например, ручка значка пакета или овальный вырез, а не произвольная кривая Безье. Начало (80,110) уже задано Move. Радиусы 70 и 50 определяют форму эллипса, rotation=0 — его поворот; false выбирает малую дугу, true — положительное направление. Конец задан абсолютной точкой (160,70). Центр движок вычисляет сам.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pathEllipticArcAbsolute(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): boolНужно соединить две позиции участком настоящего эллипса: например, ручка значка пакета или овальный вырез, а не произвольная кривая Безье.
Начало (80,110) уже задано Move. Радиусы 70 и 50 определяют форму эллипса, rotation=0 — его поворот; false выбирает малую дугу, true — положительное направление. Конец задан абсолютной точкой (160,70). Центр движок вычисляет сам.
Сигнатура: ImagickDraw::pathEllipticArcAbsolute(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool
| Параметр | Тип | Что передать |
|---|---|---|
$rx | float | Горизонтальный радиус эллипса в его локальных осях |
$ry | float | Вертикальный радиус эллипса в его локальных осях |
$x_axis_rotation | float | Поворот осей эллипса в градусах, не радианах |
$large_arc | bool | false: малая дуга, true: большая; при 180° выбор не различает длину |
$sweep | bool | Направление обхода; true — положительное угловое направление |
$x | float | Абсолютный x конца дуги |
$y | float | Абсолютный y конца дуги |
Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.
Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.
Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.
Полный сохранённый контракт PHP Manual
Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.
{
"id": "imagickdraw.pathellipticarcabsolute",
"name": "ImagickDraw::pathEllipticArcAbsolute",
"purpose_en": "Draws an elliptical arc",
"description_en": "Draws an elliptical arc from the current point to (x, y) using absolute coordinates. The size and orientation of the ellipse are defined by two radii (rx, ry) and an xAxisRotation, which indicates how the ellipse as a whole is rotated relative to the current coordinate system. The center (cx, cy) of the ellipse is calculated automatically to satisfy the constraints imposed by the other parameters. largeArcFlag and sweepFlag contribute to the automatic calculations and help determine how the arc is drawn. If large_arc is true then draw the larger of the available arcs. If sweep is true, then draw the arc matching a clock-wise rotation.",
"signature": "ImagickDraw::pathEllipticArcAbsolute(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "rx",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x radius"
},
{
"name": "ry",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "y radius"
},
{
"name": "x_axis_rotation",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x axis rotation"
},
{
"name": "large_arc",
"type": "bool",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "large arc flag"
},
{
"name": "sweep",
"type": "bool",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "sweep flag"
},
{
"name": "x",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x coordinate"
},
{
"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.pathellipticarcabsolute.php",
"official_page_sha256": "c98e5e110b6e463b3550800ceccfe0b00193d5d7df1f7ea431a7fe5b9eeed4b3",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathellipticarcabsolute.xml",
"xml_sha256": "b9a52a71f11512e78da3aa390e632ea5bad6e623842c7b7a58b4fd93a58f4136",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_paths.py"
}
<?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(80, 110);
$draw->pathEllipticArcAbsolute(70, 50, 0, false, true, 160, 70);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathellipticarcabsolute-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathellipticarcabsolute-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся pathellipticarcabsolute-basic.png 240×180. Малая эллиптическая дуга между (80,110) и (160,70). Консоль — pathellipticarcabsolute-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.
Практическая задача: Четыре варианта дуги по двум независимым флагам
Прежде чем делать овальную выемку, сравним все допустимые пути между одинаковыми относительными позициями. Меняется только large/sweep, а геометрия концов и радиусы одинаковы.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(480, 360, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$variants = [
['large' => false, 'sweep' => false, 'x' => 0, 'y' => 0],
['large' => false, 'sweep' => true, 'x' => 240, 'y' => 0],
['large' => true, 'sweep' => false, 'x' => 0, 'y' => 180],
['large' => true, 'sweep' => true, 'x' => 240, 'y' => 180],
];
foreach ($variants as $variant) {
$ox = $variant['x']; $oy = $variant['y'];
$draw->pathStart();
$draw->pathMoveToAbsolute(80 + $ox, 110 + $oy);
$draw->pathEllipticArcAbsolute(
70, 50, 0, $variant['large'], $variant['sweep'], 160 + $ox, 70 + $oy
);
$draw->pathFinish();
}
$image->drawImage($draw);
$path = __DIR__ . '/arc-flags.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'arc-flags.png', "\n";
$draw->clear();
$image->clear();
Результат: arc-flags.png 480×360; консоль — arc-flags.png. Сетка 2×2 без заливки: слева сверху false/false, справа сверху false/true, слева снизу true/false, справа снизу true/true. Верхний ряд — малые дуги, нижний — большие. Смена sweep выбирает другую сторону обхода. Начало каждой ячейки локально (80,110), конец (160,70).
Что проверить и чем заменить
rx/ry — радиусы эллипса, не координаты конца и не размеры рамки. Флаги large_arc и sweep независимы. При обычных осях x вправо/y вниз sweep=true соответствует ходу по часовой стрелке; отражение или иная трансформация системы меняет экранное восприятие направления.
Нулевые/отрицательные/слишком маленькие радиусы и совпадающие концы подробно разобраны в таблице пограничных случаев. Если нужен полный овал без смешанного контура, ellipse проще двух дуг.
Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.
Рядом: ImagickDraw::pathEllipticArcRelative, ImagickDraw::pathCurveToQuadraticBezierAbsolute. Устройство текущей точки: базовые пути.
ImagickDraw::pathEllipticArcRelativeОвальный значок нужно собрать как локальный замкнутый контур из двух дуг. Радиусы и поворот остаются свойствами эллипса, а конец каждой дуги задаётся сдвигом. Из (80,110) последняя пара (80,-40) приводит в (160,70). Первые rx=70, ry=50 и rotation=0 не прибавляются к текущей точке: относительными являются только конечные x/y.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pathEllipticArcRelative(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): boolОвальный значок нужно собрать как локальный замкнутый контур из двух дуг. Радиусы и поворот остаются свойствами эллипса, а конец каждой дуги задаётся сдвигом.
Из (80,110) последняя пара (80,-40) приводит в (160,70). Первые rx=70, ry=50 и rotation=0 не прибавляются к текущей точке: относительными являются только конечные x/y.
Сигнатура: ImagickDraw::pathEllipticArcRelative(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool
| Параметр | Тип | Что передать |
|---|---|---|
$rx | float | Радиус rx; это размер, не dx |
$ry | float | Радиус ry; это размер, не dy |
$x_axis_rotation | float | Поворот осей эллипса в градусах; это не начальный угол |
$large_arc | bool | Выбор малой/большой дуги |
$sweep | bool | Выбор направления обхода |
$x | float | dx конца от текущего начала |
$y | float | dy конца от текущего начала |
Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.
Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.
Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.
Полный сохранённый контракт PHP Manual
Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.
{
"id": "imagickdraw.pathellipticarcrelative",
"name": "ImagickDraw::pathEllipticArcRelative",
"purpose_en": "Draws an elliptical arc",
"description_en": "Draws an elliptical arc from the current point to (x, y) using relative coordinates. The size and orientation of the ellipse are defined by two radii (rx, ry) and an xAxisRotation, which indicates how the ellipse as a whole is rotated relative to the current coordinate system. The center (cx, cy) of the ellipse is calculated automatically to satisfy the constraints imposed by the other parameters. largeArcFlag and sweepFlag contribute to the automatic calculations and help determine how the arc is drawn. If large_arc is true then draw the larger of the available arcs. If sweep is true, then draw the arc matching a clock-wise rotation.",
"signature": "ImagickDraw::pathEllipticArcRelative(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "rx",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x radius"
},
{
"name": "ry",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "y radius"
},
{
"name": "x_axis_rotation",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x axis rotation"
},
{
"name": "large_arc",
"type": "bool",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "large arc flag"
},
{
"name": "sweep",
"type": "bool",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "sweep flag"
},
{
"name": "x",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x coordinate"
},
{
"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.pathellipticarcrelative.php",
"official_page_sha256": "3fb40c7dd675ca11a5bf6fc455d063327ec8b8ef0c0ea3efedce642d195875ec",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathellipticarcrelative.xml",
"xml_sha256": "c516eaa388057ce038889c74e07d9dfbf6d7f548d4dfdb8e891c03665ff6c3f4",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_paths.py"
}
<?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(80, 110);
$draw->pathEllipticArcRelative(70, 50, 0, false, true, 80, -40);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathellipticarcrelative-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathellipticarcrelative-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся pathellipticarcrelative-basic.png 240×180. Та же малая дуга с относительным концом (80,-40). Консоль — pathellipticarcrelative-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.
Практическая задача: Замкнутый наклонный овальный стикер из двух дуг
Одной дугой с одинаковыми началом и концом овал не получится. Используем промежуточную противоположную точку, вторую дугу обратно и общий поворот 30°.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(280, 240, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
$rotation = 30;
$angle = deg2rad($rotation);
$dx = 2 * 70 * cos($angle);
$dy = 2 * 70 * sin($angle);
$draw->pathMoveToAbsolute(140 - $dx / 2, 120 - $dy / 2);
$draw->pathEllipticArcRelative(70, 35, $rotation, false, true, $dx, $dy);
$draw->pathEllipticArcRelative(70, 35, $rotation, false, true, -$dx, -$dy);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/tilted-sticker.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'tilted-sticker.png', "\n";
$draw->clear();
$image->clear();
Результат: tilted-sticker.png 280×240; консоль — tilted-sticker.png. Мятный полный эллипс радиусами 70/35 с центром (140,120), наклонённый на 30°. Концы диаметра примерно (79.378,85) и (200.622,155), вторая дуга идёт обратно. deg2rad переводит градусы в радианы для cos/sin; эти функции дают горизонтальную/вертикальную составляющую повёрнутого диаметра. Сам Arc по-прежнему получает поворот в градусах. Такая конструкция согласует концы с общим эллипсом, а не рисует линзу из двух произвольных коротких дуг.
Что проверить и чем заменить
При совпадении начала и конца одна A/a-команда не задаёт полный эллипс. Разделите его на две дуги с разными промежуточными концами или используйте готовую ellipse. При нулевом радиусе по SVG-модели получится прямой участок, а не аварийное обещание рисовать окружность.
Нулевые/отрицательные/слишком маленькие радиусы и совпадающие концы подробно разобраны в таблице пограничных случаев. Если нужен полный овал без смешанного контура, ellipse проще двух дуг.
Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.
Рядом: ImagickDraw::pathEllipticArcAbsolute, ImagickDraw::pathCurveToQuadraticBezierRelative. Устройство текущей точки: базовые пути.
Источники и обсуждения
- ImagickDraw::pathCurveToQuadraticBezierAbsolute
- ImagickDraw::pathCurveToQuadraticBezierRelative
- ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute
- ImagickDraw::pathCurveToQuadraticBezierSmoothRelative
- ImagickDraw::pathCurveToSmoothAbsolute
- ImagickDraw::pathCurveToSmoothRelative
- ImagickDraw::pathEllipticArcAbsolute
- ImagickDraw::pathEllipticArcRelative
- W3C SVG paths: quadratic/cubic reflection and elliptical arcs
- W3C SVG implementation notes: arc correction
- ImageMagick MVG paths
- Imagick current binding implementation
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


