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

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

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

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

Глава 334 · После геометрии и clipping

ImagickDraw: повторяющиеся узоры, каталог defs и фактура обводки

Шесть API: ячейка → повторяющаяся заливка; размер, мотив и фаза, local #ID, штриховка области, pattern stroke и управление локальной темой.

Одна ячейка превращается в фон карточки

Карточке отчёта нужен узнаваемый точечный фон. Вместо десятков вручную размещённых кругов опишем маленькую ячейку и заполним ею большую область. Получится PNG 240×180: мятная панель с бирюзовыми точками, вокруг белые поля. Точки нужны не только для украшения: повторяющийся знак может отличать тип области на плане или серию данных.

Мотив circle(10,10,13,10) внутри ячейки 20×20 → повтор по двум осям → заполненная панель. Локальные параметры мотива и наблюдаемый растр повторения разделены
Мотив circle(10,10,13,10) внутри ячейки 20×20 → повтор по двум осям → заполненная панель. Локальные параметры мотива и наблюдаемый растр повторения разделены Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

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

Панель (20,20)—(220,160) с повторяющимися точками; исходный размер ячейки 20×20, белый фон сохраняется снаружи
Панель (20,20)—(220,160) с повторяющимися точками; исходный размер ячейки 20×20, белый фон сохраняется снаружи Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.
Заполнить карточку точками одной ячейкиПример для указанного окружения
<?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, очередь — в состоянии объекта.

Размер ячейки, положение мотива и фаза — разные настройки

Ячейки 20×20 и 40×40 содержат один и тот же локальный круг радиусом 3: меняется расстояние повторения, круг не увеличивается автоматически
Ячейки 20×20 и 40×40 содержат один и тот же локальный круг радиусом 3: меняется расстояние повторения, круг не увеличивается автоматически Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

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

Три панели текущего CLI: origin (0,0), origin (5,5) с тем же растром, затем явный сдвиг локального мотива с (10,10) на (15,15). Сравнение не выдаётся за доказательство native PHP
Три панели текущего CLI: origin (0,0), origin (5,5) с тем же растром, затем явный сдвиг локального мотива с (10,10) на (15,15). Сравнение не выдаётся за доказательство native PHP Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

Официальный 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.

Три парных блока и два вида локальной ссылки

defs содержит завершённый pattern dots; definitions без применения оставляют холст белым, после local URL и rectangle появляется панель
defs содержит завершённый pattern dots; definitions без применения оставляют холст белым, после local URL и rectangle появляется панель Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.
ПараНазначение
pushDefs → popDefsОграничивает каталог именованных элементов.
pushPattern → popPatternОграничивает команды одного образца и его размер.
push → popСохраняет/возвращает графический контекст при временной теме; не удаляет уже записанные фигуры.
Для pattern PHP получает '#dots' и создаёт MVG url(#dots); для clip из предыдущей главы PHP получает plain 'window'
Для pattern PHP получает '#dots' и создаёт MVG url(#dots); для clip из предыдущей главы PHP получает plain 'window' Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

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

Узор внутри области и узор широкой линии

Оранжевая диагональная штриховка находится только внутри четырёхугольной области; мятный фон и продолженные линии описаны в одной ячейке 12×12
Оранжевая диагональная штриховка находится только внутри четырёхугольной области; мятный фон и продолженные линии описаны в одной ячейке 12×12 Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.
Широкий наклонный маршрут покрыт повторяющимся двумерным образцом из оранжевых и бирюзовых полос; это текстура stroke, а не dash array
Широкий наклонный маршрут покрыт повторяющимся двумерным образцом из оранжевых и бирюзовых полос; это текстура stroke, а не dash array Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

Fill покрывает внутренность фигуры, stroke — полосу вдоль её границы или линии. У маршрута нет внутренней площади для заливки, зато ширина 24 делает текстуру видимой. Если нужны настоящие пробелы между штрихами вдоль пути, используйте dash array и dash offset. Текстура pattern ориентируется в системе рисунка; не обещаем автоматическое вращение каждого мотива по касательной к пути. Цвет, alpha и сглаживание разобраны в базовом стиле обводки.

Отчёт: общий фон, выделенная область и обычная легенда

На схеме нужен один общий точечный фон, поверх него — штриховка выделенной области, а в углу — читаемая светлая легенда. Каждый узор описан в собственном небольшом каталоге соответствующего Draw. Фон, выделенная область и обычное оформление записываются тремя независимыми Draw и последовательно наносятся на один $image. Так активная текстура первого слоя не переходит во второй или третий. Все исходные элементы создаются кодом, внешние картинки и шрифты не нужны. Смена переменной $draw на новый объект не очищает уже нанесённые пиксели $image. Бирюзовая полоса в белом блоке — условное обозначение, не текст.

PNG 400×240: мятная точечная панель (20,30)—(380,210), оранжевая штрихованная область, белый блок легенды и сплошная бирюзовая рамка
PNG 400×240: мятная точечная панель (20,30)—(380,210), оранжевая штрихованная область, белый блок легенды и сплошная бирюзовая рамка Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.
Собрать схему тремя независимыми слоями командПример для указанного окружения
<?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-запросами. Форма рисуется отдельно после выбора ресурса.

Открыть каталог именованных ресурсов: результат либо модель определения и применения
Открыть каталог именованных ресурсов: результат либо модель определения и применения Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

Синтаксис, параметры и результат

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; определения без использования не окрашивают холст.

Закончить каталог и перейти к рисунку: результат либо модель определения и применения
Закончить каталог и перейти к рисунку: результат либо модель определения и применения Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

Синтаксис, параметры и результат

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 задают содержимое. Это размеры, не координаты правого нижнего угла. Ячейка становится отдельным пространством рисунка; её содержимое и область будущей фигуры — разные геометрии.

Описать одну повторяемую ячейку: результат либо модель определения и применения
Описать одну повторяемую ячейку: результат либо модель определения и применения Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

Синтаксис, параметры и результат

ImagickDraw::pushPattern(string $pattern_id, float $x, float $y, float $width, float $height): bool
ПараметрЧто передать и зачем
$pattern_idstring, обязательный. Простое локальное имя dots без #. В PHP кавычки ограничивают строку; не вставляйте дополнительные символы двойных кавычек внутрь ID.
$x, $yfloat, обязательные координаты начала пространства pattern. Это не перенос конечной панели и не гарантированная команда фазового сдвига для всех MVG renderer; наблюдаемая граница текущего CLI объяснена ниже.
$width, $heightfloat, обязательные ширина и высота ячейки в единицах рисунка. Для этих воспроизводимых растровых образцов берём небольшие положительные целые 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 заканчивает активное определение и делает его доступным по имени. Он не заполняет большую панель автоматически и не возвращает прежний графический контекст. Содержимое образца, его применение и временная тема рисунка управляются тремя разными действиями.

Закончить ячейку, сохранив её имя: результат либо модель определения и применения
Закончить ячейку, сохранив её имя: результат либо модель определения и применения Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

Синтаксис, параметры и результат

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.

Заполнить внутренность фигуры узором: результат либо модель определения и применения
Заполнить внутренность фигуры узором: результат либо модель определения и применения Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

Синтаксис, параметры и результат

ImagickDraw::setFillPatternURL(string $fill_url): bool
ПараметрЧто передать и зачем
$fill_urlstring, обязательная локальная ссылка '#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: тот формирует штрихи и пробелы вдоль пути, а здесь используется текстура. Отдельные мотивы не обязаны автоматически вращаться по направлению кривой.

Покрыть узором толщину обводки: результат либо модель определения и применения
Покрыть узором толщину обводки: результат либо модель определения и применения Иллюстрация построена отдельно в ImageMagick CLI; подписи и связи являются учебной моделью. Это не выполнение PHP и не подтверждение его native return.

Синтаксис, параметры и результат

ImagickDraw::setStrokePatternURL(string $stroke_url): bool
ПараметрЧто передать и зачем
$stroke_urlstring, обязательная локальная ссылка '#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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.