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

Дерево руководства
Глава 328 · После рисования линий и путей
ImagickDraw: окончания, стыки и пунктир — десять get/set методов
Cap и Join, предел острых углов, pattern штрихов и его фаза; чтение и восстановление настроек, сравнения PNG и понятная схема маршрутов.
Сделать путь читаемым: конец, угол, пунктир и его фаза
В PNG-схеме основной маршрут должен быть сплошным с мягкими окончаниями, запасной — пунктирным; острый поворот не должен превращаться в огромный шип. Координаты могут быть верными, а картинка всё равно выглядит плохо из-за оформления stroke. Разберём пять независимых настроек и чтение их состояния: Cap, Join, MiterLimit, DashArray, DashOffset.

Если вы ещё не рисовали PNG, начните с первой линии; текущая точка и path объясняются в базовых путях. Кратко: Draw записывает настройку, следующая геометрическая команда использует её; drawImage применяет список к пикселям, writeImage создаёт файл. Здесь stroke — обводка, fill — внутренняя заливка, которую для открытой линии отключаем.
Первое изменение: тот же отрезок с круглыми концами
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(20);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_ROUND);
$draw->line(40, 90, 200, 90);
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/first-rounded-line.png');
echo "first-rounded-line.png\n";
Сохраните как first.php, выполните php first.php. При успешной записи появится first-rounded-line.png 240×180, консоль — first-rounded-line.png. Линия проходит от (40,90) до (200,90), толщина 20, видимые круглые окончания выступают примерно на 10 с каждой стороны. В кратком введении запись ещё не проверяется; ниже отказ обрабатывается.
| Часть записи | Зачем она здесь |
|---|---|
| setStrokeWidth(20) | Толщина обводки, отдельная от Cap |
| Imagick::LINECAP_ROUND | Именованная int-константа режима; :: обращается к константе класса |
| setStrokeLineCap(...) | Оформление следующих открытых концов |
| line(40,90,200,90) | Прежние координаты отрезка |
| setFillColor('none') | Заливка отключена, не мешает пунктиру |
| drawImage / writeImage | Применить к пикселям / сохранить PNG |
$draw — переменная с объектом, -> вызывает его метод, скобки содержат аргументы, ; заканчивает инструкцию. Имя режима не нужно запоминать как число: константа ясно выражает назначение. Подробнее про объект и метод.
Setter меняет настройку, getter возвращает данные
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(20);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_ROUND);
$cap = $draw->getStrokeLineCap();
$label = $cap === Imagick::LINECAP_ROUND ? 'round' : 'other';
echo 'cap=', $label, '; type=', get_debug_type($cap), "\n";
$draw->line(40, 90, 200, 90);
$image->drawImage($draw);
$path = __DIR__ . '/read-cap.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'read-cap.png', "\n";
$draw->clear();
$image->clear();
При успехе создаётся read-cap.png с такой же круглой линией. Перед именем файла консоль: cap=round; type=int. === сравнивает значение и тип, выражение условие ? A : B выбирает подпись. get_debug_type показывает PHP-тип; getter хранит int-режим, не слово round и не изображение.
- В Draw уже есть стиль, заданный шаблоном/другой функцией
- Getter возвращает int, float или array в переменную
- Код принимает решение: отступить, скопировать pattern, нормализовать фазу
- Если стиль временно изменён, сохранённое значение помогает восстановить его
Дальше if проверяет условие, throw сообщает об отказе записи; см. исключения. foreach перебирает массив: номер $index начинается с нуля. Нужный синтаксис разобран в условиях и циклах.
Окончания линии
Cap оформляет конец открытого подконтура и конец каждого штриха. BUTT обрезает на конечной точке; ROUND добавляет полукруг, SQUARE — прямоугольное продолжение. ROUND/SQUARE выступают вдоль касательной на половину толщины. На замкнутом непрерывном контуре внешних концов нет.

У линии длиной 160 и толщиной 20 круглые окончания дают видимую длину около 180. Не используйте такую обводку как точное измерение без поправки. Сглаживание добавляет пограничные пиксели; речь о геометрической оценке, не обещании точного числа непрозрачных пикселей.
Стыки связанных отрезков
Join оформляет общий узел соседних сегментов одного связного пути. MITER продолжает края до острия, ROUND закругляет, BEVEL срезает выступ. Это не соединитель двух отдельных вызовов line: у них собственные окончания, даже если координаты совпадают.

Если код состоит из двух самостоятельных line, смена Join не превращает их в один контур. Соберите polyline или один path с последовательными LineTo. Cap меняет внешние окончания, Join — внутренний стык; проверяйте их независимо.
Предел острого выступа
MiterLimit — безразмерный предел отношения полной длины miter (между наружным остриём и внутренним углом) к толщине stroke. Для угла θ отношение равно 1/sin(θ/2). При превышении предела Miter превращается в Bevel; для Round/Bevel это ограничение не создаёт такой переход.

Для наших сторон к вершине идут сдвиги (30,-100) и (30,100); внутренний угол около 33.4°, отношение около 3.48. Limit=2 даёт Bevel, limit=10 оставляет остриё. При этом обрезка холстом — отдельная причина плоской вершины: даже разрешённому острию нужен запас места.
Штрих и промежуток
Список чередует длины штриха и пробела в единицах холста; на обычном изображении без преобразований это пиксели. Нечётный список повторяется целиком: [18,6,3] эквивалентен [18,6,3,18,6,3], а не дописанному одному пробелу. По SVG отрицательные длины невалидны; нули имеют специальные эффекты, для практических паттернов здесь все элементы положительные.
![Сверху [18,10], затем [18,6,3], снизу сплошная после сброса; нечётный pattern повторяется до чётного](/wp-content/plugins/aen-php-manual/assets/imagick-draw-stroke-outline/dash-comparison.png)
Сброс в текущем binding выполняется setStrokeDashArray(null), а не []. Пустой массив проходит в helper, который возвращает NULL и вызывает ImagickDrawException 'Cannot read stroke dash array parameter'; null имеет отдельную ветку сброса. При восстановлении getter [] переводите в null. Для старой версии расширения сверяйте поддержку nullable-сигнатуры.
Фаза пунктира вдоль того же пути
DashOffset указывает, с какого места циклического pattern начинается путь. Это расстояние по последовательности штрих/пробел, не перенос геометрии и не новый зазор в DashArray. Для [18,10] полный период 28; математический период равен 28. Не выдавайте это за проверенное равенство произвольных больших native offset: в использованной CLI-сборке offset28 не совпал с0. Основное сравнение поэтому использует только фазы0,9,18; обнаруженная граница отдельно зафиксирована в визуальном manifest.
![Одинаковый pattern [18,10], сверху offset0, затем9, снизу18: координаты отрезков прежние, изменяется положение штрихов](/wp-content/plugins/aen-php-manual/assets/imagick-draw-stroke-outline/offset-comparison.png)
Отрицательная фаза не равна отрицательной длине штриха: это разные параметры. SVG/MVG предусматривает циклическую интерпретацию offset, но разные рендереры/версии имели расхождения, особенно с нечётным списком. Для выбранной политики приложения используйте явный чётный pattern и неотрицательную фазу в одном периоде, затем проверьте нужную сборку. Нормализация конфигурационного значения не служит доказательством, что исходный большой offset отрисовался бы побитно так же. Изменение offset не исправляет неверный порядок вершин.
Безопасный сброс и допустимые входные данные
У Getter отсутствие пунктира — массив []. У Setter в текущем PHP binding сброс — null. Это не симметричные записи: helper конвертации пустого массива возвращает NULL, setter трактует его как отказ чтения; для null есть отдельная успешная ветка. Поэтому при восстановлении используется $pattern === [] ? null : $pattern. Упоминание Manual про number_elements и dash_array относится к C, а не к PHP-параметрам.
| Вход | Как трактовать |
|---|---|
| [18,10] | 18 штрих + 10 пробел, период28 |
| [18,6,3] | Повтор [18,6,3,18,6,3], период54 |
| null в Setter | Сбросить pattern; Getter вернёт [] |
| [] в Setter | В текущем helper вызывает исключение; не предлагать для сброса |
| Отрицательная длина pattern | Невалидна по SVG; отклоните во входных данных |
| Сумма длин равна нулю | По SVG соответствует none; не используйте как переносимый PHP-рецепт, явно сбрасывайте null |
| Дробные длины / offset | Сохраняйте float; не делайте целочисленное округление без причины |
| Отрицательный offset | Фаза, не отрицательная длина; нормализуйте относительно положительного периода и проверьте вашу версию рендерера |
PHP API принимает числовой массив, а не CSS-строку с px/%; в обычном холсте эти длины выражены в пикселях. При масштабировании координат проверьте единицы всей схемы. Нечётный массив удобен, но для фазовых расчётов сначала учитывайте удвоение полного периода.
Основной и запасной маршрут: различие видно без цвета
Соберём читаемую схему: сверху сплошной основной путь с круглыми концами и стыками; ниже оранжевый запасной путь с пунктиром. Различие передано не только цветом, но и рисунком линии. После вспомогательного стиля вернём исходные пять настроек; короткая сплошная линия внизу покажет восстановление. Это условная схема, не вычисление маршрута по географическим данным.

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(600, 320, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(14);
$draw->setStrokeLineCap(Imagick::LINECAP_ROUND);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_ROUND);
$draw->setStrokeMiterLimit(2);
$draw->setStrokeDashArray(null);
$draw->setStrokeDashOffset(0);
$saved = [
'cap' => $draw->getStrokeLineCap(), 'join' => $draw->getStrokeLineJoin(),
'miter' => $draw->getStrokeMiterLimit(), 'dash' => $draw->getStrokeDashArray(),
'offset' => $draw->getStrokeDashOffset(),
];
$draw->polyline([
['x' => 40, 'y' => 50], ['x' => 180, 'y' => 100], ['x' => 300, 'y' => 40],
['x' => 420, 'y' => 140], ['x' => 560, 'y' => 100],
]);
$draw->setStrokeColor('#c25732');
$draw->setStrokeWidth(6);
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeDashArray([18, 10]);
$draw->setStrokeDashOffset(9);
$draw->polyline([
['x' => 40, 'y' => 230], ['x' => 180, 'y' => 190], ['x' => 300, 'y' => 260],
['x' => 420, 'y' => 210], ['x' => 560, 'y' => 250],
]);
$draw->setStrokeLineCap($saved['cap']);
$draw->setStrokeLineJoin($saved['join']);
$draw->setStrokeMiterLimit($saved['miter']);
$draw->setStrokeDashArray($saved['dash'] === [] ? null : $saved['dash']);
$draw->setStrokeDashOffset($saved['offset']);
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(14);
$draw->line(40, 295, 160, 295);
$image->drawImage($draw);
$path = __DIR__ . '/route-legend.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'route-legend.png', "\n";
$draw->clear();
$image->clear();
При успехе создаётся route-legend.png 600×320, консоль — route-legend.png. Основная линия: #146c74, ширина14, Round Cap/Join. Запасная: #c25732, ширина6, Butt Cap, Round Join, pattern[18,10], offset9. Перед нижней легендой восстановлены значения getter; пустой pattern переведён в null, цвет/толщина явно возвращены к14 и #146c74. Названия маршрутов здесь в HTML, в PHP-PNG текст не наносится.
Упражнение: замените Round Join основного пути на Bevel. Решение: измените начальную setStrokeLineJoin на LINEJOIN_BEVEL — сохранённый getter тоже изменится, а легенда получит исходный режим после временного оформления. Затем сделайте запасной маршрут с offset0 вместо9: координаты останутся прежними, изменятся только места штрихов.
Применить оформление в своём сервисе
- Сначала определите семантику линии: факт/план, граница/путь, открытый/замкнутый контур. Затем выберите Cap/Join и только потом pattern/фазу.
- Неправильный Join и обрезка холстом дают похожие дефекты. Смотрите на режим, лимит и доступное пространство отдельно.
- Входные числа проверяйте до Draw: допустимые enum, конечные длины, неотрицательные dash-элементы, положительный период, лимит>=1. Не отправляйте произвольные размеры/число узлов из запроса без верхней границы.
- Сохраняйте в заранее выбранный каталог, обрабатывайте отказ записи и исключение задания. При HTTP-выдаче не печатайте диагностические строки перед байтами PNG.
- В этой поставке PHP Imagick нативно не исполнен; CLI-картинки и syntax lint имеют разные границы доказательства.
Дальше: готовые фигуры, базовые пути, кривые и дуги, исключения. Это десять настроечных API из большого ImagickDraw; остальные свойства остаются отдельным продолжением.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
ImagickDraw::getStrokeLineCapНужно узнать, почему линия визуально длиннее расчётного диапазона, и учесть окончания при размещении в ограниченной области.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getStrokeLineCap(): intНужно узнать, почему линия визуально длиннее расчётного диапазона, и учесть окончания при размещении в ограниченной области.
Cap оформляет конец открытого подконтура и конец каждого штриха. BUTT обрезает на конечной точке; ROUND добавляет полукруг, SQUARE — прямоугольное продолжение. ROUND/SQUARE выступают вдоль касательной на половину толщины. На замкнутом непрерывном контуре внешних концов нет.
Сигнатура: ImagickDraw::getStrokeLineCap(): int
Параметров нет: читается текущее состояние данного объекта Draw. Пустые скобки вызывают метод, знак = сохраняет его результат в переменную. Getter не изменяет уже нарисованные пиксели и не извлекает стиль из готового PNG.
Возврат: Getter возвращает int-константу LINECAP_*; Manual допускает 0 для неопределённой настройки. Не привязывайтесь к произвольным числовым кодам и не считайте 0 доказательством ошибки вызова.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.getstrokelinecap",
"name": "ImagickDraw::getStrokeLineCap",
"purpose_en": "Returns the shape to be used at the end of open subpaths when they are stroked",
"description_en": "Returns the shape to be used at the end of open subpaths when they are stroked.",
"signature": "ImagickDraw::getStrokeLineCap(): int",
"modifiers": [
"public"
],
"return_type": "int",
"parameters": [],
"return_en": "Returns a LINECAP constant ( imagick::LINECAP_* ), or 0 if stroke linecap is not set.",
"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.getstrokelinecap.php",
"official_page_sha256": "8a5af9c29c2fcb83837ea8c4691aa8acc6a876066a4c3d76d1fda58cc0077cf9",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getstrokelinecap.xml",
"xml_sha256": "ab3f5afb7e4591bf763d5a683113c72690660b0760d1030c01c4f913623eea43",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.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(20);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_ROUND);
$value = $draw->getStrokeLineCap();
echo 'cap=', $value === Imagick::LINECAP_ROUND ? 'round' : 'other', '; type=', get_debug_type($value), "\n";
$draw->line(40, 90, 200, 90);
$image->drawImage($draw);
$path = __DIR__ . '/getstrokelinecap-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'getstrokelinecap-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся getstrokelinecap-basic.png 240×180. Горизонтальная бирюзовая линия толщиной 20 с круглыми концами; её геометрические концы x=40 и x=200, а окрашенная область простирается примерно от x=30 до x=210. Перед именем файла консоль: cap=round; type=int. Последняя строка консоли — getstrokelinecap-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Уложить видимые концы в заданную рамку
Шаблон задан другим компонентом; читаем Cap и добавляем отступ на его выступ, чтобы линия целиком попала в диапазон x=20..300.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$width = 20;
$draw->setStrokeWidth($width);
$draw->setStrokeLineCap(Imagick::LINECAP_ROUND);
$cap = $draw->getStrokeLineCap();
$extends = in_array($cap, [Imagick::LINECAP_ROUND, Imagick::LINECAP_SQUARE], true);
$padding = $extends ? $width / 2 : 0;
$draw->line(20 + $padding, 80, 300 - $padding, 80);
echo 'padding=', $padding, "\n";
$image->drawImage($draw);
$path = __DIR__ . '/safe-ended-line.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'safe-ended-line.png', "\n";
$draw->clear();
$image->clear();
Результат: safe-ended-line.png 320×160. Путь идёт от (30,80) до (290,80); круглые окончания дают видимую область примерно x=20..300. Getter участвует в расчёте, а не просто повторяет имя setter. Это геометрическая оценка без гарантии по альфа-пикселям сглаживания. Перед именем файла консоль: padding=10. Последняя строка консоли — safe-ended-line.png.
Ограничения, альтернативы и стоимость
У линии длиной 160 и толщиной 20 круглые окончания дают видимую длину около 180. Не используйте такую обводку как точное измерение без поправки. Сглаживание добавляет пограничные пиксели; речь о геометрической оценке, не обещании точного числа непрозрачных пикселей.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::setStrokeLineCap. Разбор параметра: Окончания линии. Геометрия: связный путь.
ImagickDraw::setStrokeLineCapНа маршруте нужны мягкие окончания вместо прямого среза; геометрию пути менять не требуется.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setStrokeLineCap(int $linecap): boolНа маршруте нужны мягкие окончания вместо прямого среза; геометрию пути менять не требуется.
Cap оформляет конец открытого подконтура и конец каждого штриха. BUTT обрезает на конечной точке; ROUND добавляет полукруг, SQUARE — прямоугольное продолжение. ROUND/SQUARE выступают вдоль касательной на половину толщины. На замкнутом непрерывном контуре внешних концов нет.
Сигнатура: ImagickDraw::setStrokeLineCap(int $linecap): bool
| Параметр | Тип | Смысл |
|---|---|---|
$linecap | int | Imagick::LINECAP_BUTT, Imagick::LINECAP_ROUND, Imagick::LINECAP_SQUARE; это int-константы, не строки 'round'. |
Параметр обязательный, передаётся по значению. Setter изменяет оформление следующих команд данного объекта, а не перемещает точки пути. Сигнатура возвращает bool; в текущем binding успешная запись настройки возвращает true. У части страниц Manual return ошибочно описан как отсутствие значения; полный снимок ниже сохраняет это противоречие. true не является PNG, а вызовы не следует объединять цепочкой через возвращаемое значение.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.setstrokelinecap",
"name": "ImagickDraw::setStrokeLineCap",
"purpose_en": "Specifies the shape to be used at the end of open subpaths when they are stroked",
"description_en": "Specifies the shape to be used at the end of open subpaths when they are stroked.",
"signature": "ImagickDraw::setStrokeLineCap(int $linecap): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "linecap",
"type": "int",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "One of the LINECAP constant ( imagick::LINECAP_* )."
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setStrokeLineCap example",
"language": "php",
"code_sha256": "bda0e932e6b7a4ca2932a81891f567e107d817a08432d1f49e1b7510a2347c65"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setstrokelinecap.php",
"official_page_sha256": "9ba8b44e3a0205af05f43cc34308505d9e1a099aea6758daeadb2034a7340f6c",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setstrokelinecap.xml",
"xml_sha256": "c45476673be9ad6d30c162ff445e4c448079565172cb2d015aad6c02804125f4",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.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(20);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_ROUND);
$draw->line(40, 90, 200, 90);
$image->drawImage($draw);
$path = __DIR__ . '/setstrokelinecap-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'setstrokelinecap-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся setstrokelinecap-basic.png 240×180. Горизонтальная бирюзовая линия толщиной 20 с круглыми концами; её геометрические концы x=40 и x=200, а окрашенная область простирается примерно от x=30 до x=210. Последняя строка консоли — setstrokelinecap-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Сравнить одинаковую геометрию с тремя Cap
В интерфейсе конструктора отчёта нужно объяснить выбор окончания, сохранив одни и те же концы и толщину.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(480, 240, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$caps = [Imagick::LINECAP_BUTT, Imagick::LINECAP_ROUND, Imagick::LINECAP_SQUARE];
$draw->setStrokeWidth(24);
foreach ($caps as $index => $cap) {
$draw->setStrokeLineCap($cap);
$draw->line(100, 50 + $index * 70, 380, 50 + $index * 70);
}
$image->drawImage($draw);
$path = __DIR__ . '/cap-options.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'cap-options.png', "\n";
$draw->clear();
$image->clear();
Результат: cap-options.png 480×240. Три горизонтали сверху вниз Butt, Round, Square. Геометрические концы x=100/380; последние два стиля выступают примерно до x=88/392, но формы окончаний различаются. Тонкие направляющие на поясняющей модели выше в этот PHP-рисунок не входят. Последняя строка консоли — cap-options.png.
Ограничения, альтернативы и стоимость
У линии длиной 160 и толщиной 20 круглые окончания дают видимую длину около 180. Не используйте такую обводку как точное измерение без поправки. Сглаживание добавляет пограничные пиксели; речь о геометрической оценке, не обещании точного числа непрозрачных пикселей.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::getStrokeLineCap. Разбор параметра: Окончания линии. Геометрия: связный путь.
ImagickDraw::getStrokeLineJoinВспомогательная отрисовка временно меняет оформление угла; нужно прочитать прежнее и восстановить его перед следующим объектом.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getStrokeLineJoin(): intВспомогательная отрисовка временно меняет оформление угла; нужно прочитать прежнее и восстановить его перед следующим объектом.
Join оформляет общий узел соседних сегментов одного связного пути. MITER продолжает края до острия, ROUND закругляет, BEVEL срезает выступ. Это не соединитель двух отдельных вызовов line: у них собственные окончания, даже если координаты совпадают.
Сигнатура: ImagickDraw::getStrokeLineJoin(): int
Параметров нет: читается текущее состояние данного объекта Draw. Пустые скобки вызывают метод, знак = сохраняет его результат в переменную. Getter не изменяет уже нарисованные пиксели и не извлекает стиль из готового PNG.
Возврат: Getter возвращает int-константу LINEJOIN_*; в Manual указано 0 для неопределённого значения. В примерах настройка задаётся явно перед чтением; значение по умолчанию не угадывается.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.getstrokelinejoin",
"name": "ImagickDraw::getStrokeLineJoin",
"purpose_en": "Returns the shape to be used at the corners of paths when they are stroked",
"description_en": "Returns the shape to be used at the corners of paths (or other vector shapes) when they are stroked.",
"signature": "ImagickDraw::getStrokeLineJoin(): int",
"modifiers": [
"public"
],
"return_type": "int",
"parameters": [],
"return_en": "Returns a LINEJOIN constant ( imagick::LINEJOIN_* ), or 0 if stroke line join is not set.",
"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.getstrokelinejoin.php",
"official_page_sha256": "5c2103c32cb11c6638a31164b0eb85459140b1d6977ab85b24fa71a3c70bf106",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getstrokelinejoin.xml",
"xml_sha256": "87e0ec7c4a9c0b5ecbc48fee7201b6bebcc734ec46584d67920d4a45be143b22",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.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(18);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_ROUND);
$value = $draw->getStrokeLineJoin();
echo 'join=', $value === Imagick::LINEJOIN_ROUND ? 'round' : 'other', '; type=', get_debug_type($value), "\n";
$draw->polyline([['x' => 30, 'y' => 140], ['x' => 120, 'y' => 50], ['x' => 210, 'y' => 140]]);
$image->drawImage($draw);
$path = __DIR__ . '/getstrokelinejoin-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'getstrokelinejoin-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся getstrokelinejoin-basic.png 240×180. Открытая V-образная ломаная толщиной 18 через (30,140), (120,50), (210,140); вершина скруглена. Сравнение здесь посвящено стыку; форму концов отдельно смотрите на line в разделе Cap. Перед именем файла консоль: join=round; type=int. Последняя строка консоли — getstrokelinejoin-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Не испортить стиль после вспомогательного угла
Основная схема использует Round. Малый технический фрагмент требует Bevel; сохраним исходное значение, изменим его временно, затем вернём.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(340, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(18);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_ROUND);
$saved = $draw->getStrokeLineJoin();
$draw->setStrokeLineJoin(Imagick::LINEJOIN_BEVEL);
$draw->polyline([['x' => 25, 'y' => 140], ['x' => 85, 'y' => 50], ['x' => 145, 'y' => 140]]);
$draw->setStrokeLineJoin($saved);
$draw->polyline([['x' => 185, 'y' => 140], ['x' => 245, 'y' => 50], ['x' => 305, 'y' => 140]]);
echo 'restored=', $draw->getStrokeLineJoin() === $saved ? 'yes' : 'no', "\n";
$image->drawImage($draw);
$path = __DIR__ . '/restore-join.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'restore-join.png', "\n";
$draw->clear();
$image->clear();
Результат: restore-join.png 340×180. Слева V с Bevel, справа V с восстановленным Round. Данные getter использованы для возврата исходного стиля: вызывающий код не должен угадывать, какое оформление было до вспомогательной отрисовки. Перед именем файла консоль: restored=yes. Последняя строка консоли — restore-join.png.
Ограничения, альтернативы и стоимость
Если код состоит из двух самостоятельных line, смена Join не превращает их в один контур. Соберите polyline или один path с последовательными LineTo. Cap меняет внешние окончания, Join — внутренний стык; проверяйте их независимо.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::setStrokeLineJoin. Разбор параметра: Стыки связанных отрезков. Геометрия: связный путь.
ImagickDraw::setStrokeLineJoinВ схеме острые углы маршрута должны стать скруглёнными или срезанными, сохраняя те же вершины.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setStrokeLineJoin(int $linejoin): boolВ схеме острые углы маршрута должны стать скруглёнными или срезанными, сохраняя те же вершины.
Join оформляет общий узел соседних сегментов одного связного пути. MITER продолжает края до острия, ROUND закругляет, BEVEL срезает выступ. Это не соединитель двух отдельных вызовов line: у них собственные окончания, даже если координаты совпадают.
Сигнатура: ImagickDraw::setStrokeLineJoin(int $linejoin): bool
| Параметр | Тип | Смысл |
|---|---|---|
$linejoin | int | Imagick::LINEJOIN_MITER, Imagick::LINEJOIN_ROUND, Imagick::LINEJOIN_BEVEL. |
Параметр обязательный, передаётся по значению. Setter изменяет оформление следующих команд данного объекта, а не перемещает точки пути. Сигнатура возвращает bool; в текущем binding успешная запись настройки возвращает true. У части страниц Manual return ошибочно описан как отсутствие значения; полный снимок ниже сохраняет это противоречие. true не является PNG, а вызовы не следует объединять цепочкой через возвращаемое значение.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.setstrokelinejoin",
"name": "ImagickDraw::setStrokeLineJoin",
"purpose_en": "Specifies the shape to be used at the corners of paths when they are stroked",
"description_en": "Specifies the shape to be used at the corners of paths (or other vector shapes) when they are stroked.",
"signature": "ImagickDraw::setStrokeLineJoin(int $linejoin): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "linejoin",
"type": "int",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "One of the LINEJOIN constant ( imagick::LINEJOIN_* )."
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setStrokeLineJoin example",
"language": "php",
"code_sha256": "83ff61a6e7b7dfe3292e3297df4156cede525f155652271cae110c39663dee9f"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setstrokelinejoin.php",
"official_page_sha256": "354472cef17f13c2ec59b999a2b95ec70c0c7abb90b57571d3cce85f2c1cf90c",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setstrokelinejoin.xml",
"xml_sha256": "a97008f277fde81cd75a045ac2a6899c7e58509c77df3a597e56d2c8381582e8",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.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(18);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_ROUND);
$draw->polyline([['x' => 30, 'y' => 140], ['x' => 120, 'y' => 50], ['x' => 210, 'y' => 140]]);
$image->drawImage($draw);
$path = __DIR__ . '/setstrokelinejoin-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'setstrokelinejoin-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся setstrokelinejoin-basic.png 240×180. Открытая V-образная ломаная толщиной 18 через (30,140), (120,50), (210,140); вершина скруглена. Сравнение здесь посвящено стыку; форму концов отдельно смотрите на line в разделе Cap. Последняя строка консоли — setstrokelinejoin-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Один связный путь и две отдельные линии
Настройка Join не сработала в старом коде: там были два вызова line. Сравним с единым polyline, где действительно существует общий узел.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(480, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(18);
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_ROUND);
$draw->polyline([['x' => 30, 'y' => 150], ['x' => 110, 'y' => 50], ['x' => 190, 'y' => 150]]);
$draw->setStrokeColor('#c25732');
$draw->line(270, 150, 350, 50);
$draw->line(350, 50, 430, 150);
$image->drawImage($draw);
$path = __DIR__ . '/connected-versus-lines.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'connected-versus-lines.png', "\n";
$draw->clear();
$image->clear();
Результат: connected-versus-lines.png 480×200. Слева единая бирюзовая ломаная с округлённым стыком. Справа два оранжевых независимых отрезка: совпадение концов не создаёт для них Round Join; вид их стыковки определяется окончаниями. В CLI-превью polyline текущей версии наблюдается отдельная граница формы последнего окончания, поэтому демонстрация Join оценивает центральный узел, а не гарантирует одинаковую форму внешних концов во всех сборках. Чтобы получить один стык, объедините геометрию в один путь. Последняя строка консоли — connected-versus-lines.png.
Ограничения, альтернативы и стоимость
Если код состоит из двух самостоятельных line, смена Join не превращает их в один контур. Соберите polyline или один path с последовательными LineTo. Cap меняет внешние окончания, Join — внутренний стык; проверяйте их независимо.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::getStrokeLineJoin. Разбор параметра: Стыки связанных отрезков. Геометрия: связный путь.
ImagickDraw::getStrokeMiterLimitНужно понять, почему острый угол срезан: прочитать ограничение вместе с режимом Join, а не менять толщину вслепую.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getStrokeMiterLimit(): intНужно понять, почему острый угол срезан: прочитать ограничение вместе с режимом Join, а не менять толщину вслепую.
MiterLimit — безразмерный предел отношения полной длины miter (между наружным остриём и внутренним углом) к толщине stroke. Для угла θ отношение равно 1/sin(θ/2). При превышении предела Miter превращается в Bevel; для Round/Bevel это ограничение не создаёт такой переход.
Сигнатура: ImagickDraw::getStrokeMiterLimit(): int
Параметров нет: читается текущее состояние данного объекта Draw. Пустые скобки вызывают метод, знак = сохраняет его результат в переменную. Getter не изменяет уже нарисованные пиксели и не извлекает стиль из готового PNG.
Возврат: Getter возвращает int. Manual указывает 0 при отсутствии настройки, но не следует угадывать по этому тексту реальный default конкретной сборки; сначала задаём значение явно. Чтение лимита само не меняет Join.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.getstrokemiterlimit",
"name": "ImagickDraw::getStrokeMiterLimit",
"purpose_en": "Returns the stroke miter limit",
"description_en": "Returns the miter limit. When two line segments meet at a sharp angle and miter joins have been specified for 'lineJoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path. The 'miterLimit' imposes a limit on the ratio of the miter length to the 'lineWidth'.",
"signature": "ImagickDraw::getStrokeMiterLimit(): int",
"modifiers": [
"public"
],
"return_type": "int",
"parameters": [],
"return_en": "Returns an int describing the miter limit and 0 if no miter limit is set.",
"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.getstrokemiterlimit.php",
"official_page_sha256": "843c5ebadd9fbecd5d8be80390222c9967fcd5115b6448b8efc3d4797e4a7069",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getstrokemiterlimit.xml",
"xml_sha256": "36b38c0809194a309c48c68457132240201673c4d7d250f7e92e09fdad8e705c",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(14);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_MITER);
$draw->setStrokeMiterLimit(2);
$value = $draw->getStrokeMiterLimit();
echo 'miter=', $value, '; type=', get_debug_type($value), "\n";
$draw->polyline([['x' => 90, 'y' => 160], ['x' => 120, 'y' => 60], ['x' => 150, 'y' => 160]]);
$image->drawImage($draw);
$path = __DIR__ . '/getstrokemiterlimit-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'getstrokemiterlimit-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся getstrokemiterlimit-basic.png 240×200. Узкая V-образная линия толщиной 14; при limit=2 длинное остриё заменено срезом bevel, хотя выбран Join=Miter. Перед именем файла консоль: miter=2; type=int. Последняя строка консоли — getstrokemiterlimit-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Объяснить, почему изменение лимита не видно
В схеме включён Round Join. Смотрим и число MiterLimit, и режим стыка; одного высокого лимита недостаточно, чтобы получить острие.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(14);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_ROUND);
$draw->setStrokeMiterLimit(10);
$limit = $draw->getStrokeMiterLimit();
$join = $draw->getStrokeLineJoin();
if ($join !== Imagick::LINEJOIN_MITER) {
echo 'miter=', $limit, '; effect=inactive-for-this-join', "\n";
}
$draw->polyline([['x' => 90, 'y' => 160], ['x' => 120, 'y' => 60], ['x' => 150, 'y' => 160]]);
$image->drawImage($draw);
$path = __DIR__ . '/miter-inactive.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'miter-inactive.png', "\n";
$draw->clear();
$image->clear();
Результат: miter-inactive.png 240×200. Узкий V со скруглённой вершиной, хотя limit=10. Getter помогает диагностировать режим: лимит действует на Miter, а здесь выбран Round. Не следует подбирать огромное число для исправления другой настройки. Перед именем файла консоль: miter=10; effect=inactive-for-this-join. Последняя строка консоли — miter-inactive.png.
Ограничения, альтернативы и стоимость
Для наших сторон к вершине идут сдвиги (30,-100) и (30,100); внутренний угол около 33.4°, отношение около 3.48. Limit=2 даёт Bevel, limit=10 оставляет остриё. При этом обрезка холстом — отдельная причина плоской вершины: даже разрешённому острию нужен запас места.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::setStrokeMiterLimit. Разбор параметра: Предел острого выступа. Геометрия: связный путь.
ImagickDraw::setStrokeMiterLimitОстрый поворот создаёт слишком длинный шип, который выходит за рамку значка. Ограничиваем его геометрическое отношение, не обрезая изображение.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setStrokeMiterLimit(int $miterlimit): boolОстрый поворот создаёт слишком длинный шип, который выходит за рамку значка. Ограничиваем его геометрическое отношение, не обрезая изображение.
MiterLimit — безразмерный предел отношения полной длины miter (между наружным остриём и внутренним углом) к толщине stroke. Для угла θ отношение равно 1/sin(θ/2). При превышении предела Miter превращается в Bevel; для Round/Bevel это ограничение не создаёт такой переход.
Сигнатура: ImagickDraw::setStrokeMiterLimit(int $miterlimit): bool
| Параметр | Тип | Смысл |
|---|---|---|
$miterlimit | int | В PHP передаётся int не меньше 1. Это коэффициент, не пиксели, не угол и не длина выступа от одной вершины. |
Параметр обязательный, передаётся по значению. Setter изменяет оформление следующих команд данного объекта, а не перемещает точки пути. Сигнатура возвращает bool; в текущем binding успешная запись настройки возвращает true. У части страниц Manual return ошибочно описан как отсутствие значения; полный снимок ниже сохраняет это противоречие. true не является PNG, а вызовы не следует объединять цепочкой через возвращаемое значение.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.setstrokemiterlimit",
"name": "ImagickDraw::setStrokeMiterLimit",
"purpose_en": "Specifies the miter limit",
"description_en": "Specifies the miter limit. When two line segments meet at a sharp angle and miter joins have been specified for 'lineJoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path. The miterLimit' imposes a limit on the ratio of the miter length to the 'lineWidth'.",
"signature": "ImagickDraw::setStrokeMiterLimit(int $miterlimit): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "miterlimit",
"type": "int",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "the miter limit"
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setStrokeMiterLimit example",
"language": "php",
"code_sha256": "4de70c204d344b3a34b45ee96eb9a372104e2ca08651163eaa710d2de4ca85cf"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setstrokemiterlimit.php",
"official_page_sha256": "40f42e34c0ac615ec14916615519120fc84de4fe15deaa02938f8c61080000a4",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setstrokemiterlimit.xml",
"xml_sha256": "489fc04e8362396f9ee958bc3e1d9eac15ab91a280547c9e691f9eba057ea3a0",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(14);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_MITER);
$draw->setStrokeMiterLimit(2);
$draw->polyline([['x' => 90, 'y' => 160], ['x' => 120, 'y' => 60], ['x' => 150, 'y' => 160]]);
$image->drawImage($draw);
$path = __DIR__ . '/setstrokemiterlimit-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'setstrokemiterlimit-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся setstrokemiterlimit-basic.png 240×200. Узкая V-образная линия толщиной 14; при limit=2 длинное остриё заменено срезом bevel, хотя выбран Join=Miter. Последняя строка консоли — setstrokemiterlimit-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Убрать шип или намеренно сохранить остриё
Для одного и того же угла сравним безопасный срез и длинное острие. Так видно, что лимит — коэффициент геометрии, а не фиксированное число пикселей.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(480, 240, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(14);
$draw->setStrokeLineJoin(Imagick::LINEJOIN_MITER);
foreach ([2, 10] as $index => $limit) {
$shift = $index * 240;
$draw->setStrokeMiterLimit($limit);
$draw->polyline([
['x' => 90 + $shift, 'y' => 180],
['x' => 120 + $shift, 'y' => 80],
['x' => 150 + $shift, 'y' => 180],
]);
}
$image->drawImage($draw);
$path = __DIR__ . '/miter-options.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'miter-options.png', "\n";
$draw->clear();
$image->clear();
Результат: miter-options.png 480×240. Слева limit=2 даёт срез, справа limit=10 сохраняет острие. Угол и толщина одинаковые; отличие не вызвано кропом или изменением координат. Для маленькой иконки ограниченный Miter/Bevel часто читается лучше длинного шипа. Последняя строка консоли — miter-options.png.
Ограничения, альтернативы и стоимость
Для наших сторон к вершине идут сдвиги (30,-100) и (30,100); внутренний угол около 33.4°, отношение около 3.48. Limit=2 даёт Bevel, limit=10 оставляет остриё. При этом обрезка холстом — отдельная причина плоской вершины: даже разрешённому острию нужен запас места.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::getStrokeMiterLimit. Разбор параметра: Предел острого выступа. Геометрия: связный путь.
ImagickDraw::getStrokeDashArrayНужно перенести пунктир основного объекта в легенду и отличить отсутствие pattern от массива длин.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getStrokeDashArray(): arrayНужно перенести пунктир основного объекта в легенду и отличить отсутствие pattern от массива длин.
Список чередует длины штриха и пробела в единицах холста; на обычном изображении без преобразований это пиксели. Нечётный список повторяется целиком: [18,6,3] эквивалентен [18,6,3,18,6,3], а не дописанному одному пробелу. По SVG отрицательные длины невалидны; нули имеют специальные эффекты, для практических паттернов здесь все элементы положительные.
Сигнатура: ImagickDraw::getStrokeDashArray(): array
Параметров нет: читается текущее состояние данного объекта Draw. Пустые скобки вызывают метод, знак = сохраняет его результат в переменную. Getter не изменяет уже нарисованные пиксели и не извлекает стиль из готового PNG.
Возврат: Getter возвращает array с float-элементами; при отсутствии пунктира возвращает пустой массив []. Это данные текущего шаблона, не измеренные пиксели уже нарисованной линии.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.getstrokedasharray",
"name": "ImagickDraw::getStrokeDashArray",
"purpose_en": "Returns an array representing the pattern of dashes and gaps used to stroke paths",
"description_en": "Returns an array representing the pattern of dashes and gaps used to stroke paths.",
"signature": "ImagickDraw::getStrokeDashArray(): array",
"modifiers": [
"public"
],
"return_type": "array",
"parameters": [],
"return_en": "Returns an array on success and empty array if not set.",
"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.getstrokedasharray.php",
"official_page_sha256": "8c444cacad7a406a881a5d0ff153a645702d2f7740bc0acc20f58b6f50866f0c",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getstrokedasharray.xml",
"xml_sha256": "8ed751a2fe847698e8a64680dbc5d16396f2cfd125fec07fc93d080b01db0216",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.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(6);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeDashArray([18, 10]);
$draw->setStrokeDashOffset(0);
$value = $draw->getStrokeDashArray();
echo 'type=', get_debug_type($value), '; elements=', count($value), '; first=', $value[0], '; first-type=', get_debug_type($value[0]), "\n";
$draw->line(25, 90, 215, 90);
$image->drawImage($draw);
$path = __DIR__ . '/getstrokedasharray-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'getstrokedasharray-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся getstrokedasharray-basic.png 240×180. Бирюзовая пунктирная линия толщиной 6: 18 единиц штрих, затем 10 промежуток; период 28. Концы штрихов срезаны режимом Butt. Перед именем файла консоль: type=array; elements=2; first=18; first-type=float. Последняя строка консоли — getstrokedasharray-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Перенести пунктир в легенду без угадывания
Рисуем основной условный путь, затем создаём независимый Draw для его образца в легенде. Getter возвращает пригодные для повторного использования данные pattern.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 170, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(6);
$draw->setStrokeDashArray([18, 10]);
$draw->line(30, 50, 290, 50);
$pattern = $draw->getStrokeDashArray();
$legend = new ImagickDraw();
$legend->setStrokeColor('#146c74');
$legend->setStrokeWidth(6);
$legend->setFillColor('none');
$legend->setStrokeDashArray($pattern === [] ? null : $pattern);
$legend->line(30, 120, 170, 120);
$image->drawImage($legend);
$legend->clear();
echo 'copied-elements=', count($pattern), "\n";
$image->drawImage($draw);
$path = __DIR__ . '/copied-dash-legend.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-dash-legend.png', "\n";
$draw->clear();
$image->clear();
Результат: copied-dash-legend.png 320×170. Верхний путь и нижний короткий образец имеют один pattern [18,10] и толщину 6. Второй Draw не знает настроек первого автоматически: массив скопирован явно; пустой getter [] при необходимости переводится в null. Перед именем файла консоль: copied-elements=2. Последняя строка консоли — copied-dash-legend.png.
Ограничения, альтернативы и стоимость
Сброс в текущем binding выполняется setStrokeDashArray(null), а не []. Пустой массив проходит в helper, который возвращает NULL и вызывает ImagickDrawException 'Cannot read stroke dash array parameter'; null имеет отдельную ветку сброса. При восстановлении getter [] переводите в null. Для старой версии расширения сверяйте поддержку nullable-сигнатуры.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::setStrokeDashArray. Разбор параметра: Штрих и промежуток. Геометрия: связный путь.
ImagickDraw::setStrokeDashArrayПлановый маршрут следует отличить от действующего не только цветом: задаём чередующиеся штрихи и промежутки.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setStrokeDashArray(array|null $dashes): boolПлановый маршрут следует отличить от действующего не только цветом: задаём чередующиеся штрихи и промежутки.
Список чередует длины штриха и пробела в единицах холста; на обычном изображении без преобразований это пиксели. Нечётный список повторяется целиком: [18,6,3] эквивалентен [18,6,3,18,6,3], а не дописанному одному пробелу. По SVG отрицательные длины невалидны; нули имеют специальные эффекты, для практических паттернов здесь все элементы положительные.
Сигнатура: ImagickDraw::setStrokeDashArray(array|null $dashes): bool
| Параметр | Тип | Смысл |
|---|---|---|
$dashes | array|null | array|null. Массив числовых длин; текущая PHP-сигнатура допускает null для сброса. Отдельных аргументов number_elements/dash_array у PHP-метода нет: такая фраза Manual пришла из C API. |
Параметр обязательный, передаётся по значению. Setter изменяет оформление следующих команд данного объекта, а не перемещает точки пути. Сигнатура возвращает bool; в текущем binding успешная запись настройки возвращает true. У части страниц Manual return ошибочно описан как отсутствие значения; полный снимок ниже сохраняет это противоречие. true не является PNG, а вызовы не следует объединять цепочкой через возвращаемое значение.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.setstrokedasharray",
"name": "ImagickDraw::setStrokeDashArray",
"purpose_en": "Specifies the pattern of dashes and gaps used to stroke paths",
"description_en": "Specifies the pattern of dashes and gaps used to stroke paths. The strokeDashArray represents an array of numbers that specify the lengths of alternating dashes and gaps in pixels. If an odd number of values is provided, then the list of values is repeated to yield an even number of values. To remove an existing dash array, pass a zero number_elements argument and null dash_array. A typical strokeDashArray_ array might contain the members 5 3 2.",
"signature": "ImagickDraw::setStrokeDashArray(array|null $dashes): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "dashes",
"type": "array|null",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "array of floats"
}
],
"return_en": "Returns true on success.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setStrokeDashArray example",
"language": "php",
"code_sha256": "f787c639c71847c41637713db5e31c77e42f17a9178a35f57026a239956869ba"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setstrokedasharray.php",
"official_page_sha256": "2e7d1c8dd2acf1d2dc50c084e37e26cbbead25745ecc71fdd85fe9a77aa43516",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setstrokedasharray.xml",
"xml_sha256": "cf23a176241189a21042db0d3ffd0474c0add0b9d95feec1f4a050cdd25476ee",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.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(6);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeDashArray([18, 10]);
$draw->setStrokeDashOffset(0);
$draw->line(25, 90, 215, 90);
$image->drawImage($draw);
$path = __DIR__ . '/setstrokedasharray-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'setstrokedasharray-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся setstrokedasharray-basic.png 240×180. Бирюзовая пунктирная линия толщиной 6: 18 единиц штрих, затем 10 промежуток; период 28. Концы штрихов срезаны режимом Butt. Последняя строка консоли — setstrokedasharray-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Нечётный pattern и возврат к сплошной линии
Показываем два типа разметки и обычную линию: переключение стиля не должно случайно переносить пунктир в следующий элемент.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(480, 260, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(6);
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$patterns = [[18, 10], [18, 6, 3], null];
foreach ($patterns as $index => $pattern) {
$draw->setStrokeDashArray($pattern);
$draw->setStrokeDashOffset(0);
$draw->line(40, 50 + $index * 70, 440, 50 + $index * 70);
}
$image->drawImage($draw);
$path = __DIR__ . '/dash-options.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'dash-options.png', "\n";
$draw->clear();
$image->clear();
Результат: dash-options.png 480×260. Сверху [18,10], в середине нечётный [18,6,3] с повтором до чётного списка, снизу сплошная линия после null. В C-инструкции Manual упомянуты два аргумента сброса; в PHP их не передают — используется один null. Последняя строка консоли — dash-options.png.
Ограничения, альтернативы и стоимость
Сброс в текущем binding выполняется setStrokeDashArray(null), а не []. Пустой массив проходит в helper, который возвращает NULL и вызывает ImagickDrawException 'Cannot read stroke dash array parameter'; null имеет отдельную ветку сброса. При восстановлении getter [] переводите в null. Для старой версии расширения сверяйте поддержку nullable-сигнатуры.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::getStrokeDashArray. Разбор параметра: Штрих и промежуток. Геометрия: связный путь.
ImagickDraw::getStrokeDashOffsetВ конфигурации накопилась фаза больше периода. Прочитаем её и приведём к положительному эквиваленту, чтобы лог и настройки было легче сравнивать.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getStrokeDashOffset(): floatВ конфигурации накопилась фаза больше периода. Прочитаем её и приведём к положительному эквиваленту, чтобы лог и настройки было легче сравнивать.
DashOffset указывает, с какого места циклического pattern начинается путь. Это расстояние по последовательности штрих/пробел, не перенос геометрии и не новый зазор в DashArray. Для [18,10] полный период 28; математический период равен 28. Не выдавайте это за проверенное равенство произвольных больших native offset: в использованной CLI-сборке offset28 не совпал с0. Основное сравнение поэтому использует только фазы0,9,18; обнаруженная граница отдельно зафиксирована в визуальном manifest.
Сигнатура: ImagickDraw::getStrokeDashOffset(): float
Параметров нет: читается текущее состояние данного объекта Draw. Пустые скобки вызывают метод, знак = сохраняет его результат в переменную. Getter не изменяет уже нарисованные пиксели и не извлекает стиль из готового PNG.
Возврат: Getter возвращает float; официальный текст указывает 0, если offset не установлен. Здесь заданное значение читается как 9.0; echo обычно печатает его как 9. Полученный float — настройка, не номер пикселя.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.getstrokedashoffset",
"name": "ImagickDraw::getStrokeDashOffset",
"purpose_en": "Returns the offset into the dash pattern to start the dash",
"description_en": "Returns the offset into the dash pattern to start the dash.",
"signature": "ImagickDraw::getStrokeDashOffset(): float",
"modifiers": [
"public"
],
"return_type": "float",
"parameters": [],
"return_en": "Returns a float representing the offset and 0 if it's not set.",
"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.getstrokedashoffset.php",
"official_page_sha256": "fb086f49ec7d9d49479d29fd92394579cb5eeb1ec850b2b3719cfce9fa8730f0",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getstrokedashoffset.xml",
"xml_sha256": "5ad276f78dd3ae97cf0213ecd934830641c4ecf9f7c22e0ebd8102000d18f4d5",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}![Та же горизонтальная геометрия от (25,90) до (215,90), но pattern [18,10] начинается с фазы 9 внутри периода. Начальная видимая часть штриха короче, путь не перемещён.](/wp-content/plugins/aen-php-manual/assets/imagick-draw-stroke-outline/dash-offset-9.png)
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeDashArray([18, 10]);
$draw->setStrokeDashOffset(9);
$value = $draw->getStrokeDashOffset();
echo 'offset=', $value, '; type=', get_debug_type($value), "\n";
$draw->line(25, 90, 215, 90);
$image->drawImage($draw);
$path = __DIR__ . '/getstrokedashoffset-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'getstrokedashoffset-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся getstrokedashoffset-basic.png 240×180. Та же горизонтальная геометрия от (25,90) до (215,90), но pattern [18,10] начинается с фазы 9 внутри периода. Начальная видимая часть штриха короче, путь не перемещён. Перед именем файла консоль: offset=9; type=float. Последняя строка консоли — getstrokedashoffset-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Привести накопленную фазу к одному периоду
Сохранённая конфигурация содержит offset=37 при pattern [18,10]. По политике приложения сохраняем фазу только в диапазоне одного периода: вычисляем положительное значение9 до рисования. Это не утверждение о совпадении растра исходного offset37 и9 в любой версии.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(6);
$draw->setStrokeDashArray([18, 10]);
$draw->setStrokeDashOffset(37);
$stored = $draw->getStrokeDashOffset();
$period = array_sum($draw->getStrokeDashArray());
$phase = fmod($stored, $period);
if ($phase < 0) {
$phase += $period;
}
$draw->setStrokeDashOffset($phase);
$draw->line(25, 90, 215, 90);
echo 'stored=', $stored, '; phase=', $phase, "\n";
$image->drawImage($draw);
$path = __DIR__ . '/normalised-phase.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'normalised-phase.png', "\n";
$draw->clear();
$image->clear();
Результат: normalised-phase.png 240×180. Пунктир с нормализованной фазой 9, геометрия прежняя. array_sum получает период 28, fmod сохраняет дробный остаток (обычный % в PHP работает с целыми). Здесь период положительный по заданному pattern; при внешнем вводе сначала исключите пустой/нулевой период. Перед именем файла консоль: stored=37; phase=9. Последняя строка консоли — normalised-phase.png.
Ограничения, альтернативы и стоимость
Отрицательная фаза не равна отрицательной длине штриха: это разные параметры. SVG/MVG предусматривает циклическую интерпретацию offset, но разные рендереры/версии имели расхождения, особенно с нечётным списком. Для выбранной политики приложения используйте явный чётный pattern и неотрицательную фазу в одном периоде, затем проверьте нужную сборку. Нормализация конфигурационного значения не служит доказательством, что исходный большой offset отрисовался бы побитно так же. Изменение offset не исправляет неверный порядок вершин.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::setStrokeDashOffset. Разбор параметра: Фаза пунктира вдоль того же пути. Геометрия: связный путь.
ImagickDraw::setStrokeDashOffsetШтрихи должны продолжаться согласованно после закрытого участком схемы разрыва; меняем фазу второго отрезка, не его координаты.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setStrokeDashOffset(float $dash_offset): boolШтрихи должны продолжаться согласованно после закрытого участком схемы разрыва; меняем фазу второго отрезка, не его координаты.
DashOffset указывает, с какого места циклического pattern начинается путь. Это расстояние по последовательности штрих/пробел, не перенос геометрии и не новый зазор в DashArray. Для [18,10] полный период 28; математический период равен 28. Не выдавайте это за проверенное равенство произвольных больших native offset: в использованной CLI-сборке offset28 не совпал с0. Основное сравнение поэтому использует только фазы0,9,18; обнаруженная граница отдельно зафиксирована в визуальном manifest.
Сигнатура: ImagickDraw::setStrokeDashOffset(float $dash_offset): bool
| Параметр | Тип | Смысл |
|---|---|---|
$dash_offset | float | float в единицах pattern, допустима дробная фаза (например 2.5). Не округляйте её до int только потому, что учебный пример использует 9. |
Параметр обязательный, передаётся по значению. Setter изменяет оформление следующих команд данного объекта, а не перемещает точки пути. Сигнатура возвращает bool; в текущем binding успешная запись настройки возвращает true. У части страниц Manual return ошибочно описан как отсутствие значения; полный снимок ниже сохраняет это противоречие. true не является PNG, а вызовы не следует объединять цепочкой через возвращаемое значение.
Версии/ошибки: PECL imagick 2, PECL imagick 3. В снимке deprecated/removed не указаны; страницы помечены как не полностью документированные, errors/changelog пусты. Это не означает отсутствие отказов. Неверный PHP-тип может вызвать TypeError, недопустимая настройка/массив — ImagickDrawException, применение/запись — ImagickException или false. Значения enum проверяйте по разрешённым константам, числовые значения — на допустимость и конечность. Проверенный синтаксис не заменяет нативную проверку версии расширения.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены для сверки, включая английское описание, возвращаемое значение, ограничения, версии, ссылки и hashes.
{
"id": "imagickdraw.setstrokedashoffset",
"name": "ImagickDraw::setStrokeDashOffset",
"purpose_en": "Specifies the offset into the dash pattern to start the dash",
"description_en": "Specifies the offset into the dash pattern to start the dash.",
"signature": "ImagickDraw::setStrokeDashOffset(float $dash_offset): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "dash_offset",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "dash offset"
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setStrokeDashOffset example",
"language": "php",
"code_sha256": "d8da37f59f134e8f39f94b9a4e25e37c987859419a4e1c24a325046fb5a6c35d"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setstrokedashoffset.php",
"official_page_sha256": "e3554aef239c872df27e1984422f32b3e61b97f02bc0472e87c82b0e603f3eef",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setstrokedashoffset.xml",
"xml_sha256": "0c0540e0118fa5240ce2bae28b5857a9005434f999ca0062c47240fc6e01858b",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}![Та же горизонтальная геометрия от (25,90) до (215,90), но pattern [18,10] начинается с фазы 9 внутри периода. Начальная видимая часть штриха короче, путь не перемещён.](/wp-content/plugins/aen-php-manual/assets/imagick-draw-stroke-outline/dash-offset-9.png)
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeDashArray([18, 10]);
$draw->setStrokeDashOffset(9);
$draw->line(25, 90, 215, 90);
$image->drawImage($draw);
$path = __DIR__ . '/setstrokedashoffset-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'setstrokedashoffset-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся setstrokedashoffset-basic.png 240×180. Та же горизонтальная геометрия от (25,90) до (215,90), но pattern [18,10] начинается с фазы 9 внутри периода. Начальная видимая часть штриха короче, путь не перемещён. Последняя строка консоли — setstrokedashoffset-basic.png. Все координаты/фон создаются кодом. Getter читает настройку Draw; картинка отдельно показывает применённый стиль и не служит доказательством возвращаемого PHP-значения.
Практическая задача: Сохранить фазу за скрытым участком соединения
Часть прямой связи закрыта блоком схемы. Рисуем два видимых отрезка, но хотим, чтобы штрихи соответствовали одной воображаемой линии, проходящей за блоком.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(340, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(6);
$draw->setFillColor('none');
$draw->setStrokeWidth(6);
$draw->setStrokeDashArray([18, 10]);
$draw->setStrokeLineCap(Imagick::LINECAP_BUTT);
$draw->setStrokeDashOffset(0);
$draw->line(30, 80, 150, 80);
$distanceFromOrigin = 180 - 30;
$draw->setStrokeDashOffset(fmod($distanceFromOrigin, 28));
$draw->line(180, 80, 300, 80);
$image->drawImage($draw);
$path = __DIR__ . '/dash-across-hidden-gap.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'dash-across-hidden-gap.png', "\n";
$draw->clear();
$image->clear();
Результат: dash-across-hidden-gap.png 340×160. Два пунктирных участка x=30..150 и x=180..300 с пробелом шириной 30. Второй использует фазу 150 mod 28 = 10, учитывающую весь путь от начала, включая скрытое место. Геометрия не сдвинута; сдвинут только pattern внутри второго видимого участка. Последняя строка консоли — dash-across-hidden-gap.png.
Ограничения, альтернативы и стоимость
Отрицательная фаза не равна отрицательной длине штриха: это разные параметры. SVG/MVG предусматривает циклическую интерпретацию offset, но разные рендереры/версии имели расхождения, особенно с нечётным списком. Для выбранной политики приложения используйте явный чётный pattern и неотрицательную фазу в одном периоде, затем проверьте нужную сборку. Нормализация конфигурационного значения не служит доказательством, что исходный большой offset отрисовался бы побитно так же. Изменение offset не исправляет неверный порядок вершин.
Чтение настройки не требует анализа готовых пикселей; это доступ к состоянию Draw. Не вызывайте getter в цикле для каждого пикселя, если состояние не меняется: сохраните значение один раз. Растеризация длинного пунктира и множества узлов выполняется при drawImage, а не при чтении параметра. Ограничивайте холст и число сегментов, измеряйте полное задание; для статичного значка используйте готовый PNG. Если нужна интерактивная линия в браузере, рассмотрите SVG/canvas.
Пара: ImagickDraw::getStrokeDashOffset. Разбор параметра: Фаза пунктира вдоль того же пути. Геометрия: связный путь.
Источники и обсуждения
- ImagickDraw::getStrokeDashArray
- ImagickDraw::getStrokeDashOffset
- ImagickDraw::getStrokeLineCap
- ImagickDraw::getStrokeLineJoin
- ImagickDraw::getStrokeMiterLimit
- ImagickDraw::setStrokeDashArray
- ImagickDraw::setStrokeDashOffset
- ImagickDraw::setStrokeLineCap
- ImagickDraw::setStrokeLineJoin
- ImagickDraw::setStrokeMiterLimit
- SVG stroke cap/join/miter/dash/offset
- ImageMagick MVG stroke properties
- Imagick binding: getter/setter and nullable DashArray
- Imagick helper: empty array conversion
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


