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

Дерево руководства
Глава 330 · После первой фигуры
ImagickDraw: заливка цветом, непрозрачность и окна в контуре
Шесть get/set методов FillColor, FillOpacity, FillRule: от заполненной карточки до полупрозрачной рамки с настоящим окном; снимки цвета, направление обхода и читаемая легенда.
Заполнить карточку, выделить область, оставить окно
Нужна понятная картинка отчёта: карточка с цветом внутри, полупрозрачное выделение поверх сетки или рамка с незакрашенным окном. Начнём с обычного прямоугольника и разделим три вопроса: каким цветом заполнять, насколько непрозрачно и какую область считать внутренней.

Fill — внутренняя окраска фигуры, Stroke — её обводка. Края и фон здесь не меняются при выборе цвета заливки. Сначала Draw запоминает настройку и геометрию, затем drawImage наносит их на холст, writeImage сохраняет PNG. См. первую геометрию и настройки обводки.
Первый прямоугольник: внутренний цвет отдельно от края
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->rectangle(40, 35, 200, 145);
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/first-fill.png');
echo "first-fill.png\n";
Сохраните first.php и выполните php first.php. При успешной записи появится first-fill.png 240×180: мятный прямоугольник (40,35)—(200,145), бирюзовый край толщиной 4 и белое поле. Консоль: first-fill.png и перевод строки. Это короткое введение; ниже writeImage проверяется и ресурсы очищаются.
| Запись | Что происходит |
|---|---|
| new Imagick / newImage | Создаётся белый холст; ширина 240, высота 180 |
| new ImagickDraw | Создаётся объект команд; это ещё не готовое изображение |
| setStrokeColor / setStrokeWidth | Настраивается отдельный край |
| setFillColor / setFillOpacity | Выбираются мятная внутренность и её непрозрачность 1 |
| rectangle(40,35,200,145) | Координаты двух противоположных углов; x вправо, y вниз |
| drawImage / writeImage | Растеризация команд / сохранение файла |
$draw — переменная с объектом, -> вызывает его метод, параметры передаются в скобках, ; завершает инструкцию. __DIR__ — каталог скрипта. Настройка действует на следующие фигуры; поздний setFillColor не перекрасит ранее записанный rectangle. О классах подробнее — объект и метод.
Окно внутри фигуры: два подконтура одного пути
Чтобы через центр рамки была видна прежняя картинка, его нужно оставить непрокрашенным. Белый прямоугольник поверх рисунка скроет данные; два самостоятельных rectangle не дадут общего составного контура. Ниже внешний и внутренний обход записаны между одним pathStart и pathFinish, а EVENODD оставляет середину окном.

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillRule(Imagick::FILLRULE_EVENODD);
$draw->pathStart();
$draw->pathMoveToAbsolute(40, 20);
$draw->pathLineToAbsolute(200, 20);
$draw->pathLineToAbsolute(200, 160);
$draw->pathLineToAbsolute(40, 160);
$draw->pathClose();
$draw->pathMoveToAbsolute(80, 60);
$draw->pathLineToAbsolute(160, 60);
$draw->pathLineToAbsolute(160, 120);
$draw->pathLineToAbsolute(80, 120);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/first-window.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-window.png', "\n";
$draw->clear();
$image->clear();
При успешной записи first-window.png 240×180 содержит мятную рамку с бирюзовым краем и белым центром фона; консоль — first-window.png. Оба обхода идут по часовой стрелке в системе x вправо/y вниз. Ни одна команда не рисует белую заплатку. На белом холсте отверстие выглядит белым; в общем примере через него видна сетка.
| Команда | Роль в примере |
|---|---|
| pathStart | Начать один составной путь |
| pathMoveToAbsolute | Перейти к началу нового подконтура без рисующей перемычки |
| pathLineToAbsolute(x,y) | Записать ребро до указанной конечной точки |
| pathClose | Замкнуть текущий обход до его начала |
| pathFinish | Закончить весь путь; это не замена pathClose |
| FILLRULE_EVENODD | Исключить центр, который лежит внутри двух вложенных контуров |
Один подконтур — один непрерывный обход; новый move начинает следующий внутри того же пути. Подробное движение текущей точки разобрано в базовых path-командах.
Цвет заливки
FillColor выбирает цвет внутренней области будущей фигуры. StrokeColor выбирает её край, а фон холста создаётся отдельно. #bdebe2 — RGB: bd=189, eb=235, e2=226; это непрозрачный цвет. Сама установка свойства ещё не создаёт PNG.

Заливка 'none' и белая заливка различаются: первая оставляет прежний фон, вторая закрашивает его белым. В текущем ImageMagick setFillColor копирует также alpha цвета, а setFillOpacity затем назначает alpha заливки. Поэтому порядок имеет значение; не обещайте универсальное произведение rgba-alpha и opacity. В примерах сначала непрозрачный RGB, затем opacity.
Непрозрачность заливки
FillOpacity — число от 0 до 1: 0 не добавляет видимую заливку, 1 даёт непрозрачную, 0.5 частично смешивает цвет с фоном. Это свойство следующих операций рисования; оно не меняет alpha всего готового изображения и не делает отверстие в уже нарисованном слое.

Повторные полупрозрачные слои на одном месте накапливают видимость. Изменение заливки не равно прозрачности всей группы. Чтобы удалить существующий участок картинки, нужна работа с alpha/маской/композицией; белый прямоугольник или opacity 0 поверх него не являются стиранием.
Правило внутренней области
FillRule определяет внутреннюю область составного пути и самопересечений. EVENODD считает число пересечений воображаемого луча с границей: нечётное — внутри, чётное — снаружи. NONZERO учитывает направление пересечений: заполняется область с ненулевой суммой. Для двух вложенных прямоугольников одинаковый обход заполняет центр при nonzero, противоположный — оставляет окно; evenodd оставляет окно в обоих случаях.

Отверстие получается из нескольких подконтуров ОДНОГО pathStart…pathFinish. Два вызова rectangle рисуют две самостоятельные фигуры; внутренний белый rectangle скрывает фон вместо настоящего окна. Fill не удаляет прежние пиксели. Незамкнутый подконтур может неявно замыкаться для заливки; для предсказуемого контура здесь всегда есть pathClose, а pathFinish только завершает запись пути.
| Область двух вложенных контуров | EVENODD | NONZERO |
|---|---|---|
| Между внешним и внутренним | Одно пересечение: заполняется | Ненулевая сумма: заполняется |
| Центр, одинаковое направление | Два пересечения: окно | Сумма по направлению не равна 0: заполняется |
| Центр, противоположное направление | Два пересечения: окно | Вклад обходов компенсируется: окно |
Рамка выбора поверх сетки без белой заплатки
Сервис формирует картинку с областью выбора: наружная полоса выделена оранжевым, окно показывает исходную сетку, край остаётся чётким. Сначала рисуем сетку отдельным Draw, затем поверх — один составной путь. EVENODD выбирает область рамки, FillOpacity 0.35 даёт просвечивание её тела, StrokeOpacity 1 сохраняет непрозрачный край.

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(480, 320, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$grid = new ImagickDraw();
$grid->setStrokeColor('#d6e1df');
$grid->setStrokeWidth(1);
foreach (range(20, 460, 40) as $x) {
$grid->line($x, 20, $x, 300);
}
foreach (range(20, 300, 40) as $y) {
$grid->line(20, $y, 460, $y);
}
$image->drawImage($grid);
$grid->clear();
$draw->setFillColor('#c25732');
$draw->setFillOpacity(0.35);
$draw->setFillRule(Imagick::FILLRULE_EVENODD);
$draw->pathStart();
$draw->pathMoveToAbsolute(40, 30);
$draw->pathLineToAbsolute(440, 30);
$draw->pathLineToAbsolute(440, 290);
$draw->pathLineToAbsolute(40, 290);
$draw->pathClose();
$draw->pathMoveToAbsolute(90, 80);
$draw->pathLineToAbsolute(390, 80);
$draw->pathLineToAbsolute(390, 240);
$draw->pathLineToAbsolute(90, 240);
$draw->pathClose();
$draw->pathFinish();
echo 'fill-opacity=', number_format($draw->getFillOpacity(), 2, '.', ''),
'; rule=', $draw->getFillRule() === Imagick::FILLRULE_EVENODD ? 'evenodd' : 'other', "\n";
$image->drawImage($draw);
$path = __DIR__ . '/selection-panel.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'selection-panel.png', "\n";
$draw->clear();
$image->clear();
При успехе selection-panel.png 480×320 содержит сетку #d6e1df, оранжевую рамку #c25732 с opacity 0.35 и бирюзовый край толщиной 4. Наружный контур (40,30)—(440,290), внутренний (90,80)—(390,240); оба обхода по часовой стрелке. Центр остаётся прежней сеткой, а не перекрывается белой заливкой. Консоль: fill-opacity=0.35; rule=evenodd, затем selection-panel.png.
Упражнение: измените opacity с 0.35 на 0.7 — полоса станет плотнее, окно сохранится. Затем замените EVENODD на NONZERO без изменения обхода: центральная область тоже заполнится. Чтобы оставить окно при NONZERO, разверните только внутренний обход, как в практическом экспорте nonzero.
Выбрать правильный инструмент для следующего требования
- Нужна другая внутренняя окраска — FillColor; другой край — StrokeColor. Не пытайтесь регулировать их одним общим цветом.
- Нужно оставить старые пиксели видимыми — частичная FillOpacity или незаполняемая область compound path. Нужно удалить старые пиксели — отдельная операция alpha/маски, а не белая заплатка.
- Нужно перенести фигуру между evenodd и nonzero — проверяйте направления и геометрию. Простая смена константы может изменить отверстия; произвольные операции subtract/intersect не сводятся к одному fill rule.
- Для PNG в HTTP-ответе удалите диагностические echo и посторонний HTML. Каталог сохранения и имена файлов задавайте контролируемо; обрабатывайте отказ записи.
Эти шесть API расширяют оформление края и построение пути. Исторический setFillAlpha и pattern URL остаются отдельными узлами официального справочника. Весь ImagickDraw и PHP Manual этим блоком не объявляются завершёнными.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
ImagickDraw::getFillColorКомпонент получил цвет из темы. Нужно сделать от него вариант предупреждения и не изменить уже настроенный Draw случайной правкой полученного объекта.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getFillColor(): ImagickPixelКомпонент получил цвет из темы. Нужно сделать от него вариант предупреждения и не изменить уже настроенный Draw случайной правкой полученного объекта.
FillColor выбирает цвет внутренней области будущей фигуры. StrokeColor выбирает её край, а фон холста создаётся отдельно. #bdebe2 — RGB: bd=189, eb=235, e2=226; это непрозрачный цвет. Сама установка свойства ещё не создаёт PNG.
Синтаксис, вход и результат
ImagickDraw::getFillColor(): ImagickPixelАргументов нет: вызываем метод у того Draw, состояние которого хотим узнать. Возвращённое значение сохраняем через = в переменную. ImagickPixel — объект описания текущего цвета. PHP binding создаёт для getter новый PixelWand: это отдельный снимок. Чтобы применить изменённый снимок к Draw, вызовите setFillColor явно. getColor(0) читает ненормализованные RGB-каналы данного sRGB-примера; getter не возвращает готовый массив сам.
Доступность из официального контракта: PECL imagick 2, PECL imagick 3. Объявленных в этом snapshot изменений версии, удаления или deprecated-маркера у данного метода нет. PHP-программы используют современный синтаксис PHP 8.2+ и требуют расширение imagick.
Ошибки в snapshot отдельно не перечислены. Неподходящий тип может привести к TypeError, неверная цветовая запись — к ImagickDrawException; растеризация/файловая операция может завершиться ImagickException либо false. Проверяйте диапазон opacity и допустимые константы в своём коде: неизвестный int не обязан корректироваться или отвергаться одинаково разными версиями. Отсутствие расширения и недоступный каталог — отдельные от выбранного свойства отказы.
Полный сохранённый контракт PHP Manual
Ни одно исходное поле не заменено кратким пересказом: сохранены описание, параметры, return/failure, availability, changelog, примеры, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие ограничений в реализации.
{
"id": "imagickdraw.getfillcolor",
"name": "ImagickDraw::getFillColor",
"purpose_en": "Returns the fill color",
"description_en": "Returns the fill color used for drawing filled objects.",
"signature": "ImagickDraw::getFillColor(): ImagickPixel",
"modifiers": [
"public"
],
"return_type": "ImagickPixel",
"parameters": [],
"return_en": "Returns an ImagickPixel object.",
"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.getfillcolor.php",
"official_page_sha256": "a49dd7b4e1fed808e53435579aa96990f248cd9bafca9a5aba55e8ba472b5cae",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getfillcolor.xml",
"xml_sha256": "bca4f6d4a02ef6e773a2a5b8e164398f6b0a91595572cc81594df2e6a158f7ff",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$value = $draw->getFillColor();
$rgb = $value->getColor(0);
echo 'type=', get_debug_type($value), '; rgb=', $rgb['r'], ',', $rgb['g'], ',', $rgb['b'], "\n";
$value->clear();
$draw->rectangle(40, 35, 200, 145);
$image->drawImage($draw);
$path = __DIR__ . '/getfillcolor-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'getfillcolor-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся getfillcolor-basic.png 240×180. Прямоугольник (40,35)—(200,145) с мятной заливкой #bdebe2 и отдельной бирюзовой обводкой #146c74 толщиной 4 на белом фоне. Перед именем файла консоль: type=ImagickPixel; rgb=189,235,226. Последняя строка — getfillcolor-basic.png. Getter читает состояние Draw; он не вычисляет эти свойства из сохранённого PNG.
Практическая задача: Сделать вариант темы через отдельный снимок цвета
Тема задаёт мятный фон карточки. Получим его как ImagickPixel и поменяем снимок на цвет предупреждения: пока setter не вызван, первая карточка должна сохранить тему.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillColor('#bdebe2');
$variant = $draw->getFillColor();
$variant->setColor('#c25732');
$draw->rectangle(30, 25, 290, 75);
$draw->setFillColor($variant);
$draw->rectangle(30, 100, 290, 150);
$rgb = $variant->getColor(0);
echo 'variant-rgb=', $rgb['r'], ',', $rgb['g'], ',', $rgb['b'], "\n";
$variant->clear();
$image->drawImage($draw);
$path = __DIR__ . '/theme-variant.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'theme-variant.png', "\n";
$draw->clear();
$image->clear();
Результат: theme-variant.png 320×180. Верхняя карточка мятная, нижняя оранжевая, обе с бирюзовым краем. Правка отдельного ImagickPixel не изменила Draw; цвет нижней применён явным setFillColor. Снимок освобождён после передачи, когда он больше не нужен. Перед именем файла консоль: variant-rgb=194,87,50. Последняя строка — theme-variant.png.
Ошибки, альтернативы и стоимость
Заливка 'none' и белая заливка различаются: первая оставляет прежний фон, вторая закрашивает его белым. В текущем ImageMagick setFillColor копирует также alpha цвета, а setFillOpacity затем назначает alpha заливки. Поэтому порядок имеет значение; не обещайте универсальное произведение rgba-alpha и opacity. В примерах сначала непрозрачный RGB, затем opacity.
Чтение свойства и растеризация — разные действия. Getter не обязан обходить пиксели готового PNG; сохраните нужное значение один раз, если оно не меняется. Основную работу создают площадь холста, число и сложность контуров, смешивание слоёв и сохранение формата. Ограничивайте размеры и количество команд, измеряйте полное задание, кешируйте неизменный результат. Не выбирайте fill rule как универсальный способ ускорения: он должен соответствовать геометрии.
if выбирает действие по условию, foreach обходит элементы, throw сообщает об ошибке. Массивы точек и array_reverse переставляют порядок обхода, не создавая растровую маску. См. массивы, условия/циклы, исключения.
Связанная карточка: ImagickDraw::setFillColor. Далее цвет/opacity обводки, ImagickPixel и alpha, составные пути.
ImagickDraw::setFillColorКарточки статусов должны иметь согласованные цвета внутри и одинаковый читаемый край. Зададим палитру заливки отдельно от цвета обводки.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFillColor(ImagickPixel|string $fill_color): boolКарточки статусов должны иметь согласованные цвета внутри и одинаковый читаемый край. Зададим палитру заливки отдельно от цвета обводки.
FillColor выбирает цвет внутренней области будущей фигуры. StrokeColor выбирает её край, а фон холста создаётся отдельно. #bdebe2 — RGB: bd=189, eb=235, e2=226; это непрозрачный цвет. Сама установка свойства ещё не создаёт PNG.
Синтаксис, вход и результат
ImagickDraw::setFillColor(ImagickPixel|string $fill_color): bool| Параметр | Тип и смысл |
|---|---|
| $fill_color | ImagickPixel|string: объект цвета или поддерживаемая ImageMagick цветовая строка, например '#bdebe2'. 'none' отключает окраску внутренней области; это не команда стереть уже существующие пиксели. Для внешних имён статусов используйте разрешённую палитру. |
Возвращаемый тип по сигнатуре — bool. В сохранённой странице PHP Manual текст Return Values говорит об отсутствии результата; текущий PHP binding после установки возвращает true. Это расхождение документации и wrapper, а не PNG из setter. Для прикладной логики учитывайте исключения/отказ операции; результат картинки создаёт drawImage, файл — writeImage. Нативный запуск этих программ пока не подтверждён.
Доступность из официального контракта: PECL imagick 2, PECL imagick 3. Объявленных в этом snapshot изменений версии, удаления или deprecated-маркера у данного метода нет. PHP-программы используют современный синтаксис PHP 8.2+ и требуют расширение imagick.
Ошибки в snapshot отдельно не перечислены. Неподходящий тип может привести к TypeError, неверная цветовая запись — к ImagickDrawException; растеризация/файловая операция может завершиться ImagickException либо false. Проверяйте диапазон opacity и допустимые константы в своём коде: неизвестный int не обязан корректироваться или отвергаться одинаково разными версиями. Отсутствие расширения и недоступный каталог — отдельные от выбранного свойства отказы.
Полный сохранённый контракт PHP Manual
Ни одно исходное поле не заменено кратким пересказом: сохранены описание, параметры, return/failure, availability, changelog, примеры, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие ограничений в реализации.
{
"id": "imagickdraw.setfillcolor",
"name": "ImagickDraw::setFillColor",
"purpose_en": "Sets the fill color to be used for drawing filled objects",
"description_en": "Sets the fill color to be used for drawing filled objects.",
"signature": "ImagickDraw::setFillColor(ImagickPixel|string $fill_color): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "fill_color",
"type": "ImagickPixel|string",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "ImagickPixel to use to set the color"
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setFillColor",
"language": "php",
"code_sha256": "1780550c5db4239518d6244ee53777d9e6c49a6d6d0dc8422a3ff624bfac78d7"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setfillcolor.php",
"official_page_sha256": "352bc4956417c0c56ec3ff1cdebd9049b4a84505d1ab00aac24345f3971c8b8b",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setfillcolor.xml",
"xml_sha256": "601650bc7a44023bfeb19a2a286a19c3e00b85c9afa0ab20e51d5e470c75f448",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->rectangle(40, 35, 200, 145);
$image->drawImage($draw);
$path = __DIR__ . '/setfillcolor-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'setfillcolor-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся setfillcolor-basic.png 240×180. Прямоугольник (40,35)—(200,145) с мятной заливкой #bdebe2 и отдельной бирюзовой обводкой #146c74 толщиной 4 на белом фоне. Последняя строка — setfillcolor-basic.png. Getter читает состояние Draw; он не вычисляет эти свойства из сохранённого PNG.
Практическая задача: Карточки статусов с разрешённой палитрой
Входные данные содержат смысловые имена состояний. Цвет выбирается из словаря; одинаковый край не приходится переписывать для каждого состояния.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$palette = ['ready' => '#bdebe2', 'warning' => '#f1c6b7', 'offline' => '#c5cee8'];
foreach (['ready', 'warning', 'offline'] as $index => $state) {
if (!isset($palette[$state])) {
throw new InvalidArgumentException('Неизвестный статус');
}
$draw->setFillColor($palette[$state]);
$draw->rectangle(30, 20 + $index * 55, 290, 60 + $index * 55);
}
$image->drawImage($draw);
$path = __DIR__ . '/status-cards.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'status-cards.png', "\n";
$draw->clear();
$image->clear();
Результат: status-cards.png 320×200. Три заполненные карточки сверху вниз: мятная ready, персиковая warning, сиреневая offline. Бирюзовая обводка одинакова. Для настоящего интерфейса рядом нужны подписи/символы: цвет не должен быть единственным обозначением состояния. Последняя строка — status-cards.png.
Ошибки, альтернативы и стоимость
Заливка 'none' и белая заливка различаются: первая оставляет прежний фон, вторая закрашивает его белым. В текущем ImageMagick setFillColor копирует также alpha цвета, а setFillOpacity затем назначает alpha заливки. Поэтому порядок имеет значение; не обещайте универсальное произведение rgba-alpha и opacity. В примерах сначала непрозрачный RGB, затем opacity.
Чтение свойства и растеризация — разные действия. Getter не обязан обходить пиксели готового PNG; сохраните нужное значение один раз, если оно не меняется. Основную работу создают площадь холста, число и сложность контуров, смешивание слоёв и сохранение формата. Ограничивайте размеры и количество команд, измеряйте полное задание, кешируйте неизменный результат. Не выбирайте fill rule как универсальный способ ускорения: он должен соответствовать геометрии.
if выбирает действие по условию, foreach обходит элементы, throw сообщает об ошибке. Массивы точек и array_reverse переставляют порядок обхода, не создавая растровую маску. См. массивы, условия/циклы, исключения.
Связанная карточка: ImagickDraw::getFillColor. Далее цвет/opacity обводки, ImagickPixel и alpha, составные пути.
ImagickDraw::getFillOpacityОсновная область и её отдельная легенда должны иметь одинаковую непрозрачность. Прочитаем уже выбранное значение и передадим другому Draw, вместо второго независимого числа в коде.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getFillOpacity(): floatОсновная область и её отдельная легенда должны иметь одинаковую непрозрачность. Прочитаем уже выбранное значение и передадим другому Draw, вместо второго независимого числа в коде.
FillOpacity — число от 0 до 1: 0 не добавляет видимую заливку, 1 даёт непрозрачную, 0.5 частично смешивает цвет с фоном. Это свойство следующих операций рисования; оно не меняет alpha всего готового изображения и не делает отверстие в уже нарисованном слое.
Синтаксис, вход и результат
ImagickDraw::getFillOpacity(): floatАргументов нет: вызываем метод у того Draw, состояние которого хотим узнать. Возвращённое значение сохраняем через = в переменную. float с установленной opacity. Квантовая глубина ImageMagick может внести небольшое округление. Для журнала пример печатает два знака; не используйте точное ===0.5 как универсальную проверку результата getter.
Доступность из официального контракта: PECL imagick 2, PECL imagick 3. Объявленных в этом snapshot изменений версии, удаления или deprecated-маркера у данного метода нет. PHP-программы используют современный синтаксис PHP 8.2+ и требуют расширение imagick.
Ошибки в snapshot отдельно не перечислены. Неподходящий тип может привести к TypeError, неверная цветовая запись — к ImagickDrawException; растеризация/файловая операция может завершиться ImagickException либо false. Проверяйте диапазон opacity и допустимые константы в своём коде: неизвестный int не обязан корректироваться или отвергаться одинаково разными версиями. Отсутствие расширения и недоступный каталог — отдельные от выбранного свойства отказы.
Полный сохранённый контракт PHP Manual
Ни одно исходное поле не заменено кратким пересказом: сохранены описание, параметры, return/failure, availability, changelog, примеры, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие ограничений в реализации.
{
"id": "imagickdraw.getfillopacity",
"name": "ImagickDraw::getFillOpacity",
"purpose_en": "Returns the opacity used when drawing",
"description_en": "Returns the opacity used when drawing using the fill color or fill texture. Fully opaque is 1.0.",
"signature": "ImagickDraw::getFillOpacity(): float",
"modifiers": [
"public"
],
"return_type": "float",
"parameters": [],
"return_en": "The opacity.",
"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.getfillopacity.php",
"official_page_sha256": "ea2ba0ab9ad50fa1bb2ab2a2fe3cd5160f527b984cccd8fa545abc98cc417faa",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getfillopacity.xml",
"xml_sha256": "e929e5e3a692eb7df9383bb6e1e44f9441dd537bd1c3e5d4aeecaa22f7048291",
"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');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#dbe8e6');
$background->rectangle(120, 0, 239, 179);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillColor('#c25732');
$draw->setFillOpacity(0.5);
$value = $draw->getFillOpacity();
echo 'opacity=', number_format($value, 2, '.', ''), '; type=', get_debug_type($value), "\n";
$draw->rectangle(30, 35, 210, 145);
$image->drawImage($draw);
$path = __DIR__ . '/getfillopacity-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'getfillopacity-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся getfillopacity-basic.png 240×180. Оранжевый прямоугольник с opacity 0.5: его левая половина лежит на белом, правая — на #dbe8e6. Внутренние оттенки различаются, а бирюзовый край остаётся непрозрачным. Перед именем файла консоль: opacity=0.50; type=float. Последняя строка — getfillopacity-basic.png. Getter читает состояние Draw; он не вычисляет эти свойства из сохранённого PNG.
Практическая задача: Согласовать основную область и отдельную легенду
Первый Draw рисует полупрозрачную оранжевую область отчёта, второй — образец её легенды. Getter переносит значение opacity в другой компонент без дублирования настройки.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 195, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillColor('#c25732');
$draw->setFillOpacity(0.35);
$draw->rectangle(20, 20, 300, 110);
$opacity = $draw->getFillOpacity();
$legend = new ImagickDraw();
$legend->setStrokeColor('#146c74');
$legend->setStrokeWidth(4);
$legend->setFillColor('#c25732');
$legend->setFillOpacity($opacity);
$legend->rectangle(20, 135, 80, 170);
$image->drawImage($legend);
$legend->clear();
echo 'legend-opacity=', number_format($opacity, 2, '.', ''), "\n";
$image->drawImage($draw);
$path = __DIR__ . '/consistent-legend.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'consistent-legend.png', "\n";
$draw->clear();
$image->clear();
Результат: consistent-legend.png 320×195. Большая область сверху и небольшой образец слева снизу имеют один оттенок оранжевой заливки на белом фоне и непрозрачный бирюзовый край. Измените 0.35 на 0.65 в первом Draw — легенда получит новое значение через getter автоматически. Перед именем файла консоль: legend-opacity=0.35. Последняя строка — consistent-legend.png.
Ошибки, альтернативы и стоимость
Повторные полупрозрачные слои на одном месте накапливают видимость. Изменение заливки не равно прозрачности всей группы. Чтобы удалить существующий участок картинки, нужна работа с alpha/маской/композицией; белый прямоугольник или opacity 0 поверх него не являются стиранием.
Чтение свойства и растеризация — разные действия. Getter не обязан обходить пиксели готового PNG; сохраните нужное значение один раз, если оно не меняется. Основную работу создают площадь холста, число и сложность контуров, смешивание слоёв и сохранение формата. Ограничивайте размеры и количество команд, измеряйте полное задание, кешируйте неизменный результат. Не выбирайте fill rule как универсальный способ ускорения: он должен соответствовать геометрии.
if выбирает действие по условию, foreach обходит элементы, throw сообщает об ошибке. Массивы точек и array_reverse переставляют порядок обхода, не создавая растровую маску. См. массивы, условия/циклы, исключения.
Связанная карточка: ImagickDraw::setFillOpacity. Далее цвет/opacity обводки, ImagickPixel и alpha, составные пути.
ImagickDraw::setFillOpacityПоверх отчётной сетки нужно показать диапазон выбора, сохранив данные под ним. Полупрозрачной будет заливка, а читаемый край останется непрозрачным.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFillOpacity(float $opacity): boolПоверх отчётной сетки нужно показать диапазон выбора, сохранив данные под ним. Полупрозрачной будет заливка, а читаемый край останется непрозрачным.
FillOpacity — число от 0 до 1: 0 не добавляет видимую заливку, 1 даёт непрозрачную, 0.5 частично смешивает цвет с фоном. Это свойство следующих операций рисования; оно не меняет alpha всего готового изображения и не делает отверстие в уже нарисованном слое.
Синтаксис, вход и результат
ImagickDraw::setFillOpacity(float $opacity): bool| Параметр | Тип и смысл |
|---|---|
| $opacity | float opacity, прикладной диапазон 0..1. Проверяйте конечность числа и границы; 50 не означает 50 процентов. Шкала GD 0..127 сюда не переносится. StrokeOpacity управляет краем отдельно. |
Возвращаемый тип по сигнатуре — bool. В сохранённой странице PHP Manual текст Return Values говорит об отсутствии результата; текущий PHP binding после установки возвращает true. Это расхождение документации и wrapper, а не PNG из setter. Для прикладной логики учитывайте исключения/отказ операции; результат картинки создаёт drawImage, файл — writeImage. Нативный запуск этих программ пока не подтверждён.
Доступность из официального контракта: PECL imagick 2, PECL imagick 3. Объявленных в этом snapshot изменений версии, удаления или deprecated-маркера у данного метода нет. PHP-программы используют современный синтаксис PHP 8.2+ и требуют расширение imagick.
Ошибки в snapshot отдельно не перечислены. Неподходящий тип может привести к TypeError, неверная цветовая запись — к ImagickDrawException; растеризация/файловая операция может завершиться ImagickException либо false. Проверяйте диапазон opacity и допустимые константы в своём коде: неизвестный int не обязан корректироваться или отвергаться одинаково разными версиями. Отсутствие расширения и недоступный каталог — отдельные от выбранного свойства отказы.
Полный сохранённый контракт PHP Manual
Ни одно исходное поле не заменено кратким пересказом: сохранены описание, параметры, return/failure, availability, changelog, примеры, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие ограничений в реализации.
{
"id": "imagickdraw.setfillopacity",
"name": "ImagickDraw::setFillOpacity",
"purpose_en": "Sets the opacity to use when drawing using the fill color or fill texture",
"description_en": "Sets the opacity to use when drawing using the fill color or fill texture. Fully opaque is 1.0.",
"signature": "ImagickDraw::setFillOpacity(float $opacity): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "opacity",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "the fill opacity"
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setFillOpacity",
"language": "php",
"code_sha256": "edae928a02a24fccbfdab89dc40d712ad4daee2b38aabb112a35da179a809c24"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setfillopacity.php",
"official_page_sha256": "ab77d4e5101c9eaecf79dfc81c3ca56edb5b485cabedc595cf2e7b24fff2460c",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setfillopacity.xml",
"xml_sha256": "f7a81f3e6efaa2a65d97aa4d01d6f480a29d2a612a989df397c0429dcfc74d44",
"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');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#dbe8e6');
$background->rectangle(120, 0, 239, 179);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillColor('#c25732');
$draw->setFillOpacity(0.5);
$draw->rectangle(30, 35, 210, 145);
$image->drawImage($draw);
$path = __DIR__ . '/setfillopacity-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'setfillopacity-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся setfillopacity-basic.png 240×180. Оранжевый прямоугольник с opacity 0.5: его левая половина лежит на белом, правая — на #dbe8e6. Внутренние оттенки различаются, а бирюзовый край остаётся непрозрачным. Последняя строка — setfillopacity-basic.png. Getter читает состояние Draw; он не вычисляет эти свойства из сохранённого PNG.
Практическая задача: Подсветить диапазон, оставив сетку видимой
На отчёте нужно выделить прямоугольную область. Сначала нанесём сетку, затем полупрозрачное заполнение; край выделения остаётся непрозрачным.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(320, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$grid = new ImagickDraw();
$grid->setStrokeColor('#d6e1df');
$grid->setStrokeWidth(1);
foreach ([40, 80, 120, 160] as $y) {
$grid->line(15, $y, 305, $y);
}
$image->drawImage($grid);
$grid->clear();
$opacity = 0.35;
if (!is_finite($opacity) || $opacity < 0 || $opacity > 1) {
throw new InvalidArgumentException('Opacity должна быть от 0 до 1');
}
$draw->setFillColor('#c25732');
$draw->setFillOpacity($opacity);
$draw->rectangle(40, 30, 280, 170);
$image->drawImage($draw);
$path = __DIR__ . '/range-highlight.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'range-highlight.png', "\n";
$draw->clear();
$image->clear();
Результат: range-highlight.png 320×200. Оранжевая полупрозрачная область (40,30)—(280,170) лежит поверх четырёх горизонталей. Сетка видна внутри, бирюзовый край не стал прозрачным. Это смешивание нового слоя, а не изменение старых пикселей сетки или прозрачности всего PNG. Последняя строка — range-highlight.png.
Ошибки, альтернативы и стоимость
Повторные полупрозрачные слои на одном месте накапливают видимость. Изменение заливки не равно прозрачности всей группы. Чтобы удалить существующий участок картинки, нужна работа с alpha/маской/композицией; белый прямоугольник или opacity 0 поверх него не являются стиранием.
Чтение свойства и растеризация — разные действия. Getter не обязан обходить пиксели готового PNG; сохраните нужное значение один раз, если оно не меняется. Основную работу создают площадь холста, число и сложность контуров, смешивание слоёв и сохранение формата. Ограничивайте размеры и количество команд, измеряйте полное задание, кешируйте неизменный результат. Не выбирайте fill rule как универсальный способ ускорения: он должен соответствовать геометрии.
if выбирает действие по условию, foreach обходит элементы, throw сообщает об ошибке. Массивы точек и array_reverse переставляют порядок обхода, не создавая растровую маску. См. массивы, условия/циклы, исключения.
Связанная карточка: ImagickDraw::getFillOpacity. Далее цвет/opacity обводки, ImagickPixel и alpha, составные пути.
ImagickDraw::getFillRuleТема уже содержит правило заливки. Перед созданием рамки с окном нужно проверить его и применить договорённое правило экспортируемой схемы, а не надеяться на значение по умолчанию.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getFillRule(): intТема уже содержит правило заливки. Перед созданием рамки с окном нужно проверить его и применить договорённое правило экспортируемой схемы, а не надеяться на значение по умолчанию.
FillRule определяет внутреннюю область составного пути и самопересечений. EVENODD считает число пересечений воображаемого луча с границей: нечётное — внутри, чётное — снаружи. NONZERO учитывает направление пересечений: заполняется область с ненулевой суммой. Для двух вложенных прямоугольников одинаковый обход заполняет центр при nonzero, противоположный — оставляет окно; evenodd оставляет окно в обоих случаях.
Синтаксис, вход и результат
ImagickDraw::getFillRule(): intАргументов нет: вызываем метод у того Draw, состояние которого хотим узнать. Возвращённое значение сохраняем через = в переменную. int — значение константы FILLRULE. Сравнивайте его с именованной константой через ===, а не сохраняйте магическое число. Getter читает текущее правило Draw: он не анализирует направление сегментов и не преобразует evenodd-путь в nonzero автоматически.
Доступность из официального контракта: PECL imagick 2, PECL imagick 3. Объявленных в этом snapshot изменений версии, удаления или deprecated-маркера у данного метода нет. PHP-программы используют современный синтаксис PHP 8.2+ и требуют расширение imagick.
Ошибки в snapshot отдельно не перечислены. Неподходящий тип может привести к TypeError, неверная цветовая запись — к ImagickDrawException; растеризация/файловая операция может завершиться ImagickException либо false. Проверяйте диапазон opacity и допустимые константы в своём коде: неизвестный int не обязан корректироваться или отвергаться одинаково разными версиями. Отсутствие расширения и недоступный каталог — отдельные от выбранного свойства отказы.
Полный сохранённый контракт PHP Manual
Ни одно исходное поле не заменено кратким пересказом: сохранены описание, параметры, return/failure, availability, changelog, примеры, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие ограничений в реализации.
{
"id": "imagickdraw.getfillrule",
"name": "ImagickDraw::getFillRule",
"purpose_en": "Returns the fill rule",
"description_en": "Returns the fill rule used while drawing polygons.",
"signature": "ImagickDraw::getFillRule(): int",
"modifiers": [
"public"
],
"return_type": "int",
"parameters": [],
"return_en": "Returns a FILLRULE constant ( imagick::FILLRULE_* ).",
"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.getfillrule.php",
"official_page_sha256": "bd172306a08c019af461807419796d0b2041c94f663b7fddfc153a3da8f42660",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getfillrule.xml",
"xml_sha256": "2e228b446dc3b21a63bc6dab0b74b70562142e92e0d84ac5a50fae48603a3c63",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillRule(Imagick::FILLRULE_EVENODD);
$value = $draw->getFillRule();
echo 'rule=', $value === Imagick::FILLRULE_EVENODD ? 'evenodd' : 'other', '; type=', get_debug_type($value), "\n";
$draw->pathStart();
$draw->pathMoveToAbsolute(40, 20);
$draw->pathLineToAbsolute(200, 20);
$draw->pathLineToAbsolute(200, 160);
$draw->pathLineToAbsolute(40, 160);
$draw->pathClose();
$draw->pathMoveToAbsolute(80, 60);
$draw->pathLineToAbsolute(160, 60);
$draw->pathLineToAbsolute(160, 120);
$draw->pathLineToAbsolute(80, 120);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/getfillrule-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'getfillrule-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся getfillrule-basic.png 240×180. Мятная прямоугольная рамка: наружный контур (40,20)—(200,160), внутренний (80,60)—(160,120). Центр остаётся белым фоном, поскольку evenodd исключает область внутри двух вложенных контуров одного пути. Перед именем файла консоль: rule=evenodd; type=int. Последняя строка — getfillrule-basic.png. Getter читает состояние Draw; он не вычисляет эти свойства из сохранённого PNG.
Практическая задача: Проверить политику темы перед экспортом рамки
Тема предназначалась для сплошных фигур и использует nonzero. Наш экспорт требует окна при одинаковом направлении вложенных контуров. Прочитаем настройку и изменим её только при несовпадении с этой политикой.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillRule(Imagick::FILLRULE_NONZERO);
$before = $draw->getFillRule();
if ($before !== Imagick::FILLRULE_EVENODD) {
$draw->setFillRule(Imagick::FILLRULE_EVENODD);
}
echo 'before=', $before === Imagick::FILLRULE_NONZERO ? 'nonzero' : 'other', '; after=',
$draw->getFillRule() === Imagick::FILLRULE_EVENODD ? 'evenodd' : 'other', "\n";
$draw->pathStart();
$draw->pathMoveToAbsolute(40, 20);
$draw->pathLineToAbsolute(200, 20);
$draw->pathLineToAbsolute(200, 160);
$draw->pathLineToAbsolute(40, 160);
$draw->pathClose();
$draw->pathMoveToAbsolute(80, 60);
$draw->pathLineToAbsolute(160, 60);
$draw->pathLineToAbsolute(160, 120);
$draw->pathLineToAbsolute(80, 120);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/checked-window.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'checked-window.png', "\n";
$draw->clear();
$image->clear();
Результат: checked-window.png 240×180. Рамка с мятным телом и непрокрашенным центральным окном. Решение принято по прочитанной настройке, а не по магическому номеру константы. Если компонент уже получил evenodd, условие не назначит его повторно; это политика этого компонента, не универсальное исправление любых импортированных SVG. Перед именем файла консоль: before=nonzero; after=evenodd. Последняя строка — checked-window.png.

Ошибки, альтернативы и стоимость
Отверстие получается из нескольких подконтуров ОДНОГО pathStart…pathFinish. Два вызова rectangle рисуют две самостоятельные фигуры; внутренний белый rectangle скрывает фон вместо настоящего окна. Fill не удаляет прежние пиксели. Незамкнутый подконтур может неявно замыкаться для заливки; для предсказуемого контура здесь всегда есть pathClose, а pathFinish только завершает запись пути.
Чтение свойства и растеризация — разные действия. Getter не обязан обходить пиксели готового PNG; сохраните нужное значение один раз, если оно не меняется. Основную работу создают площадь холста, число и сложность контуров, смешивание слоёв и сохранение формата. Ограничивайте размеры и количество команд, измеряйте полное задание, кешируйте неизменный результат. Не выбирайте fill rule как универсальный способ ускорения: он должен соответствовать геометрии.
if выбирает действие по условию, foreach обходит элементы, throw сообщает об ошибке. Массивы точек и array_reverse переставляют порядок обхода, не создавая растровую маску. См. массивы, условия/циклы, исключения.
Связанная карточка: ImagickDraw::setFillRule. Далее цвет/opacity обводки, ImagickPixel и alpha, составные пути.
ImagickDraw::setFillRuleДля рамки, значка или области с вырезом требуется определить, где у составного контура находится внутренняя область. Два отдельных rectangle не образуют одно правило вложенности.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFillRule(int $fillrule): boolДля рамки, значка или области с вырезом требуется определить, где у составного контура находится внутренняя область. Два отдельных rectangle не образуют одно правило вложенности.
FillRule определяет внутреннюю область составного пути и самопересечений. EVENODD считает число пересечений воображаемого луча с границей: нечётное — внутри, чётное — снаружи. NONZERO учитывает направление пересечений: заполняется область с ненулевой суммой. Для двух вложенных прямоугольников одинаковый обход заполняет центр при nonzero, противоположный — оставляет окно; evenodd оставляет окно в обоих случаях.
Синтаксис, вход и результат
ImagickDraw::setFillRule(int $fillrule): bool| Параметр | Тип и смысл |
|---|---|
| $fillrule | int fillrule: Imagick::FILLRULE_EVENODD или Imagick::FILLRULE_NONZERO. Это именованные константы, а не строки 'evenodd'/'nonzero'. Не используйте неизвестные целые и FILLRULE_UNDEFINED как прикладную политику; проверяйте разрешённые значения явно. |
Возвращаемый тип по сигнатуре — bool. В сохранённой странице PHP Manual текст Return Values говорит об отсутствии результата; текущий PHP binding после установки возвращает true. Это расхождение документации и wrapper, а не PNG из setter. Для прикладной логики учитывайте исключения/отказ операции; результат картинки создаёт drawImage, файл — writeImage. Нативный запуск этих программ пока не подтверждён.
Доступность из официального контракта: PECL imagick 2, PECL imagick 3. Объявленных в этом snapshot изменений версии, удаления или deprecated-маркера у данного метода нет. PHP-программы используют современный синтаксис PHP 8.2+ и требуют расширение imagick.
Ошибки в snapshot отдельно не перечислены. Неподходящий тип может привести к TypeError, неверная цветовая запись — к ImagickDrawException; растеризация/файловая операция может завершиться ImagickException либо false. Проверяйте диапазон opacity и допустимые константы в своём коде: неизвестный int не обязан корректироваться или отвергаться одинаково разными версиями. Отсутствие расширения и недоступный каталог — отдельные от выбранного свойства отказы.
Полный сохранённый контракт PHP Manual
Ни одно исходное поле не заменено кратким пересказом: сохранены описание, параметры, return/failure, availability, changelog, примеры, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие ограничений в реализации.
{
"id": "imagickdraw.setfillrule",
"name": "ImagickDraw::setFillRule",
"purpose_en": "Sets the fill rule to use while drawing polygons",
"description_en": "Sets the fill rule to use while drawing polygons.",
"signature": "ImagickDraw::setFillRule(int $fillrule): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "fillrule",
"type": "int",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "One of the FILLRULE constant ( imagick::FILLRULE_* )."
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setFillRule example",
"language": "php",
"code_sha256": "632aa3871262b2ee885b437e49fce0aa666ea61d028b0bb47dc13193fb9e1c7c"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setfillrule.php",
"official_page_sha256": "cf73a59e7b3553d022cb92b76d2cad45ec3ece494e84bdaf70296befa73234ac",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setfillrule.xml",
"xml_sha256": "e3eb568deb235ff1514d45b8865ebc600e6cff60911656f2ffe4e6294729aaf5",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillRule(Imagick::FILLRULE_EVENODD);
$draw->pathStart();
$draw->pathMoveToAbsolute(40, 20);
$draw->pathLineToAbsolute(200, 20);
$draw->pathLineToAbsolute(200, 160);
$draw->pathLineToAbsolute(40, 160);
$draw->pathClose();
$draw->pathMoveToAbsolute(80, 60);
$draw->pathLineToAbsolute(160, 60);
$draw->pathLineToAbsolute(160, 120);
$draw->pathLineToAbsolute(80, 120);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/setfillrule-basic.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'setfillrule-basic.png', "\n";
$draw->clear();
$image->clear();
При успешном выполнении создаётся setfillrule-basic.png 240×180. Мятная прямоугольная рамка: наружный контур (40,20)—(200,160), внутренний (80,60)—(160,120). Центр остаётся белым фоном, поскольку evenodd исключает область внутри двух вложенных контуров одного пути. Последняя строка — setfillrule-basic.png. Getter читает состояние Draw; он не вычисляет эти свойства из сохранённого PNG.
Практическая задача: Сохранить окно при экспорте с правилом nonzero
Принимающий компонент использует nonzero. Вместо слепой замены константы подготовим вложенный контур с противоположным направлением; геометрическое окно должно остаться тем же.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setStrokeOpacity(1);
$draw->setFillColor('#bdebe2');
$draw->setFillOpacity(1);
$draw->setFillRule(Imagick::FILLRULE_NONZERO);
$outer = [[40, 20], [200, 20], [200, 160], [40, 160]];
$inner = [[80, 60], [160, 60], [160, 120], [80, 120]];
$contours = [$outer, array_reverse($inner)];
$draw->pathStart();
foreach ($contours as $points) {
$first = array_shift($points);
$draw->pathMoveToAbsolute($first[0], $first[1]);
foreach ($points as [$x, $y]) {
$draw->pathLineToAbsolute($x, $y);
}
$draw->pathClose();
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/nonzero-window.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'nonzero-window.png', "\n";
$draw->clear();
$image->clear();
Результат: nonzero-window.png 240×180. Та же мятная рамка с окном, теперь NONZERO. array_reverse разворачивает внутренний обход; внешний остаётся прежним. Если убрать разворот, центр закрасится. Это решение для двух простых вложенных контуров: произвольные самопересечения и булевы операции фигур требуют отдельного геометрического разбора. Последняя строка — nonzero-window.png.

Ошибки, альтернативы и стоимость
Отверстие получается из нескольких подконтуров ОДНОГО pathStart…pathFinish. Два вызова rectangle рисуют две самостоятельные фигуры; внутренний белый rectangle скрывает фон вместо настоящего окна. Fill не удаляет прежние пиксели. Незамкнутый подконтур может неявно замыкаться для заливки; для предсказуемого контура здесь всегда есть pathClose, а pathFinish только завершает запись пути.
Чтение свойства и растеризация — разные действия. Getter не обязан обходить пиксели готового PNG; сохраните нужное значение один раз, если оно не меняется. Основную работу создают площадь холста, число и сложность контуров, смешивание слоёв и сохранение формата. Ограничивайте размеры и количество команд, измеряйте полное задание, кешируйте неизменный результат. Не выбирайте fill rule как универсальный способ ускорения: он должен соответствовать геометрии.
if выбирает действие по условию, foreach обходит элементы, throw сообщает об ошибке. Массивы точек и array_reverse переставляют порядок обхода, не создавая растровую маску. См. массивы, условия/циклы, исключения.
Связанная карточка: ImagickDraw::getFillRule. Далее цвет/opacity обводки, ImagickPixel и alpha, составные пути.
Источники и обсуждения
- ImagickDraw::getFillColor
- ImagickDraw::getFillOpacity
- ImagickDraw::getFillRule
- ImagickDraw::setFillColor
- ImagickDraw::setFillOpacity
- ImagickDraw::setFillRule
- SVG fill color/opacity and winding rules
- ImageMagick MVG fill properties
- PHP Imagick Draw binding and PixelWand snapshots
- ImageMagick fill color/opacity state order
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


