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

Дерево руководства
Глава 334 · После геометрии и clipping
ImagickDraw: повторяющиеся узоры, каталог defs и фактура обводки
Шесть API: ячейка → повторяющаяся заливка; размер, мотив и фаза, local #ID, штриховка области, pattern stroke и управление локальной темой.
Одна ячейка превращается в фон карточки
Карточке отчёта нужен узнаваемый точечный фон. Вместо десятков вручную размещённых кругов опишем маленькую ячейку и заполним ею большую область. Получится PNG 240×180: мятная панель с бирюзовыми точками, вокруг белые поля. Точки нужны не только для украшения: повторяющийся знак может отличать тип области на плане или серию данных.

Ячейка похожа на один маленький штамп на обоях. Это модель повторения, а не обещание физического копирования PHP-объекта на каждый пиксель. В коде сначала каталог defs, внутри него pattern dots, затем после двух закрывающих команд — ссылка '#dots' и большая фигура. Заливку выбирают для следующих фигур; описание узора само не рисует панель.

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#dots');
$draw->rectangle(20, 20, 220, 160);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/first-pattern.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-pattern.png', "\n";
$image->clear();
При успешном выполнении first-pattern.png 240×180 содержит мятную панель (20,20)—(220,160) с бирюзовыми точками. Повтор имеет шаг 20 по каждой оси в проверенной CLI-иллюстрации; точная привязка растра/краевых пикселей зависит от renderer. Консоль — first-pattern.png.
$draw — объект команд, -> вызывает его метод. pushDefs() открывает каталог, pushPattern('dots',0,0,20,20) начинает ячейку с именем dots и размерами 20×20. circle задаёт центр и точку окружности, поэтому радиус здесь 13−10=3. popPattern() закрывает ячейку, popDefs() — каталог. В строке '#dots' знак # означает локальную ссылку. drawImage наносит команды, writeImage сохраняет PNG рядом со скриптом; условие if (!...) сообщает об отказе записи. Базовые фигуры — в геометрии Draw, очередь — в состоянии объекта.
Размер ячейки, положение мотива и фаза — разные настройки

Ширина/высота относятся к ячейке. Большая целевая фигура лишь открывает больше повторений, а не растягивает мотив. Для предсказуемого начала берём положительные целые размеры без CTM. Масштабирование и дробные границы могут менять сглаживание и стыки; знание размера ячейки не заменяет проверку конкретного растра.

Официальный x/y описывает начало пространства pattern. Однако в проверенном direct CLI ImageMagick 7.1.2-31 origin (5,5) дал тот же RGB, что (0,0). Поэтому не обещаем переносимую фазу по этим двум числам. Если нужно управляемо переместить точки внутри ячейки, меняем их геометрию явно. Следующий пример оставляет ячейку 20×20, но задаёт центр (15,15), радиус 3; фигура панели не перемещается.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('shifted', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(15, 15, 18, 15);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#shifted');
$draw->rectangle(20, 20, 220, 160);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/shifted-motif.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'shifted-motif.png', "\n";
$image->clear();
Результат: shifted-motif.png 240×180 содержит ту же мятную панель, заполненную точками с изменённым положением внутри ячейки. Размер и период 20×20 сохранены, локальный центр изменён с 10 на 15 по каждой оси. Это изменение мотива, а не перенос панели и не обещание одинаковой фазовой реализации всех PHP/ImageMagick-связок. Консоль — shifted-motif.png.
Внутренние координаты ячейки не надо повторять в координатах каждого экземпляра вручную. Фигура ограничивает заливку автоматически, включая неполный последний повтор. Сдвиг/scale всей системы — отдельные преобразования Draw.
Три парных блока и два вида локальной ссылки

| Пара | Назначение |
|---|---|
| pushDefs → popDefs | Ограничивает каталог именованных элементов. |
| pushPattern → popPattern | Ограничивает команды одного образца и его размер. |
| push → pop | Сохраняет/возвращает графический контекст при временной теме; не удаляет уже записанные фигуры. |

Имя определения — обычная строка dots. Для fill/stroke pattern URL передайте '#dots'; не 'dots', не 'dots.png', не 'https://...', не 'url(#dots)'. В отличие от clip, DrawingWand печатает MVG pattern ID без двойных кавычек: не добавляйте кавычки внутрь PHP-строки. Сами PHP-кавычки 'dots' нужны для синтаксиса строки и в ID не входят. Сравнение с именами окон clipping помогает не переносить один синтаксис ссылки на другой.
Узор внутри области и узор широкой линии


Fill покрывает внутренность фигуры, stroke — полосу вдоль её границы или линии. У маршрута нет внутренней площади для заливки, зато ширина 24 делает текстуру видимой. Если нужны настоящие пробелы между штрихами вдоль пути, используйте dash array и dash offset. Текстура pattern ориентируется в системе рисунка; не обещаем автоматическое вращение каждого мотива по касательной к пути. Цвет, alpha и сглаживание разобраны в базовом стиле обводки.
Отчёт: общий фон, выделенная область и обычная легенда
На схеме нужен один общий точечный фон, поверх него — штриховка выделенной области, а в углу — читаемая светлая легенда. Каждый узор описан в собственном небольшом каталоге соответствующего Draw. Фон, выделенная область и обычное оформление записываются тремя независимыми Draw и последовательно наносятся на один $image. Так активная текстура первого слоя не переходит во второй или третий. Все исходные элементы создаются кодом, внешние картинки и шрифты не нужны. Смена переменной $draw на новый объект не очищает уже нанесённые пиксели $image. Бирюзовая полоса в белом блоке — условное обозначение, не текст.

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(400, 240, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#dots');
$draw->rectangle(20, 30, 380, 210);
$image->drawImage($draw);
$draw->clear();
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('hatch', 0, 0, 12, 12);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 12, 12);
$draw->setFillColor('none');
$draw->setStrokeColor('#c25732');
$draw->setStrokeWidth(3);
$draw->line(-6, 12, 6, 0);
$draw->line(6, 12, 18, 0);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#hatch');
$draw->polygon([
['x' => 40, 'y' => 190], ['x' => 110, 'y' => 110],
['x' => 190, 'y' => 150], ['x' => 270, 'y' => 60],
['x' => 360, 'y' => 100], ['x' => 360, 'y' => 190],
]);
$image->drawImage($draw);
$draw->clear();
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->rectangle(40, 45, 155, 75);
$draw->setFillColor('#146c74');
$draw->rectangle(50, 55, 140, 63);
$draw->setFillColor('none');
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->rectangle(20, 30, 380, 210);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/pattern-report.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pattern-report.png', "\n";
$image->clear();
При успехе pattern-report.png 400×240 содержит точечную мятную панель и отдельную штрихованную область с вершинами (40,190),(110,110),(190,150),(270,60),(360,100),(360,190). Белая легенда (40,45)—(155,75) перекрывает фон; бирюзовая полоса (50,55)—(140,63) и рамка толщиной 3 рисуются обычным цветом. Консоль — pattern-report.png.
Упражнение: сделайте расстояние между точками вдвое больше, сохранив их размер. Решение: в dots увеличить width/height и фоновый rectangle с 20 до 40, оставив circle(10,10,13,10) прежним. Штриховка hatch не должна измениться. Если легенда неожиданно покрылась узором, проверьте, что для неё создан отдельный Draw без активного pattern. Простая смена цвета или лишний popPattern не являются переносимым способом сброса URL. В текущем CLI смена dots на hatch в одном контексте и последующий обычный fill сохраняли прежний узор; три независимых слоя эту зависимость исключают.
Выбрать повторение по смыслу задачи
- Много одинаковых маленьких мотивов в области — небольшой pattern и fill URL.
- Фактура широкой рамки — stroke pattern; штрихи/пробелы вдоль пути — dash array.
- Изменить расстояние между мотивами — размер ячейки; изменить сам мотив — его геометрия; растянуть конечную фигуру — другая операция.
- Закончить ячейку — popPattern; закончить каталог — popDefs; вернуть тему — обычный pop. Они не взаимозаменяемы.
- Неизвестная ссылка и ошибочная геометрия могут отказать на разных этапах: setter, drawImage, writeImage. Проверка синтаксиса не подтверждает ни одного native результата.
Продолжить сочетанием узоров с окнами clipping и локальными координатами. Другие API ImagickDraw остаются отдельными узлами полного справочника.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
ImagickDraw::pushDefsКарточка использует повторяющийся фон и штриховку статуса. Их описание удобно отделить от команд, которые рисуют саму карточку.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pushDefs(): boolКарточка использует повторяющийся фон и штриховку статуса. Их описание удобно отделить от команд, которые рисуют саму карточку.
PushDefs обозначает начало списка определений; до popDefs описываются именованные элементы, например pattern и clip-path. Такой блок может обрабатываться раньше использующих его команд. Он не рисует панель, не создаёт PHP-массив, не сохраняет изображение и не является кешем между HTTP-запросами. Форма рисуется отдельно после выбора ресурса.

Синтаксис, параметры и результат
ImagickDraw::pushDefs(): boolАргументов нет. Метод открывает или закрывает соответствующий блок в конкретном Draw.
bool. В текущем PHP wrapper после вызова void DrawPushDefs возвращается true; это не подтверждение корректности всех будущих определений.
Доступность по сохранённому Manual: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot не заполнены. Примеры рассчитаны на PHP 8.2+ с расширением imagick; возможности SVG renderer не приравниваются к direct Draw. В raw-контрактах pushDefs/popDefs return prose говорит об отсутствии значения, хотя signature — bool; фактический wrapper разобран отдельно. Маркер [return.success] в других записях означает описание успеха, а не буквальную возвращаемую строку.
Ошибки в исходных страницах почти не расписаны. Неправильный тип параметра, незакрытый блок, неизвестное имя, неподдержанный контекст или недостаток ресурсов могут остановить подготовку/растеризацию. Некорректная local URL может вызвать исключение setter уже до drawImage; malformed MVG или отказ renderer — на drawImage. При HTTP-отдаче PNG не выводите текст диагностики в бинарный ответ; завершите обработку ошибок до его отправки.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены без скрытого исправления: описание, параметры, return, ошибки, версии, примеры и их hashes, see-also, changelog. Опечатка opPattern в purpose pushPattern остаётся в snapshot; реальная парная команда — popPattern.
{
"id": "imagickdraw.pushdefs",
"name": "ImagickDraw::pushDefs",
"purpose_en": "Indicates that following commands create named elements for early processing",
"description_en": "Indicates that commands up to a terminating ImagickDraw::popDefs command create named elements (e.g. clip-paths, textures, etc.) which may safely be processed earlier for the sake of efficiency.",
"signature": "ImagickDraw::pushDefs(): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.pushdefs.php",
"official_page_sha256": "4fb6db3888aede876d90b5c61b012cd83ce621bef4ccf5037c7423ed81ad66cf",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pushdefs.xml",
"xml_sha256": "5566648188c4a6eb76349f326831b032d51c07f492737dbb4a3684b9783fd348",
"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('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#dots');
$draw->rectangle(20, 20, 220, 160);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/catalogued-dots.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'catalogued-dots.png', "\n";
$image->clear();
При успешном выполнении создаётся catalogued-dots.png 240×180. Мятная панель (20,20)—(220,160) покрыта бирюзовыми точками. В каталоге описана одна ячейка 20×20, а панель вызывает её по имени; вне панели остаётся белый фон. Консоль — catalogued-dots.png.
Практическая задача: Два компонента с независимыми каталогами
На плане есть обычная и выделенная зоны. Каждому компоненту дадим свежий Draw и собственное определение нужного образца: активный pattern соседа не перейдёт в его контекст. В текущем CLI смена dots на hatch в одном активном контексте сохраняла прежнюю текстуру, поэтому здесь не рассчитываем на такой сброс.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(400, 200, 'white');
$image->setImageFormat('png');
foreach ([['dots', 20], ['hatch', 220]] as [$id, $left]) {
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
if ($id === 'dots') {
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
} else {
$draw->pushPattern('hatch', 0, 0, 12, 12);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 12, 12);
$draw->setFillColor('none');
$draw->setStrokeColor('#c25732');
$draw->setStrokeWidth(3);
$draw->line(-6, 12, 6, 0);
$draw->line(6, 12, 18, 0);
$draw->popPattern();
}
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#' . $id);
$draw->rectangle($left, 30, $left + 160, 170);
$image->drawImage($draw);
$draw->clear();
}
$path = __DIR__ . '/independent-pattern-components.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'independent-pattern-components.png', "\n";
$image->clear();
Результат: independent-pattern-components.png 400×200. Слева панель (20,30)—(180,170) с точками, справа (220,30)—(380,170) с оранжевой диагональной штриховкой на мятном фоне. Каждый каталог применён своим Draw/drawImage. Это две разные семантические зоны; переменная $draw на каждой итерации получает новый объект, а предыдущие пиксели остаются на $image. Консоль — independent-pattern-components.png.
Ошибки, альтернативы и стоимость
Внутри defs закончите каждый pattern и clip, затем закройте сам defs. Не путайте с обычным push, который сохраняет настройки. Назначение defs — организация ресурсов; не обещайте определённое ускорение без измерения конкретного renderer.
Большой образец требует дополнительных ресурсов, а его описание и растеризация — времени. При неизменном мотиве не создавайте огромную ячейку размером со всю страницу ради маленького периодического рисунка. Ограничивайте размеры и число команд внешнего макета. Не обещайте, что defs/pattern всегда быстрее обычного цикла: сравнивайте на нужной площади и установленном renderer. Для неповторяющейся фактуры подходит отдельное изображение/composite; для простой пунктирной линии — dash array; это другие задачи.
В расширенных примерах foreach обходит собственный список компонентов, . соединяет # и имя, isset проверяет наличие соответствия статуса, throw останавливает экспорт при нарушении контракта. См. массивы, условия и циклы, исключения.
Соседние API: ImagickDraw::popDefs · ImagickDraw::pushPattern · ImagickDraw::popPattern · ImagickDraw::setFillPatternURL · ImagickDraw::setStrokePatternURL. Повторение с локальной темой: обычные push/pop; штрих и пробел: dash array.
ImagickDraw::popDefsВсе образцы и окна уже описаны. Теперь rectangle должен стать панелью на изображении, а не частью списка определений.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::popDefs(): boolВсе образцы и окна уже описаны. Теперь rectangle должен стать панелью на изображении, а не частью списка определений.
PopDefs закрывает список, начатый pushDefs. Он не выбирает узор, не отключает pattern, не возвращает прежнюю заливку и не заменяет обычный pop. После закрытия ресурс подключают соответствующим setter; определения без использования не окрашивают холст.

Синтаксис, параметры и результат
ImagickDraw::popDefs(): boolАргументов нет. Метод открывает или закрывает соответствующий блок в конкретном Draw.
bool. Текущий wrapper вызывает void DrawPopDefs и возвращает true; сам по себе этот результат не проверяет баланс всех блоков или готовность PNG.
Доступность по сохранённому Manual: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot не заполнены. Примеры рассчитаны на PHP 8.2+ с расширением imagick; возможности SVG renderer не приравниваются к direct Draw. В raw-контрактах pushDefs/popDefs return prose говорит об отсутствии значения, хотя signature — bool; фактический wrapper разобран отдельно. Маркер [return.success] в других записях означает описание успеха, а не буквальную возвращаемую строку.
Ошибки в исходных страницах почти не расписаны. Неправильный тип параметра, незакрытый блок, неизвестное имя, неподдержанный контекст или недостаток ресурсов могут остановить подготовку/растеризацию. Некорректная local URL может вызвать исключение setter уже до drawImage; malformed MVG или отказ renderer — на drawImage. При HTTP-отдаче PNG не выводите текст диагностики в бинарный ответ; завершите обработку ошибок до его отправки.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены без скрытого исправления: описание, параметры, return, ошибки, версии, примеры и их hashes, see-also, changelog. Опечатка opPattern в purpose pushPattern остаётся в snapshot; реальная парная команда — popPattern.
{
"id": "imagickdraw.popdefs",
"name": "ImagickDraw::popDefs",
"purpose_en": "Terminates a definition list",
"description_en": "Terminates a definition list.",
"signature": "ImagickDraw::popDefs(): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::popDefs example",
"language": "php",
"code_sha256": "fdddb9ce8d706562ba2b3b14931aeccf6adb8875ab48de9685770add2ab6b5f4"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.popdefs.php",
"official_page_sha256": "40a7ba617f71f1a00cac1976f019bebcf37b4b65300ae80dbde7ebd1c939552d",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/popdefs.xml",
"xml_sha256": "dc5ba0f7d22a4d850693ab6e9944224fb3da551e45d80d9585e258a04713e5c5",
"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('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->popDefs();
$draw->push();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#dots');
$draw->rectangle(20, 20, 220, 160);
$draw->pop();
$draw->setFillColor('#c25732');
$draw->rectangle(200, 20, 220, 160);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/after-definitions.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'after-definitions.png', "\n";
$image->clear();
При успешном выполнении создаётся after-definitions.png 240×180. Точечная мятная панель с отдельной сплошной оранжевой полосой справа x=200..220. После закрытия defs начались обычные команды рисунка; применение pattern ограничено обычным push/pop, затем задан цвет полосы. PopDefs не считается возвратом темы. Консоль — after-definitions.png.
Практическая задача: Закончить общий каталог узора и окна значка
Круглый значок должен иметь штриховку, выходящие за него элементы не нужны. В defs подготовим два разных именованных ресурса: pattern hatch и clip badge, затем закроем каталог до рисования.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('hatch', 0, 0, 12, 12);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 12, 12);
$draw->setFillColor('none');
$draw->setStrokeColor('#c25732');
$draw->setStrokeWidth(3);
$draw->line(-6, 12, 6, 0);
$draw->line(6, 12, 18, 0);
$draw->popPattern();
$draw->pushClipPath('badge');
$draw->setClipUnits(Imagick::PATHUNITS_USERSPACE);
$draw->setStrokeColor('none');
$draw->setFillColor('black');
$draw->circle(120, 90, 180, 90);
$draw->popClipPath();
$draw->popDefs();
$draw->setClipPath('badge');
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#hatch');
$draw->rectangle(0, 0, 240, 180);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/catalogue-pattern-and-clip.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'catalogue-pattern-and-clip.png', "\n";
$image->clear();
Результат: catalogue-pattern-and-clip.png 240×180. Мятный круг с оранжевой диагональной штриховкой, радиус 60; снаружи белый фон. Для pattern передано '#hatch', для clip — plain 'badge'. PopDefs только завершил каталог, а ресурс каждого вида включён своим setter. Консоль — catalogue-pattern-and-clip.png.
Ошибки, альтернативы и стоимость
Не пытайтесь исправить незакрытый pattern одним popDefs: это разные уровни структуры. Закрывайте их в обратном порядке: popPattern, затем popDefs. PopDefs не возвращает тему. Для обычной фигуры после активного узора используйте сохранённый до его выбора контекст push/pop либо свежий Draw; не обещайте, что один setFillColor снимет pattern во всех renderer.
Большой образец требует дополнительных ресурсов, а его описание и растеризация — времени. При неизменном мотиве не создавайте огромную ячейку размером со всю страницу ради маленького периодического рисунка. Ограничивайте размеры и число команд внешнего макета. Не обещайте, что defs/pattern всегда быстрее обычного цикла: сравнивайте на нужной площади и установленном renderer. Для неповторяющейся фактуры подходит отдельное изображение/composite; для простой пунктирной линии — dash array; это другие задачи.
В расширенных примерах foreach обходит собственный список компонентов, . соединяет # и имя, isset проверяет наличие соответствия статуса, throw останавливает экспорт при нарушении контракта. См. массивы, условия и циклы, исключения.
Соседние API: ImagickDraw::pushDefs · ImagickDraw::pushPattern · ImagickDraw::popPattern · ImagickDraw::setFillPatternURL · ImagickDraw::setStrokePatternURL. Повторение с локальной темой: обычные push/pop; штрих и пробел: dash array.
ImagickDraw::pushPatternДля десятков точек не хочется вручную вычислять каждую позицию. Опишем маленькую ячейку один раз и передадим повторение заливке.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::pushPattern(string $pattern_id, float $x, float $y, float $width, float $height): boolДля десятков точек не хочется вручную вычислять каждую позицию. Опишем маленькую ячейку один раз и передадим повторение заливке.
PushPattern начинает именованный образец. Его x/y задают положение пространства pattern, width/height — ширину и высоту ячейки, а команды до popPattern задают содержимое. Это размеры, не координаты правого нижнего угла. Ячейка становится отдельным пространством рисунка; её содержимое и область будущей фигуры — разные геометрии.

Синтаксис, параметры и результат
ImagickDraw::pushPattern(string $pattern_id, float $x, float $y, float $width, float $height): bool| Параметр | Что передать и зачем |
|---|---|
| $pattern_id | string, обязательный. Простое локальное имя dots без #. В PHP кавычки ограничивают строку; не вставляйте дополнительные символы двойных кавычек внутрь ID. |
| $x, $y | float, обязательные координаты начала пространства pattern. Это не перенос конечной панели и не гарантированная команда фазового сдвига для всех MVG renderer; наблюдаемая граница текущего CLI объяснена ниже. |
| $width, $height | float, обязательные ширина и высота ячейки в единицах рисунка. Для этих воспроизводимых растровых образцов берём небольшие положительные целые 12, 20 или 40; они не масштабируют circle внутри автоматически. |
bool по signature. Текущий PHP wrapper возвращает true, не проверяя bool native DrawPushPattern. Поэтому вложенный незаконченный pattern и неверные размеры нельзя считать принятыми только по этому значению.
Доступность по сохранённому Manual: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot не заполнены. Примеры рассчитаны на PHP 8.2+ с расширением imagick; возможности SVG renderer не приравниваются к direct Draw. В raw-контрактах pushDefs/popDefs return prose говорит об отсутствии значения, хотя signature — bool; фактический wrapper разобран отдельно. Маркер [return.success] в других записях означает описание успеха, а не буквальную возвращаемую строку.
Ошибки в исходных страницах почти не расписаны. Неправильный тип параметра, незакрытый блок, неизвестное имя, неподдержанный контекст или недостаток ресурсов могут остановить подготовку/растеризацию. Некорректная local URL может вызвать исключение setter уже до drawImage; malformed MVG или отказ renderer — на drawImage. При HTTP-отдаче PNG не выводите текст диагностики в бинарный ответ; завершите обработку ошибок до его отправки.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены без скрытого исправления: описание, параметры, return, ошибки, версии, примеры и их hashes, see-also, changelog. Опечатка opPattern в purpose pushPattern остаётся в snapshot; реальная парная команда — popPattern.
{
"id": "imagickdraw.pushpattern",
"name": "ImagickDraw::pushPattern",
"purpose_en": "Indicates that subsequent commands up to a ImagickDraw::opPattern() command comprise the definition of a named pattern",
"description_en": "Indicates that subsequent commands up to a DrawPopPattern() command comprise the definition of a named pattern. The pattern space is assigned top left corner coordinates, a width and height, and becomes its own drawing space. Anything which can be drawn may be used in a pattern definition. Named patterns may be used as stroke or brush definitions.",
"signature": "ImagickDraw::pushPattern(string $pattern_id, float $x, float $y, float $width, float $height): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "pattern_id",
"type": "string",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "the pattern Id"
},
{
"name": "x",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "x coordinate of the top-left corner"
},
{
"name": "y",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "y coordinate of the top-left corner"
},
{
"name": "width",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "width of the pattern"
},
{
"name": "height",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "height of the pattern"
}
],
"return_en": "[return.success]",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::pushPattern example",
"language": "php",
"code_sha256": "ef2254fea16792dfa2740f2af852f69b97f2d8573703e37579e1aaca90742ac0"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.pushpattern.php",
"official_page_sha256": "17c0f03ef553f7145c736fe587c1aa4b46cad67cb95633c618caf1aa6e5d8cad",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pushpattern.xml",
"xml_sha256": "897dfa091035d7623969c2c7393a6f5bf5508676ccaf7b9595a6b6d9342a3f00",
"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('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#dots');
$draw->rectangle(20, 20, 220, 160);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/first-tile-pattern.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-tile-pattern.png', "\n";
$image->clear();
При успешном выполнении создаётся first-tile-pattern.png 240×180. Мятная панель с точками, повторяемыми по двум осям с шагом 20 единиц. Локальный circle(10,10,13,10) задаёт радиус 3, а не радиус 13. Размер 20×20 задаёт период ячейки, не размер конечной панели. Консоль — first-tile-pattern.png.
Практическая задача: Построить штриховку выделенной области по проверенному шагу
На плане нужно отличить закрытую для прохода область без текста и без зависимости от оттенка. Штриховка добавляет ещё один визуальный признак. Её шаг задан в конфигурации, поэтому сначала проверим допустимый размер ячейки.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$step = 12;
if (!is_int($step) || $step < 4 || $step > 64) {
throw new InvalidArgumentException('Шаг штриховки должен быть целым от 4 до 64');
}
$draw->pushDefs();
$draw->pushPattern('hatch', 0, 0, $step, $step);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, $step, $step);
$draw->setFillColor('none');
$draw->setStrokeColor('#c25732');
$draw->setStrokeWidth(3);
$draw->line(-$step / 2, $step, $step / 2, 0);
$draw->line($step / 2, $step, 3 * $step / 2, 0);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#hatch');
$draw->polygon([
['x' => 30, 'y' => 140], ['x' => 90, 'y' => 40],
['x' => 170, 'y' => 70], ['x' => 220, 'y' => 140],
]);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/hatched-restricted-zone.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'hatched-restricted-zone.png', "\n";
$image->clear();
Результат: hatched-restricted-zone.png 240×180. Четырёхугольник с вершинами (30,140), (90,40), (170,70), (220,140) заполнен диагональной оранжевой штриховкой. Продолженные за границы ячейки линии предназначены для стыковки соседних повторов. Проверка размера — политика нашего компонента; bool pushPattern не заменяет её. Консоль — hatched-restricted-zone.png.
Ошибки, альтернативы и стоимость
В проверенном C native не допускает второй pushPattern до завершения первого; wrapper не переносит этот статус напрямую в return. Не вкладывайте pattern друг в друга. Задавайте положительные конечные размеры, ограничивайте площадь ячейки и сложность содержимого. Float в signature не обещает дробный физический bitmap без округления.
Большой образец требует дополнительных ресурсов, а его описание и растеризация — времени. При неизменном мотиве не создавайте огромную ячейку размером со всю страницу ради маленького периодического рисунка. Ограничивайте размеры и число команд внешнего макета. Не обещайте, что defs/pattern всегда быстрее обычного цикла: сравнивайте на нужной площади и установленном renderer. Для неповторяющейся фактуры подходит отдельное изображение/composite; для простой пунктирной линии — dash array; это другие задачи.
В расширенных примерах foreach обходит собственный список компонентов, . соединяет # и имя, isset проверяет наличие соответствия статуса, throw останавливает экспорт при нарушении контракта. См. массивы, условия и циклы, исключения.
Соседние API: ImagickDraw::pushDefs · ImagickDraw::popDefs · ImagickDraw::popPattern · ImagickDraw::setFillPatternURL · ImagickDraw::setStrokePatternURL. Повторение с локальной темой: обычные push/pop; штрих и пробел: dash array.
ImagickDraw::popPatternТочки ячейки уже описаны. Следующая большая фигура должна использовать образец, а отдельный значок рядом — остаться обычной фигурой.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::popPattern(): boolТочки ячейки уже описаны. Следующая большая фигура должна использовать образец, а отдельный значок рядом — остаться обычной фигурой.
PopPattern заканчивает активное определение и делает его доступным по имени. Он не заполняет большую панель автоматически и не возвращает прежний графический контекст. Содержимое образца, его применение и временная тема рисунка управляются тремя разными действиями.

Синтаксис, параметры и результат
ImagickDraw::popPattern(): boolАргументов нет. Метод открывает или закрывает соответствующий блок в конкретном Draw.
bool: true при успехе. Если native DrawPopPattern возвращает MagickFalse, текущий PHP wrapper выбрасывает ImagickDrawException. Лишний popPattern без активного определения — ошибка, а не сброс заливки.
Доступность по сохранённому Manual: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot не заполнены. Примеры рассчитаны на PHP 8.2+ с расширением imagick; возможности SVG renderer не приравниваются к direct Draw. В raw-контрактах pushDefs/popDefs return prose говорит об отсутствии значения, хотя signature — bool; фактический wrapper разобран отдельно. Маркер [return.success] в других записях означает описание успеха, а не буквальную возвращаемую строку.
Ошибки в исходных страницах почти не расписаны. Неправильный тип параметра, незакрытый блок, неизвестное имя, неподдержанный контекст или недостаток ресурсов могут остановить подготовку/растеризацию. Некорректная local URL может вызвать исключение setter уже до drawImage; malformed MVG или отказ renderer — на drawImage. При HTTP-отдаче PNG не выводите текст диагностики в бинарный ответ; завершите обработку ошибок до его отправки.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены без скрытого исправления: описание, параметры, return, ошибки, версии, примеры и их hashes, see-also, changelog. Опечатка opPattern в purpose pushPattern остаётся в snapshot; реальная парная команда — popPattern.
{
"id": "imagickdraw.poppattern",
"name": "ImagickDraw::popPattern",
"purpose_en": "Terminates a pattern definition",
"description_en": "Terminates a pattern definition.",
"signature": "ImagickDraw::popPattern(): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [],
"return_en": "[return.success]",
"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.poppattern.php",
"official_page_sha256": "624880f60cbeefe20e381afdd9bd0f26e96b3e1c2e6c5378ac30c604cc2eecf8",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/poppattern.xml",
"xml_sha256": "693043e4bb8407593e5c526bd0ee16001a17762f58572cd9b2c88fc2c077913f",
"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('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->popDefs();
$draw->push();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#dots');
$draw->rectangle(20, 20, 160, 160);
$draw->pop();
$draw->setFillColor('#c25732');
$draw->circle(200, 90, 225, 90);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/tile-finished-panel-started.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'tile-finished-panel-started.png', "\n";
$image->clear();
При успешном выполнении создаётся tile-finished-panel-started.png 240×180. Слева точечная панель, справа отдельный оранжевый круг радиусом 25. Круг записан после popPattern/popDefs и не добавлен в повторяющуюся ячейку. Обычный pop вернул контекст без активного узора, затем задан цвет круга. Консоль — tile-finished-panel-started.png.
Практическая задача: Временно включить узор, затем вернуть обычный цвет
Слева нужна текстура, справа сплошной статус. PopPattern уже завершил описание ячейки; для локального изменения оформления применим обычные push/pop, которые сохраняют и возвращают графический контекст.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('#c25732');
$draw->push();
$draw->setFillColor('white');
$draw->setFillPatternURL('#dots');
$draw->rectangle(20, 30, 140, 150);
$draw->pop();
$draw->rectangle(180, 30, 300, 150);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/pattern-and-solid-status.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pattern-and-solid-status.png', "\n";
$image->clear();
Результат: pattern-and-solid-status.png 320×180. Левая карточка (20,30)—(140,150) мятная с точками, правая (180,30)—(300,150) сплошная оранжевая. Обычный pop восстановил оранжевую тему, а попавшая в очередь левая карточка сохранилась. PopPattern сам не выполнял этот возврат. Консоль — pattern-and-solid-status.png.
Ошибки, альтернативы и стоимость
Один успешный popPattern нужен одному начатому pattern. Не закрывайте его обычным pop и не используйте дополнительный popPattern после каждого rectangle. Если нужны локальные настройки применения, отдельная пара push/pop располагается вокруг этих рисующих команд, как во втором примере.
Большой образец требует дополнительных ресурсов, а его описание и растеризация — времени. При неизменном мотиве не создавайте огромную ячейку размером со всю страницу ради маленького периодического рисунка. Ограничивайте размеры и число команд внешнего макета. Не обещайте, что defs/pattern всегда быстрее обычного цикла: сравнивайте на нужной площади и установленном renderer. Для неповторяющейся фактуры подходит отдельное изображение/composite; для простой пунктирной линии — dash array; это другие задачи.
В расширенных примерах foreach обходит собственный список компонентов, . соединяет # и имя, isset проверяет наличие соответствия статуса, throw останавливает экспорт при нарушении контракта. См. массивы, условия и циклы, исключения.
Соседние API: ImagickDraw::pushDefs · ImagickDraw::popDefs · ImagickDraw::pushPattern · ImagickDraw::setFillPatternURL · ImagickDraw::setStrokePatternURL. Повторение с локальной темой: обычные push/pop; штрих и пробел: dash array.
ImagickDraw::setFillPatternURLКруглый значок и выделенная область должны содержать повторяющийся рисунок, а их форма и внешние поля сохраняются.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFillPatternURL(string $fill_url): boolКруглый значок и выделенная область должны содержать повторяющийся рисунок, а их форма и внешние поля сохраняются.
Setter назначает локальный pattern заливке последующих фигур. В PHP передают '#dots': знак # здесь обязателен. Это отличается от setClipPath('window') с plain ID. Binding превращает ссылку в MVG fill url(#dots); HTTP-адрес, имя PNG и строка url(#dots) не являются аргументом этого PHP setter.

Синтаксис, параметры и результат
ImagickDraw::setFillPatternURL(string $fill_url): bool| Параметр | Что передать и зачем |
|---|---|
| $fill_url | string, обязательная локальная ссылка '#identifier' на завершённый pattern в этом Draw. Не сетевой URL и не путь к файлу. Если выбирается имя из данных, сопоставьте его с собственным перечнем определений. |
bool: true при успехе. Текущий wrapper превращает MagickFalse из DrawSetFillPatternURL в ImagickDrawException. Проверка ссылки может отказать уже здесь; успешная настройка не исключает последующую ошибку растеризации.
Доступность по сохранённому Manual: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot не заполнены. Примеры рассчитаны на PHP 8.2+ с расширением imagick; возможности SVG renderer не приравниваются к direct Draw. В raw-контрактах pushDefs/popDefs return prose говорит об отсутствии значения, хотя signature — bool; фактический wrapper разобран отдельно. Маркер [return.success] в других записях означает описание успеха, а не буквальную возвращаемую строку.
Ошибки в исходных страницах почти не расписаны. Неправильный тип параметра, незакрытый блок, неизвестное имя, неподдержанный контекст или недостаток ресурсов могут остановить подготовку/растеризацию. Некорректная local URL может вызвать исключение setter уже до drawImage; malformed MVG или отказ renderer — на drawImage. При HTTP-отдаче PNG не выводите текст диагностики в бинарный ответ; завершите обработку ошибок до его отправки.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены без скрытого исправления: описание, параметры, return, ошибки, версии, примеры и их hashes, see-also, changelog. Опечатка opPattern в purpose pushPattern остаётся в snapshot; реальная парная команда — popPattern.
{
"id": "imagickdraw.setfillpatternurl",
"name": "ImagickDraw::setFillPatternURL",
"purpose_en": "Sets the URL to use as a fill pattern for filling objects",
"description_en": "Sets the URL to use as a fill pattern for filling objects. Only local URLs (\"#identifier\") are supported at this time. These local URLs are normally created by defining a named fill pattern with DrawPushPattern/DrawPopPattern.",
"signature": "ImagickDraw::setFillPatternURL(string $fill_url): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "fill_url",
"type": "string",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "URL to use to obtain fill pattern."
}
],
"return_en": "[return.success]",
"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.setfillpatternurl.php",
"official_page_sha256": "2f5be33311fa015e62cabe02e190f250f67c32750bd9afc7176fcd28cb232e60",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setfillpatternurl.xml",
"xml_sha256": "e223100ae2b1b083f907fb0764c9616399952f316df7dd0b0b399237fe2acf36",
"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('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->popDefs();
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#dots');
$draw->circle(120, 90, 185, 90);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/patterned-badge.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'patterned-badge.png', "\n";
$image->clear();
При успешном выполнении создаётся patterned-badge.png 240×180. Круг радиусом 65 заполнен мятным узором с бирюзовыми точками, белые углы не затронуты. Узор повторяется внутри фигуры и обрезается её границей; он не растягивает один круг-мотив на весь значок. Консоль — patterned-badge.png.
Практическая задача: Выбрать штриховку для реальной области по разрешённому имени
Отчёт получает обозначение restricted из собственных данных. Не используем это значение как URL файла: сопоставим статус с известным локальным pattern и ограничим заливку геометрией области.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('dots', 0, 0, 20, 20);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 20, 20);
$draw->setFillColor('#146c74');
$draw->circle(10, 10, 13, 10);
$draw->popPattern();
$draw->pushPattern('hatch', 0, 0, 12, 12);
$draw->setStrokeColor('none');
$draw->setFillColor('#bdebe2');
$draw->rectangle(0, 0, 12, 12);
$draw->setFillColor('none');
$draw->setStrokeColor('#c25732');
$draw->setStrokeWidth(3);
$draw->line(-6, 12, 6, 0);
$draw->line(6, 12, 18, 0);
$draw->popPattern();
$draw->popDefs();
$status = 'restricted';
$patterns = ['normal' => 'dots', 'restricted' => 'hatch'];
if (!isset($patterns[$status])) {
throw new InvalidArgumentException('Неизвестный статус области');
}
$draw->setStrokeColor('none');
$draw->setFillColor('white');
$draw->setFillPatternURL('#' . $patterns[$status]);
$draw->polygon([
['x' => 30, 'y' => 140], ['x' => 90, 'y' => 40],
['x' => 170, 'y' => 70], ['x' => 220, 'y' => 140],
]);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/status-selected-pattern.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'status-selected-pattern.png', "\n";
$image->clear();
Результат: status-selected-pattern.png 240×180. Выделенный четырёхугольник содержит оранжевую штриховку на мятном фоне; поле за ним белое. Сопоставление статуса и локального имени не позволяет внешнему значению превратиться в произвольную файловую/сетевую ссылку. Для normal тот же компонент выбрал бы точки. Консоль — status-selected-pattern.png.
Ошибки, альтернативы и стоимость
Перед выбором узора задайте непрозрачную базовую заливку, если до этого использовалась 'none': URL не следует считать универсальным сбросом alpha. В примерах явно setFillColor('white') перед setter. Узор не растягивается под фигуру, а заполняет её повторениями; последний повтор у границы может быть виден только частично.
Большой образец требует дополнительных ресурсов, а его описание и растеризация — времени. При неизменном мотиве не создавайте огромную ячейку размером со всю страницу ради маленького периодического рисунка. Ограничивайте размеры и число команд внешнего макета. Не обещайте, что defs/pattern всегда быстрее обычного цикла: сравнивайте на нужной площади и установленном renderer. Для неповторяющейся фактуры подходит отдельное изображение/composite; для простой пунктирной линии — dash array; это другие задачи.
В расширенных примерах foreach обходит собственный список компонентов, . соединяет # и имя, isset проверяет наличие соответствия статуса, throw останавливает экспорт при нарушении контракта. См. массивы, условия и циклы, исключения.
Соседние API: ImagickDraw::pushDefs · ImagickDraw::popDefs · ImagickDraw::pushPattern · ImagickDraw::popPattern · ImagickDraw::setStrokePatternURL. Повторение с локальной темой: обычные push/pop; штрих и пробел: dash array.
ImagickDraw::setStrokePatternURLДля маршрута или предупреждающей рамки требуется фактура широкой обводки, при этом внутренняя заливка может оставаться обычной.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setStrokePatternURL(string $stroke_url): boolДля маршрута или предупреждающей рамки требуется фактура широкой обводки, при этом внутренняя заливка может оставаться обычной.
Setter назначает pattern обводке, а не внутренней области. Ширина stroke определяет полосу, внутри которой виден двумерный повтор. Это не setStrokeDashArray: тот формирует штрихи и пробелы вдоль пути, а здесь используется текстура. Отдельные мотивы не обязаны автоматически вращаться по направлению кривой.

Синтаксис, параметры и результат
ImagickDraw::setStrokePatternURL(string $stroke_url): bool| Параметр | Что передать и зачем |
|---|---|
| $stroke_url | string, обязательная локальная ссылка '#stripes' на определённый pattern. Как и для fill, это не файл и не внешний HTTP-ресурс. Цвет/opacity и толщина обводки задаются отдельно. |
bool: true при успехе. MagickFalse native setter текущий wrapper превращает в ImagickDrawException. Рисование и сохранение проверяют отдельные этапы, а не один bool setter.
Доступность по сохранённому Manual: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot не заполнены. Примеры рассчитаны на PHP 8.2+ с расширением imagick; возможности SVG renderer не приравниваются к direct Draw. В raw-контрактах pushDefs/popDefs return prose говорит об отсутствии значения, хотя signature — bool; фактический wrapper разобран отдельно. Маркер [return.success] в других записях означает описание успеха, а не буквальную возвращаемую строку.
Ошибки в исходных страницах почти не расписаны. Неправильный тип параметра, незакрытый блок, неизвестное имя, неподдержанный контекст или недостаток ресурсов могут остановить подготовку/растеризацию. Некорректная local URL может вызвать исключение setter уже до drawImage; malformed MVG или отказ renderer — на drawImage. При HTTP-отдаче PNG не выводите текст диагностики в бинарный ответ; завершите обработку ошибок до его отправки.
Полный сохранённый контракт PHP Manual
Все исходные поля сохранены без скрытого исправления: описание, параметры, return, ошибки, версии, примеры и их hashes, see-also, changelog. Опечатка opPattern в purpose pushPattern остаётся в snapshot; реальная парная команда — popPattern.
{
"id": "imagickdraw.setstrokepatternurl",
"name": "ImagickDraw::setStrokePatternURL",
"purpose_en": "Sets the pattern used for stroking object outlines",
"description_en": "Sets the pattern used for stroking object outlines.",
"signature": "ImagickDraw::setStrokePatternURL(string $stroke_url): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "stroke_url",
"type": "string",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "stroke URL"
}
],
"return_en": "Returns true on success.",
"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.setstrokepatternurl.php",
"official_page_sha256": "0dbbef0365033ee8d13ab25f3875bef0161d8932e5dd3afd012eed20de38f1db",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setstrokepatternurl.xml",
"xml_sha256": "4dc1314a6aa1711a225afbb33f97a4a00310cd4d7dbdcdc5ee33cf2381c41adf",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('stripes', 0, 0, 12, 12);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->rectangle(0, 0, 12, 12);
$draw->setFillColor('#c25732');
$draw->rectangle(0, 0, 6, 12);
$draw->popPattern();
$draw->popDefs();
$draw->setFillColor('none');
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(24);
$draw->setStrokePatternURL('#stripes');
$draw->line(30, 120, 290, 60);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/patterned-route.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'patterned-route.png', "\n";
$image->clear();
При успешном выполнении создаётся patterned-route.png 320×180. Наклонная широкая линия от (30,120) до (290,60) покрыта чередующимися оранжевыми и бирюзовыми участками двумерного узора. Толщина 24 создаёт достаточно места, чтобы видеть текстуру обводки. Внутренней заливки у line нет. Консоль — patterned-route.png.
Практическая задача: Сделать узорную рамку с обычной внутренней заливкой
У карточки должна быть предупреждающая рамка, но содержимое остаётся спокойным мятным. Узор обводки позволяет отделить эти задачи без поиска цвета границы flood-fill и без внешней картинки.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->pushDefs();
$draw->pushPattern('stripes', 0, 0, 12, 12);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->rectangle(0, 0, 12, 12);
$draw->setFillColor('#c25732');
$draw->rectangle(0, 0, 6, 12);
$draw->popPattern();
$draw->popDefs();
$draw->setFillColor('#bdebe2');
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(24);
$draw->setStrokePatternURL('#stripes');
$draw->rectangle(40, 40, 280, 160);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/patterned-warning-frame.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'patterned-warning-frame.png', "\n";
$image->clear();
Результат: patterned-warning-frame.png 320×200. Прямоугольная карточка с мятным центром и широкой полосатой оранжево-бирюзовой рамкой. Её осевая геометрия (40,40)—(280,160); stroke выходит по обе стороны границы, поэтому оставлены поля. Рисунок текстуры не поворачивается автоматически так, чтобы каждый мотив следовал направлению стороны. Консоль — patterned-warning-frame.png.
Ошибки, альтернативы и стоимость
Сначала задайте непрозрачный stroke, затем pattern URL; после stroke='none' не рассчитывайте, что ссылка сама восстановит видимость. Для тонкой линии сложный рисунок почти неразличим: уменьшите мотив либо увеличьте ширину с запасом по краям холста. Pattern stroke не означает, что каждый сегмент получает отдельный растянутый образец.
Большой образец требует дополнительных ресурсов, а его описание и растеризация — времени. При неизменном мотиве не создавайте огромную ячейку размером со всю страницу ради маленького периодического рисунка. Ограничивайте размеры и число команд внешнего макета. Не обещайте, что defs/pattern всегда быстрее обычного цикла: сравнивайте на нужной площади и установленном renderer. Для неповторяющейся фактуры подходит отдельное изображение/composite; для простой пунктирной линии — dash array; это другие задачи.
В расширенных примерах foreach обходит собственный список компонентов, . соединяет # и имя, isset проверяет наличие соответствия статуса, throw останавливает экспорт при нарушении контракта. См. массивы, условия и циклы, исключения.
Соседние API: ImagickDraw::pushDefs · ImagickDraw::popDefs · ImagickDraw::pushPattern · ImagickDraw::popPattern · ImagickDraw::setFillPatternURL. Повторение с локальной темой: обычные push/pop; штрих и пробел: dash array.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


