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

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

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

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

Глава 328 · После рисования линий и путей

ImagickDraw: окончания, стыки и пунктир — десять get/set методов

Cap и Join, предел острых углов, pattern штрихов и его фаза; чтение и восстановление настроек, сравнения PNG и понятная схема маршрутов.

Сделать путь читаемым: конец, угол, пунктир и его фаза

В PNG-схеме основной маршрут должен быть сплошным с мягкими окончаниями, запасной — пунктирным; острый поворот не должен превращаться в огромный шип. Координаты могут быть верными, а картинка всё равно выглядит плохо из-за оформления stroke. Разберём пять независимых настроек и чтение их состояния: Cap, Join, MiterLimit, DashArray, DashOffset.

Первый результат — линия толщиной 20 с круглыми окончаниями
Первый результат — линия толщиной 20 с круглыми окончаниями Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.

Если вы ещё не рисовали PNG, начните с первой линии; текущая точка и path объясняются в базовых путях. Кратко: Draw записывает настройку, следующая геометрическая команда использует её; drawImage применяет список к пикселям, writeImage создаёт файл. Здесь stroke — обводка, fill — внутренняя заливка, которую для открытой линии отключаем.

Первое изменение: тот же отрезок с круглыми концами

Сохранить линию с Round CapПример для указанного окружения
<?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 и не изображение.

Как значение getter помогает программе
  1. В Draw уже есть стиль, заданный шаблоном/другой функцией
  2. Getter возвращает int, float или array в переменную
  3. Код принимает решение: отступить, скопировать pattern, нормализовать фазу
  4. Если стиль временно изменён, сохранённое значение помогает восстановить его

Дальше if проверяет условие, throw сообщает об отказе записи; см. исключения. foreach перебирает массив: номер $index начинается с нуля. Нужный синтаксис разобран в условиях и циклах.

Окончания линии

Cap оформляет конец открытого подконтура и конец каждого штриха. BUTT обрезает на конечной точке; ROUND добавляет полукруг, SQUARE — прямоугольное продолжение. ROUND/SQUARE выступают вдоль касательной на половину толщины. На замкнутом непрерывном контуре внешних концов нет.

Сверху Butt/срез, Round/круг, Square/квадрат; направляющие отмечают исходные концы, а не пределы окрашивания
Сверху Butt/срез, Round/круг, Square/квадрат; направляющие отмечают исходные концы, а не пределы окрашивания Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.

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

Читать настройку · Изменять настройку

Стыки связанных отрезков

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

Слева Miter/острый, в центре Round/скруглённый, справа Bevel/срезанный стык одного связного пути
Слева Miter/острый, в центре Round/скруглённый, справа Bevel/срезанный стык одного связного пути Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.

Если код состоит из двух самостоятельных line, смена Join не превращает их в один контур. Соберите polyline или один path с последовательными LineTo. Cap меняет внешние окончания, Join — внутренний стык; проверяйте их независимо.

Читать настройку · Изменять настройку

Предел острого выступа

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

Одинаковый острый угол: limit=2 со срезом, limit=10 с остриём; подписи не входят в минимальный PNG
Одинаковый острый угол: limit=2 со срезом, limit=10 с остриём; подписи не входят в минимальный PNG Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.

Для наших сторон к вершине идут сдвиги (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 повторяется до чётного
Сверху [18,10], затем [18,6,3], снизу сплошная после сброса; нечётный pattern повторяется до чётного Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.

Сброс в текущем 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: координаты отрезков прежние, изменяется положение штрихов
Одинаковый pattern [18,10], сверху offset0, затем9, снизу18: координаты отрезков прежние, изменяется положение штрихов Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.

Отрицательная фаза не равна отрицательной длине штриха: это разные параметры. 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/%; в обычном холсте эти длины выражены в пикселях. При масштабировании координат проверьте единицы всей схемы. Нечётный массив удобен, но для фазовых расчётов сначала учитывайте удвоение полного периода.

Основной и запасной маршрут: различие видно без цвета

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

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

$image = new Imagick();
$image->newImage(600, 320, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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"
}
Горизонтальная бирюзовая линия толщиной 20 с круглыми концами; её геометрические концы x=40 и x=200, а окрашенная область простирается примерно от x=30 до x=210.
Горизонтальная бирюзовая линия толщиной 20 с круглыми концами; её геометрические концы x=40 и x=200, а окрашенная область простирается примерно от x=30 до x=210. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Прочитать: Окончания линииПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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

ПараметрТипСмысл
$linecapintImagick::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"
}
Горизонтальная бирюзовая линия толщиной 20 с круглыми концами; её геометрические концы x=40 и x=200, а окрашенная область простирается примерно от x=30 до x=210.
Горизонтальная бирюзовая линия толщиной 20 с круглыми концами; её геометрические концы x=40 и x=200, а окрашенная область простирается примерно от x=30 до x=210. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Задать: Окончания линииПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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

В интерфейсе конструктора отчёта нужно объяснить выбор окончания, сохранив одни и те же концы и толщину.

Сравнить одинаковую геометрию с тремя 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"
}
Открытая V-образная ломаная толщиной 18 через (30,140), (120,50), (210,140); вершина скруглена. Сравнение здесь посвящено стыку; форму концов отдельно смотрите на line в разделе Cap.
Открытая V-образная ломаная толщиной 18 через (30,140), (120,50), (210,140); вершина скруглена. Сравнение здесь посвящено стыку; форму концов отдельно смотрите на line в разделе Cap. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Прочитать: Стыки связанных отрезковПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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

ПараметрТипСмысл
$linejoinintImagick::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"
}
Открытая V-образная ломаная толщиной 18 через (30,140), (120,50), (210,140); вершина скруглена. Сравнение здесь посвящено стыку; форму концов отдельно смотрите на line в разделе Cap.
Открытая V-образная ломаная толщиной 18 через (30,140), (120,50), (210,140); вершина скруглена. Сравнение здесь посвящено стыку; форму концов отдельно смотрите на line в разделе Cap. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Задать: Стыки связанных отрезковПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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"
}
Узкая V-образная линия толщиной 14; при limit=2 длинное остриё заменено срезом bevel, хотя выбран Join=Miter.
Узкая V-образная линия толщиной 14; при limit=2 длинное остриё заменено срезом bevel, хотя выбран Join=Miter. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Прочитать: Предел острого выступаПример для указанного окружения
<?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

ПараметрТипСмысл
$miterlimitintВ 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"
}
Узкая V-образная линия толщиной 14; при limit=2 длинное остриё заменено срезом bevel, хотя выбран Join=Miter.
Узкая V-образная линия толщиной 14; при limit=2 длинное остриё заменено срезом bevel, хотя выбран Join=Miter. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Задать: Предел острого выступаПример для указанного окружения
<?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"
}
Бирюзовая пунктирная линия толщиной 6: 18 единиц штрих, затем 10 промежуток; период 28. Концы штрихов срезаны режимом Butt.
Бирюзовая пунктирная линия толщиной 6: 18 единиц штрих, затем 10 промежуток; период 28. Концы штрихов срезаны режимом Butt. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Прочитать: Штрих и промежутокПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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

ПараметрТипСмысл
$dashesarray|nullarray|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"
}
Бирюзовая пунктирная линия толщиной 6: 18 единиц штрих, затем 10 промежуток; период 28. Концы штрихов срезаны режимом Butt.
Бирюзовая пунктирная линия толщиной 6: 18 единиц штрих, затем 10 промежуток; период 28. Концы штрихов срезаны режимом Butt. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Задать: Штрих и промежутокПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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 и возврат к сплошной линии

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

Нечётный 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 внутри периода. Начальная видимая часть штриха короче, путь не перемещён.
Та же горизонтальная геометрия от (25,90) до (215,90), но pattern [18,10] начинается с фазы 9 внутри периода. Начальная видимая часть штриха короче, путь не перемещён. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Прочитать: Фаза пунктира вдоль того же путиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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_offsetfloatfloat в единицах 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 внутри периода. Начальная видимая часть штриха короче, путь не перемещён.
Та же горизонтальная геометрия от (25,90) до (215,90), но pattern [18,10] начинается с фазы 9 внутри периода. Начальная видимая часть штриха короче, путь не перемещён. Иллюстрация ImageMagick CLI, не протокол запуска PHP Imagick; подписи/направляющие сравнений — объясняющий слой.
Задать: Фаза пунктира вдоль того же путиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(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. Разбор параметра: Фаза пунктира вдоль того же пути. Геометрия: связный путь.

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

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

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

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

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