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

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

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

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

Глава 325 · От первого PNG к практике

ImagickDraw: линии, круги, кривые и области с видимыми результатами

Десять геометрических методов: от первой линии до схемы доставки, с координатами, PNG-иллюстрациями, параметрами и практическими сценариями.

Из команды рисования — в открываемый PNG

Нужно отправить в Telegram или приложить к отчёту схему: путь курьера, выделенную область, график или панель прогресса. Здесь разберём десять геометрических методов. Сначала получим короткий работающий рисунок, затем раскроем координаты и только после этого — массивы точек и несколько фигур на одном холсте.

Первый видимый результат — отрезок на белом холсте
Первый видимый результат — отрезок на белом холсте Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Кто что делает
  1. new Imagick(): создаём пустой объект изображения
  2. newImage(240,160,'white'): выделяем холст
  3. ImagickDraw: записываем настройки и геометрию
  4. drawImage($draw): применяем команды к холсту
  5. writeImage(...png): сохраняем результат; echo сообщает имя файла

$image — имя переменной с изображением, $draw — с набором команд. new создаёт объект; -> обращается к его методу; скобки передают аргументы; точка с запятой завершает инструкцию. Если это первое знакомство с объектами, есть разбор класса и объекта. Сам метод line объясняем здесь: два числа начала, затем два числа конца.

Первый запуск: одна линия, один файл

Сохранить первый отрезокПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->line(25, 125, 215, 35);
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/first-line.png');
echo "first-line.png\n";

Сохраните код в first.php и выполните php first.php. При успешной записи рядом появится first-line.png 240×160: бирюзовый отрезок толщиной 3 от (25,125) к (215,35), как на иллюстрации выше. В консоли будет first-line.png и перевод строки. В этом коротком введении отказ записи не обработан; в карточках ниже writeImage проверяется. Не запускайте из каталога, где нет права записи.

ЗаписьЧто изменилось
newImage(240,160,'white')Ширина 240, высота 160, все пиксели сначала белые
setStrokeColor / setStrokeWidthЦвет и толщина будущей обводки
setFillColor('none')Внутренняя заливка отключена
line(25,125,215,35)Команда отрезка, пока ещё не файл
drawImage($draw)Рисунок появляется на изображении в памяти
__DIR__ . '/first-line.png'Точка склеивает каталог текущего PHP-файла и имя результата; это не URL
echoТолько сообщает имя; само изображение записывает writeImage

Координаты, обводка и заливка — до сложных фигур

Представьте лист в клетку, но начало координат находится в левом верхнем углу. x растёт вправо, y — вниз. На холсте 240×160 целые адреса пикселей идут x=0..239, y=0..159. Геометрическая точка может быть дробной: растеризатор распределит цвет по соседям при сглаживании. Модель листа объясняет адреса, но не устройство памяти Imagick.

ПонятиеНа нашем рисункеЧего не перепутать
Точка(35,35)Сначала x, потом y
Два угла(35,35) и (205,125)205 и 125 — координаты, а не размеры
Обводка strokeБирюзовый край толщиной 3Часть толщины лежит снаружи математической границы
Заливка fillМятный цвет внутриДля открытых путей задавайте none
РадиусОт центра до краяДиаметр вдвое больше
Угол0° справа, 90° вниз, 180° слева, 270° вверхВ этих вызовах градусы, не радианы
От линии — к заполненной панелиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$draw->rectangle(35, 35, 205, 125);
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/first-panel.png');
echo "first-panel.png\n";

При успехе first-panel.png содержит мятную прямоугольную панель с бирюзовым краем, консоль: first-panel.png. Изменился вызов line на rectangle и появился цвет fill. Это подложка для будущей карточки отчёта, не HTML-элемент.

Панель: верхний левый угол (35,35), нижний правый (205,125)
Панель: верхний левый угол (35,35), нижний правый (205,125) Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.

После примера можно освобождать крупные объекты методом clear. В коротком скрипте память освободится при завершении, но в очереди с тысячами заданий явное освобождение полезно. Ниже if проверяет успешность записи, ! означает «не», throw сообщает ошибку вызывающему коду; подробнее — ошибки и исключения.

Как выбрать фигуру и прочитать массив точек

ПотребностьИнструмент
Один прямой отрезокImagickDraw::line
Измеренный маршрут или графикImagickDraw::polyline
Плавное дизайнерское соединениеImagickDraw::bezier
Область с несколькими угламиImagickDraw::polygon
Панель с прямыми / скруглёнными угламиImagickDraw::rectangle / ImagickDraw::roundRectangle
Круг, овал, часть овалаImagickDraw::circle, ImagickDraw::ellipse, ImagickDraw::arc
Единичная растровая позицияImagickDraw::point

В ['x' => 20, 'y' => 130] ключ x подписывает горизонтальную координату, ключ y — вертикальную. Внешние квадратные скобки собирают список таких точек по порядку. Стрелка => связывает ключ со значением, запятая отделяет элементы. Это обычный многомерный массив, до JSON. В практических примерах foreach последовательно берёт элементы списка; $index хранит номер, начиная с нуля. Есть простое объяснение циклов. В точках, полученных из запроса, проверяйте наличие x/y, числовой тип и согласованный диапазон; не подставляйте пользовательский текст в MVG или команды оболочки.

Дуга: показать часть пути или шкалы

Нужно изобразить выполненную часть проверки, оставив незавершённую часть незакрашенной.

Четыре координаты задают рамку эллипса; два угла выбирают его участок. Здесь верхняя дуга идёт от левой точки рамки к направлению 330°.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Кривая Безье: плавно соединить две точки

На схеме доставки прямой отрезок перекрывает другую подпись; соединение нужно отвести вверх.

В этом примере четыре точки: первая и последняя лежат на кривой, две средние управляют изгибом. Кривая обычно не проходит через управляющие точки.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Окружность и круг: центр и точка на краю

Нужна круглая метка выбранного склада на схеме, а не готовая картинка из файла.

(120,80) — центр. (170,80) — точка на окружности справа от центра, поэтому радиус равен 50. Последние два аргумента — координаты точки, а не ширина и высота.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Эллипс: выделить вытянутый объект

На превью оборудования нужно выделить широкую группу деталей овалом.

Центр (120,80), горизонтальный радиус 85 и вертикальный радиус 40 дают габарит 170×80 до учёта обводки. 0 и 360 выбирают полный овал.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Отрезок: соединить значения или разделить блоки

Нужно соединить две измеренные позиции на небольшом отчётном изображении.

(25,125) — начало, (215,35) — конец. Поскольку y растёт вниз, отрезок направлен вправо и вверх. Толщину и цвет задают перед вызовом.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Точка: сохранить единичное наблюдение

Есть сетка измерений: одну ячейку нужно пометить точным цветом без радиуса и окружности.

point(60,60) адресует позицию на холсте 120×120. В примере fill и stroke намеренно одинаковы; для метки большого размера используется circle, а не предположение о толщине point.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Многоугольник: показать область

На схеме магазина нужно закрасить обслуживаемую зону произвольной формы.

Массив хранит четыре вершины по порядку обхода. Каждая вершина — вложенный массив с ключами x и y. Последняя автоматически соединяется с первой.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Ломаная: показать путь через измеренные точки

Курьер прислал последовательность позиций; нужно соединить их в том же порядке.

Здесь четыре вершины и три отрезка. В отличие от polygon, обводка не замыкает путь последним отрезком. fill='none' предотвращает нежелательную заливку между началом и концом.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Прямоугольник: рамка, фон и закрытая область

Нужна прямоугольная подложка под блок на автоматически собранном PNG.

Первая точка (35,35) — верхний левый угол, вторая (205,125) — нижний правый. Это координаты двух углов, не x,y,width,height.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Скруглённый прямоугольник: карточка или кнопка в PNG

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

Первые четыре аргумента задают углы рамки. 18 и 18 — радиусы горизонтального и вертикального скругления, а не размеры всей карточки.

Открыть параметры, два самостоятельных примера, ожидаемые результаты и ограничения

Собрать схему доставки из нескольких изученных фигур

Когда отдельные вызовы понятны, они складываются в небольшую схему. Слева мятная зона доставки, поверх неё оранжевый маршрут и круглая отметка склада. Справа — условное плавное соединение двух точек и овальная площадка. Географическая проекция, расчёт маршрута и подписи здесь не реализованы: учимся объединять уже известные команды, а не выдаём рисунок за картографическую систему.

Зона, маршрут, склад и плавное соединение на одном PNG 600×360
Зона, маршрут, склад и плавное соединение на одном PNG 600×360 Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Сохранить составную схему для отчётаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(600, 360, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setStrokeColor('#d1e3e4');
$draw->setStrokeWidth(2);
$draw->setFillColor('#f3f8f8');
$draw->roundRectangle(18, 18, 582, 342, 18, 18);
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$draw->polygon([
    ['x' => 50, 'y' => 270], ['x' => 90, 'y' => 70],
    ['x' => 250, 'y' => 45], ['x' => 285, 'y' => 270],
]);
$draw->setFillColor('none');
$draw->setStrokeColor('#c25732');
$draw->setStrokeWidth(5);
$draw->polyline([
    ['x' => 70, 'y' => 235], ['x' => 120, 'y' => 130],
    ['x' => 180, 'y' => 180], ['x' => 240, 'y' => 95],
]);
$draw->setFillColor('#146c74');
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(1);
$draw->circle(120, 130, 129, 130);
$draw->setFillColor('none');
$draw->setStrokeWidth(3);
$draw->bezier([
    ['x' => 325, 'y' => 260], ['x' => 350, 'y' => 70],
    ['x' => 490, 'y' => 70], ['x' => 540, 'y' => 260],
]);
$draw->setFillColor('#bdebe2');
$draw->ellipse(435, 280, 85, 18, 0, 360);
$image->drawImage($draw);
$path = __DIR__ . '/service-map.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'service-map.png', "\n";
$draw->clear();
$image->clear();

При успехе создаётся service-map.png 600×360, консоль — service-map.png. Команды выполняются в записанном порядке: поздние фигуры лежат поверх ранних. setFillColor/setStrokeColor меняют настройки следующих команд; поэтому перед маршрутом fill отключён, перед кругом включён. Все исходные данные и фон создаются кодом.

Упражнение: перенесите склад из (120,130) в (180,180), сохранив радиус 9. Решение: заменить circle(120,130,129,130) на circle(180,180,189,180). Затем измените третью вершину маршрута на (180,150) — изменится только этот участок ломаной, а форма зоны останется прежней. Если вместо кругового склада нужна овальная площадка, измените ellipse; не меняйте polygon зоны.

Из учебного рисунка — в обработчик сайта

  • Задавайте верхний предел ширины, высоты, числа точек и времени задания. Публичный endpoint не должен позволять выделять произвольные объёмы памяти.
  • Сохраняйте файлы в заранее выбранный каталог. Имя файла от посетителя не должно превращаться в путь с ../; в учебных примерах имя задано нами.
  • В HTTP-ответе сначала получите готовый PNG, затем отправьте Content-Type: image/png и бинарное содержимое без echo диагностического имени. Не смешивайте предупреждения PHP с байтами PNG; ошибки логируйте отдельно.
  • Проверка наличия Imagick и обработка ImagickException нужна вокруг всей операции. Отдельно учитывайте false от writeImage и права каталога. Синтаксис php -l не проверяет расширение, растеризацию или доступ к файлу.
  • Для существующей картинки сначала загрузите доверенный файл с ограничениями; если поддерживаются анимации/несколько страниц, явно решите, какой кадр обрабатывается. После изменения очистите ненужные метаданные согласно своей задаче.

Дальше: сохранение файлов, приём пользовательских изображений, HTTP-ответ. В этом дополнении раскрыта только геометрия из десяти методов; текст, композиция, пути и остальные настройки ImagickDraw продолжают справочник отдельными блоками.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

ImagickDraw::arcНужно изобразить выполненную часть проверки, оставив незавершённую часть незакрашенной. Четыре координаты задают рамку эллипса; два угла выбирают его участок. Здесь верхняя дуга идёт от левой точки рамки к направлению 330°.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::arc(float $start_x, float $start_y, float $end_x, float $end_y, float $start_angle, float $end_angle): bool

Нужно изобразить выполненную часть проверки, оставив незавершённую часть незакрашенной.

Четыре координаты задают рамку эллипса; два угла выбирают его участок. Здесь верхняя дуга идёт от левой точки рамки к направлению 330°.

Официальная сигнатура: ImagickDraw::arc(float $start_x, float $start_y, float $end_x, float $end_y, float $start_angle, float $end_angle): bool

ПараметрТипЧто передать
$start_xfloatЛевая x-координата рамки эллипса
$start_yfloatВерхняя y-координата рамки
$end_xfloatПравая x-координата рамки
$end_yfloatНижняя y-координата рамки
$start_anglefloatНачальный угол в градусах
$end_anglefloatКонечный угол в градусах; это не длина дуги

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.arc",
  "name": "ImagickDraw::arc",
  "purpose_en": "Draws an arc",
  "description_en": "Draws an arc falling within a specified bounding rectangle on the image.",
  "signature": "ImagickDraw::arc(float $start_x, float $start_y, float $end_x, float $end_y, float $start_angle, float $end_angle): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "start_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "Starting x ordinate of bounding rectangle"
    },
    {
      "name": "start_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting y ordinate of bounding rectangle"
    },
    {
      "name": "end_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending x ordinate of bounding rectangle"
    },
    {
      "name": "end_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending y ordinate of bounding rectangle"
    },
    {
      "name": "start_angle",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting degrees of rotation"
    },
    {
      "name": "end_angle",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending degrees of rotation"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::arc example",
      "language": "php",
      "code_sha256": "adf0a53370c45c6832c4d5e228c3bdfd8beaca1615f9368d872cee72d75c21eb"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.arc.php",
  "official_page_sha256": "205146326fe128073dac8b80e8f89bfa821dfd96ec0c3eaff4359358d9a53742",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/arc.xml",
  "xml_sha256": "8f711a496133d24b69934bde60c3f9742614b5c298554084c51cdbf9d29104d0",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Дуга в рамке (40,20)—(200,140), без заливки
Дуга в рамке (40,20)—(200,140), без заливки Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Дуга в рамке (40,20)—(200,140), без заливкиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->arc(40, 20, 200, 140, 180, 330);
$image->drawImage($draw);
$path = __DIR__ . '/arc-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'arc-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится arc-basic.png 240×160. Дуга в рамке (40,20)—(200,140), без заливки. Консоль выведет arc-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: Три полукруглые шкалы по процентам

Мониторинг собирает PNG для трёх задач: завершено 25%, 60% и 90%. Из процента получается конечный угол; фоновая дуга показывает полный диапазон.

Три полукруглые шкалы по процентамПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 140, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$percentages = [25, 60, 90];
foreach ($percentages as $index => $percent) {
    $left = 20 + $index * 100;
    $draw->setStrokeWidth(10);
    $draw->setStrokeColor('#d1e3e4');
    $draw->arc($left, 35, $left + 80, 115, 180, 360);
    $draw->setStrokeColor('#146c74');
    $endAngle = 180 + 180 * $percent / 100;
    $draw->arc($left, 35, $left + 80, 115, 180, $endAngle);
}
$image->drawImage($draw);
$path = __DIR__ . '/progress-gauges.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'progress-gauges.png', "\n";
$draw->clear();
$image->clear();

Результат: progress-gauges.png 320×140; консоль — progress-gauges.png. Три серые верхние полуокружности: бирюзовая часть занимает четверть, 60% и 90% каждой. Формула использует диапазон 180°, поэтому шкала полукруглая; 0% нужно обработать пропуском цветной дуги, 100% даёт весь полукруг.

На что можно наткнуться

fill='none' оставляет только обводку. arc не рисует сектор с двумя радиусами; для сектора нужен замкнутый путь. Углы даны в градусах, не радианах; положительное направление на экранных координатах идёт по часовой стрелке, 0° направлено вправо.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::ellipse, ImagickDraw::circle. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::bezierНа схеме доставки прямой отрезок перекрывает другую подпись; соединение нужно отвести вверх. В этом примере четыре точки: первая и последняя лежат на кривой, две средние управляют изгибом. Кривая обычно не проходит через управляющие точки.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::bezier(array $coordinates): bool

На схеме доставки прямой отрезок перекрывает другую подпись; соединение нужно отвести вверх.

В этом примере четыре точки: первая и последняя лежат на кривой, две средние управляют изгибом. Кривая обычно не проходит через управляющие точки.

Официальная сигнатура: ImagickDraw::bezier(array $coordinates): bool

ПараметрТипЧто передать
$coordinatesarrayУпорядоченный массив точек вида ['x' => число, 'y' => число]. В наших кубических примерах четыре точки: начало, два управляющих положения, конец

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.bezier",
  "name": "ImagickDraw::bezier",
  "purpose_en": "Draws a bezier curve",
  "description_en": "Draws a bezier curve through a set of points on the image.",
  "signature": "ImagickDraw::bezier(array $coordinates): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "coordinates",
      "type": "array",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "Multidimensional array like array( array( 'x' => 1, 'y' => 2 ), array( 'x' => 3, 'y' => 4 ) )"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::bezier example",
      "language": "php",
      "code_sha256": "953440b3552106e501efc25128c4129280d3be920c2af51aca08105b91590a7b"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.bezier.php",
  "official_page_sha256": "4ee8e5ea97df445f251506ed345435f4ff9c6e93f0134fa697738d71b6f97da2",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/bezier.xml",
  "xml_sha256": "c344600a8ad55c94d99b811ab3c0864fb5aa2c07a113475e68a38c215fb68bd8",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Плавная дуга между (20,130) и (220,130)
Плавная дуга между (20,130) и (220,130) Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Плавная дуга между (20,130) и (220,130)Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->bezier([
    ['x' => 20, 'y' => 130],
    ['x' => 65, 'y' => 15],
    ['x' => 175, 'y' => 15],
    ['x' => 220, 'y' => 130],
]);
$image->drawImage($draw);
$path = __DIR__ . '/bezier-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'bezier-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится bezier-basic.png 240×160. Плавная дуга между (20,130) и (220,130). Консоль выведет bezier-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: Развести два соединения вокруг центрального блока

В схеме интеграций два сервиса соединены с получателем; одно соединение проводится сверху, другое снизу. Это заданная компоновка, а не поиск пути по карте.

Развести два соединения вокруг центрального блокаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#d1e3e4');
$draw->rectangle(125, 65, 195, 115);
$draw->setFillColor('none');
$draw->bezier([
    ['x' => 25, 'y' => 90], ['x' => 85, 'y' => 10],
    ['x' => 235, 'y' => 10], ['x' => 295, 'y' => 90],
]);
$draw->setStrokeColor('#c25732');
$draw->bezier([
    ['x' => 25, 'y' => 90], ['x' => 85, 'y' => 170],
    ['x' => 235, 'y' => 170], ['x' => 295, 'y' => 90],
]);
$image->drawImage($draw);
$path = __DIR__ . '/service-connections.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'service-connections.png', "\n";
$draw->clear();
$image->clear();

Результат: service-connections.png 320×180; консоль — service-connections.png. Серый блок в центре, бирюзовая кривая над ним и оранжевая под ним. Оба соединения начинают и заканчивают путь в общих точках, но управляющие точки дают разные изгибы.

На что можно наткнуться

Не передавайте GPS-трек как набор управляющих точек: bezier не является интерполяцией всех точек маршрута. Для измеренных точек используйте polyline. Для этой кубической формы нужны четыре точки; произвольный длинный массив не следует считать цепочкой независимых кубических кривых.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::polyline, ImagickDraw::line. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::circleНужна круглая метка выбранного склада на схеме, а не готовая картинка из файла. (120,80) — центр. (170,80) — точка на окружности справа от центра, поэтому радиус равен 50. Последние два аргумента — координаты точки, а не ширина и высота.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::circle(float $origin_x, float $origin_y, float $perimeter_x, float $perimeter_y): bool

Нужна круглая метка выбранного склада на схеме, а не готовая картинка из файла.

(120,80) — центр. (170,80) — точка на окружности справа от центра, поэтому радиус равен 50. Последние два аргумента — координаты точки, а не ширина и высота.

Официальная сигнатура: ImagickDraw::circle(float $origin_x, float $origin_y, float $perimeter_x, float $perimeter_y): bool

ПараметрТипЧто передать
$origin_xfloatx центра
$origin_yfloaty центра
$perimeter_xfloatx любой точки на окружности
$perimeter_yfloaty той же точки на окружности

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.circle",
  "name": "ImagickDraw::circle",
  "purpose_en": "Draws a circle",
  "description_en": "Draws a circle on the image.",
  "signature": "ImagickDraw::circle(float $origin_x, float $origin_y, float $perimeter_x, float $perimeter_y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "origin_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "origin x coordinate"
    },
    {
      "name": "origin_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "origin y coordinate"
    },
    {
      "name": "perimeter_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "perimeter x coordinate"
    },
    {
      "name": "perimeter_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "perimeter y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::circle example",
      "language": "php",
      "code_sha256": "9d20e058f8032a87cdf9ea4229e2089cbb4635ecc988135744bcd5f5092714a0"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.circle.php",
  "official_page_sha256": "38326768de260a2ba1dbc69acf9a5e19fe3a01e0b15f2b023a44d5983d7bb452",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/circle.xml",
  "xml_sha256": "4aa5384964ec5f6ca3e89e7a565f019219280751bf09b0dc420c2b6e02482c14",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Мятный круг радиусом 50 с бирюзовой обводкой
Мятный круг радиусом 50 с бирюзовой обводкой Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Мятный круг радиусом 50 с бирюзовой обводкойПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$draw->circle(120, 80, 170, 80);
$image->drawImage($draw);
$path = __DIR__ . '/circle-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'circle-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится circle-basic.png 240×160. Мятный круг радиусом 50 с бирюзовой обводкой. Консоль выведет circle-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: Метки складов разных уровней приоритета

Карта отчёта уже содержит координаты складов и выбранный интерфейсом радиус метки. Нужно нарисовать несколько независимых кругов на одном холсте.

Метки складов разных уровней приоритетаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$warehouses = [
    ['x' => 55, 'y' => 75, 'radius' => 8],
    ['x' => 145, 'y' => 50, 'radius' => 16],
    ['x' => 245, 'y' => 95, 'radius' => 24],
];
foreach ($warehouses as $warehouse) {
    $cx = $warehouse['x'];
    $cy = $warehouse['y'];
    $draw->circle($cx, $cy, $cx + $warehouse['radius'], $cy);
}
$image->drawImage($draw);
$path = __DIR__ . '/warehouse-markers.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'warehouse-markers.png', "\n";
$draw->clear();
$image->clear();

Результат: warehouse-markers.png 320×160; консоль — warehouse-markers.png. Три круга с радиусами 8, 16 и 24 в разных местах. Данные radius — выбранные размеры меток, а не прямая пропорция числу заказов: площадь круга растёт как квадрат радиуса.

На что можно наткнуться

circle(120,80,50,50) не означает радиус 50: расстояние считается от центра до точки (50,50). Для заданного радиуса r удобно передать (cx+r,cy). Цветной круг сам по себе не обрезает фотографию: для аватара нужна отдельная маска и композиция.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::ellipse, ImagickDraw::point. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::ellipseНа превью оборудования нужно выделить широкую группу деталей овалом. Центр (120,80), горизонтальный радиус 85 и вертикальный радиус 40 дают габарит 170×80 до учёта обводки. 0 и 360 выбирают полный овал.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::ellipse(float $origin_x, float $origin_y, float $radius_x, float $radius_y, float $angle_start, float $angle_end): bool

На превью оборудования нужно выделить широкую группу деталей овалом.

Центр (120,80), горизонтальный радиус 85 и вертикальный радиус 40 дают габарит 170×80 до учёта обводки. 0 и 360 выбирают полный овал.

Официальная сигнатура: ImagickDraw::ellipse(float $origin_x, float $origin_y, float $radius_x, float $radius_y, float $angle_start, float $angle_end): bool

ПараметрТипЧто передать
$origin_xfloatx центра
$origin_yfloaty центра
$radius_xfloatРадиус по горизонтали
$radius_yfloatРадиус по вертикали
$angle_startfloatНачальный угол в градусах
$angle_endfloatКонечный угол в градусах

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.ellipse",
  "name": "ImagickDraw::ellipse",
  "purpose_en": "Draws an ellipse on the image",
  "description_en": "Draws an ellipse on the image.",
  "signature": "ImagickDraw::ellipse(float $origin_x, float $origin_y, float $radius_x, float $radius_y, float $angle_start, float $angle_end): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "origin_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": ""
    },
    {
      "name": "origin_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": ""
    },
    {
      "name": "radius_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": ""
    },
    {
      "name": "radius_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": ""
    },
    {
      "name": "angle_start",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": ""
    },
    {
      "name": "angle_end",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": ""
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::ellipse example",
      "language": "php",
      "code_sha256": "9ea5452a982acf89d9e7bf0fda19bcb1780379fa64ae626476f3d93d039b92ab"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.ellipse.php",
  "official_page_sha256": "72f15f067baae415131dc3b5faf3970643c919830e20d7e5b27041f91ef5f396",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/ellipse.xml",
  "xml_sha256": "cef7773ab05e7b3efcf65682a63a72cd59b85a1b7802361770977f55d32e0dca",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Мятный эллипс шириной 170 и высотой 80
Мятный эллипс шириной 170 и высотой 80 Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Мятный эллипс шириной 170 и высотой 80Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$draw->ellipse(120, 80, 85, 40, 0, 360);
$image->drawImage($draw);
$path = __DIR__ . '/ellipse-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'ellipse-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится ellipse-basic.png 240×160. Мятный эллипс шириной 170 и высотой 80. Консоль выведет ellipse-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: Выделить две группы на схеме оборудования

Нужно отправить мастеру схематическое превью: овалом обозначить длинный узел слева и вертикальный справа. Исходная схема создаётся кодом, внешний файл не нужен.

Выделить две группы на схеме оборудованияПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 170, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#d1e3e4');
$draw->setStrokeColor('#d1e3e4');
$draw->rectangle(30, 65, 160, 105);
$draw->rectangle(235, 35, 270, 135);
$draw->setFillColor('none');
$draw->setStrokeColor('#c25732');
$draw->ellipse(95, 85, 85, 40, 0, 360);
$draw->ellipse(252, 85, 32, 65, 0, 360);
$image->drawImage($draw);
$path = __DIR__ . '/equipment-groups.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'equipment-groups.png', "\n";
$draw->clear();
$image->clear();

Результат: equipment-groups.png 320×170; консоль — equipment-groups.png. Две серые прямоугольные группы обведены оранжевыми овалами разной формы; внутри овала цвет схемы сохранён, потому что fill отключён.

На что можно наткнуться

radius_x и radius_y — половины размеров, не размеры целиком. Для равных радиусов получится окружность. Неполный диапазон углов оставляет участок; если нужна только линия, отдельно отключите fill.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::circle, ImagickDraw::arc. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::lineНужно соединить две измеренные позиции на небольшом отчётном изображении. (25,125) — начало, (215,35) — конец. Поскольку y растёт вниз, отрезок направлен вправо и вверх. Толщину и цвет задают перед вызовом.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::line(float $start_x, float $start_y, float $end_x, float $end_y): bool

Нужно соединить две измеренные позиции на небольшом отчётном изображении.

(25,125) — начало, (215,35) — конец. Поскольку y растёт вниз, отрезок направлен вправо и вверх. Толщину и цвет задают перед вызовом.

Официальная сигнатура: ImagickDraw::line(float $start_x, float $start_y, float $end_x, float $end_y): bool

ПараметрТипЧто передать
$start_xfloatx начала
$start_yfloaty начала
$end_xfloatx конца
$end_yfloaty конца

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.line",
  "name": "ImagickDraw::line",
  "purpose_en": "Draws a line",
  "description_en": "Draws a line on the image using the current stroke color, stroke opacity, and stroke width.",
  "signature": "ImagickDraw::line(float $start_x, float $start_y, float $end_x, float $end_y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "start_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting x coordinate"
    },
    {
      "name": "start_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting y coordinate"
    },
    {
      "name": "end_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending x coordinate"
    },
    {
      "name": "end_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::line example",
      "language": "php",
      "code_sha256": "e2410fc074819bbe61f5d9a13d16f4efe7694ab154916f4ee47d0cd617f56c20"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.line.php",
  "official_page_sha256": "597a2ea005d0c7ba848878ba1f252cf9d43f9de2d77f5bca9bbc09edc640fe00",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/line.xml",
  "xml_sha256": "827927d51d5529814d93b22b9f9dc8b0554b1cad5ae8a9ed028e7b7dc6e76a0f",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Бирюзовый отрезок от нижней левой части к верхней правой
Бирюзовый отрезок от нижней левой части к верхней правой Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Бирюзовый отрезок от нижней левой части к верхней правойПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->line(25, 125, 215, 35);
$image->drawImage($draw);
$path = __DIR__ . '/line-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'line-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится line-basic.png 240×160. Бирюзовый отрезок от нижней левой части к верхней правой. Консоль выведет line-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: Пунктирная линия отрыва на электронном талоне

Нижняя часть талона — служебная: отделяем её пунктиром, не рисуя десятки маленьких отрезков вручную.

Пунктирная линия отрыва на электронном талонеПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#e8f3f0');
$draw->rectangle(20, 20, 300, 160);
$draw->setFillColor('none');
$draw->setStrokeColor('#c25732');
$draw->setStrokeDashArray([8, 5]);
$draw->line(35, 115, 285, 115);
$draw->setStrokeDashArray([]);
$image->drawImage($draw);
$path = __DIR__ . '/ticket-divider.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'ticket-divider.png', "\n";
$draw->clear();
$image->clear();

Результат: ticket-divider.png 320×180; консоль — ticket-divider.png. Мятный талон с горизонтальным оранжевым пунктиром: 8 единиц штрих, 5 пропуск. Настройка пунктира сброшена после линии, чтобы не перейти к следующим фигурам.

На что можно наткнуться

Если строится один связный маршрут из многих отрезков, polyline задаёт соединения цельно. Толстые штрихи у самого края холста обрезаются; оставляйте отступ не меньше половины толщины и запас для сглаживания.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::polyline, ImagickDraw::point. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::pointЕсть сетка измерений: одну ячейку нужно пометить точным цветом без радиуса и окружности. point(60,60) адресует позицию на холсте 120×120. В примере fill и stroke намеренно одинаковы; для метки большого размера используется circle, а не предположение о толщине point.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::point(float $x, float $y): bool

Есть сетка измерений: одну ячейку нужно пометить точным цветом без радиуса и окружности.

point(60,60) адресует позицию на холсте 120×120. В примере fill и stroke намеренно одинаковы; для метки большого размера используется circle, а не предположение о толщине point.

Официальная сигнатура: ImagickDraw::point(float $x, float $y): bool

ПараметрТипЧто передать
$xfloatx отмечаемой позиции
$yfloaty отмечаемой позиции

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.point",
  "name": "ImagickDraw::point",
  "purpose_en": "Draws a point",
  "description_en": "Draws a point using the current stroke color and stroke thickness at the specified coordinates.",
  "signature": "ImagickDraw::point(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "point's x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "point's y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::point example",
      "language": "php",
      "code_sha256": "25247a2a5d482bc60d371e3c400cf3b9c75d74a9d6705c213f4d7ed8b0055877"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.point.php",
  "official_page_sha256": "c041512f89072b9bd6042630837c5081b5af9a90ecda75bebc9c35c5e56cb717",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/point.xml",
  "xml_sha256": "cbf9b97c86dcf684024618d39b0ed51b97a39fceebe672e64d9d4b759f9afbd3",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Один бирюзовый пиксель в координатах (60,60); показан только фрагмент x=55..65, y=55..65, увеличенный в 20 раз из исходного PNG 120×120
Один бирюзовый пиксель в координатах (60,60); показан только фрагмент x=55..65, y=55..65, увеличенный в 20 раз из исходного PNG 120×120 Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Один бирюзовый пиксель в координатах (60,60)Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(120, 120, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(1);
$draw->setFillColor('#146c74');
$draw->point(60, 60);
$image->drawImage($draw);
$path = __DIR__ . '/point-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'point-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится point-basic.png 120×120. Один бирюзовый пиксель в координатах (60,60). Консоль выведет point-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Откройте файл с увеличением без сглаживания, чтобы увидеть одиночную точку.

Практическая задача: Растровая сетка температуры из массива измерений

Сервис получает уже проверенные значения от шести датчиков. Для компактной диагностической карты каждый датчик занимает одну точку: цвет показывает, превышен ли порог 30.

Растровая сетка температуры из массива измеренийПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(120, 120, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(1);
$draw->setFillColor('#146c74');
$samples = [
    ['x' => 40, 'y' => 40, 'value' => 22],
    ['x' => 60, 'y' => 40, 'value' => 34],
    ['x' => 80, 'y' => 40, 'value' => 25],
    ['x' => 40, 'y' => 60, 'value' => 31],
    ['x' => 60, 'y' => 60, 'value' => 27],
    ['x' => 80, 'y' => 60, 'value' => 35],
];
foreach ($samples as $sample) {
    $color = $sample['value'] > 30 ? '#c25732' : '#146c74';
    $draw->setFillColor($color);
    $draw->setStrokeColor($color);
    $draw->point($sample['x'], $sample['y']);
}
$image->drawImage($draw);
$path = __DIR__ . '/sensor-samples.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'sensor-samples.png', "\n";
$draw->clear();
$image->clear();

Результат: sensor-samples.png 120×120; консоль — sensor-samples.png. В файле шесть одиночных точек: верхний ряд бирюзовая, оранжевая, бирюзовая; нижний — оранжевая, бирюзовая, оранжевая. Это машинная диагностическая сетка, поэтому точки маленькие; для человека поверх неё обычно добавляют увеличенные метки circle и текстовую легенду.

На что можно наткнуться

Одиночный пиксель на большом изображении легко не заметить: ниже показан увеличенный фрагмент. PHP Manual описывает stroke/thickness, однако текущая реализация ImageMagick PointPrimitive берёт fill и записывает один пиксель; толщина stroke в этой ветке не используется. Поэтому здесь оба цвета заданы одинаково, а для крупного маркера выбран circle. Для точной массовой обработки каналов удобнее ImagickPixelIterator; point здесь учит рисованию позиции.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::circle, ImagickDraw::line. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::polygonНа схеме магазина нужно закрасить обслуживаемую зону произвольной формы. Массив хранит четыре вершины по порядку обхода. Каждая вершина — вложенный массив с ключами x и y. Последняя автоматически соединяется с первой.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::polygon(array $coordinates): bool

На схеме магазина нужно закрасить обслуживаемую зону произвольной формы.

Массив хранит четыре вершины по порядку обхода. Каждая вершина — вложенный массив с ключами x и y. Последняя автоматически соединяется с первой.

Официальная сигнатура: ImagickDraw::polygon(array $coordinates): bool

ПараметрТипЧто передать
$coordinatesarrayМассив упорядоченных вершин: внутри каждой — строковые ключи x и y с числовыми значениями; минимум три вершины для области

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.polygon",
  "name": "ImagickDraw::polygon",
  "purpose_en": "Draws a polygon",
  "description_en": "Draws a polygon using the current stroke, stroke width, and fill color or texture, using the specified array of coordinates.",
  "signature": "ImagickDraw::polygon(array $coordinates): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "coordinates",
      "type": "array",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "multidimensional array like array( array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 ) );"
    }
  ],
  "return_en": "Returns true on success.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::polygon example",
      "language": "php",
      "code_sha256": "5508375535a512d9e549454e4adfe2910b063028f6c1ce444e3b1f66cc96ace3"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.polygon.php",
  "official_page_sha256": "82e1b9ea0509eb81e182552d29c8c10ea076c53e02e5f73b03c76fa5e8a331a4",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/polygon.xml",
  "xml_sha256": "460325300e731156f0154bd5589519b45792ea069b1456b29b361a7895a24055",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Замкнутая мятная четырёхугольная зона
Замкнутая мятная четырёхугольная зона Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Замкнутая мятная четырёхугольная зонаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$draw->polygon([
    ['x' => 35, 'y' => 120],
    ['x' => 70, 'y' => 25],
    ['x' => 180, 'y' => 30],
    ['x' => 215, 'y' => 120],
]);
$image->drawImage($draw);
$path = __DIR__ . '/polygon-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'polygon-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится polygon-basic.png 240×160. Замкнутая мятная четырёхугольная зона. Консоль выведет polygon-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: Зона доставки на собственной схеме

Из интерфейса настройки получен контур зоны. Здесь он задан прямо в PHP; рисуем его поверх сетки улиц, чтобы сотрудник мог проверить форму зоны.

Зона доставки на собственной схемеПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 190, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('none');
$draw->setStrokeColor('#d1e3e4');
foreach ([50, 100, 150] as $y) {
    $draw->line(15, $y, 305, $y);
}
$draw->setStrokeColor('#146c74');
$draw->setFillColor('rgba(189,235,226,0.75)');
$draw->polygon([
    ['x' => 35, 'y' => 150], ['x' => 75, 'y' => 35],
    ['x' => 245, 'y' => 45], ['x' => 285, 'y' => 135],
    ['x' => 160, 'y' => 165],
]);
$image->drawImage($draw);
$path = __DIR__ . '/delivery-zone.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'delivery-zone.png', "\n";
$draw->clear();
$image->clear();

Результат: delivery-zone.png 320×190; консоль — delivery-zone.png. Мятная полупрозрачная пятиугольная зона поверх трёх серых улиц. Улицы остаются видны через заливку; контур заканчивается в первой вершине автоматически.

На что можно наткнуться

Не сортируйте вершины просто по x: так граница может пересечь сама себя. Для обычной зоны передавайте упорядоченный контур; сложные отверстия и пересечения требуют понимания правила заливки и путей. Многоугольник на картинке не заменяет серверную проверку попадания адреса в геозону.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::polyline, ImagickDraw::rectangle. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::polylineКурьер прислал последовательность позиций; нужно соединить их в том же порядке. Здесь четыре вершины и три отрезка. В отличие от polygon, обводка не замыкает путь последним отрезком. fill='none' предотвращает нежелательную заливку между началом и концом.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::polyline(array $coordinates): bool

Курьер прислал последовательность позиций; нужно соединить их в том же порядке.

Здесь четыре вершины и три отрезка. В отличие от polygon, обводка не замыкает путь последним отрезком. fill='none' предотвращает нежелательную заливку между началом и концом.

Официальная сигнатура: ImagickDraw::polyline(array $coordinates): bool

ПараметрТипЧто передать
$coordinatesarrayМассив упорядоченных вершин с x и y; минимум две для отрезка

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.polyline",
  "name": "ImagickDraw::polyline",
  "purpose_en": "Draws a polyline",
  "description_en": "Draws a polyline using the current stroke, stroke width, and fill color or texture, using the specified array of coordinates.",
  "signature": "ImagickDraw::polyline(array $coordinates): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "coordinates",
      "type": "array",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "array of x and y coordinates: array( array( 'x' => 4, 'y' => 6 ), array( 'x' => 8, 'y' => 10 ) )"
    }
  ],
  "return_en": "Returns true on success.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::polyline example",
      "language": "php",
      "code_sha256": "128a36ab0172fd24f7b4ed30c1084a5b62863c4a0e509909e69d048a217dec53"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.polyline.php",
  "official_page_sha256": "976ef4fef2c2ec807a584ab70fdb66783608839b56cbd714be191c4f86b32d8b",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/polyline.xml",
  "xml_sha256": "deab0f210adf38a22f3d38020fb75cfde01370a5704726395dd88b0eb473c813",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Открытая ломаная из трёх отрезков
Открытая ломаная из трёх отрезков Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Открытая ломаная из трёх отрезковПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->polyline([
    ['x' => 20, 'y' => 120],
    ['x' => 75, 'y' => 70],
    ['x' => 130, 'y' => 100],
    ['x' => 220, 'y' => 35],
]);
$image->drawImage($draw);
$path = __DIR__ . '/polyline-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'polyline-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится polyline-basic.png 240×160. Открытая ломаная из трёх отрезков. Консоль выведет polyline-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: График четырёх измерений с преобразованием шкалы

Нужно показать, как за четыре периода менялось число заявок. Данные приходят числами, а графику нужны экранные координаты: большие значения должны оказаться выше.

График четырёх измерений с преобразованием шкалыПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$values = [20, 70, 45, 90];
$points = [];
foreach ($values as $index => $value) {
    $points[] = ['x' => 30 + $index * 85, 'y' => 150 - $value];
}
$draw->setStrokeColor('#d1e3e4');
$draw->line(30, 25, 30, 150);
$draw->line(30, 150, 295, 150);
$draw->setStrokeColor('#146c74');
$draw->polyline($points);
$image->drawImage($draw);
$path = __DIR__ . '/requests-chart.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'requests-chart.png', "\n";
$draw->clear();
$image->clear();

Результат: requests-chart.png 320×180; консоль — requests-chart.png. Серые оси и бирюзовая ломаная через точки (30,130), (115,80), (200,105), (285,60). Вычитание value из 150 переворачивает направление оси y. Это фиксированная учебная шкала 1 значение = 1 пиксель; в отчёте диапазон и подписи нужно задавать явно.

На что можно наткнуться

Если осталась непрозрачная заливка, изображение может выглядеть как замкнутая фигура. Не добавляйте обратный путь для борьбы с заливкой — явно отключите её. Для одного соединения достаточно line, для плавного дизайнерского изгиба — bezier.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::line, ImagickDraw::polygon, ImagickDraw::bezier. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::rectangleНужна прямоугольная подложка под блок на автоматически собранном PNG. Первая точка (35,35) — верхний левый угол, вторая (205,125) — нижний правый. Это координаты двух углов, не x,y,width,height.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::rectangle(float $top_left_x, float $top_left_y, float $bottom_right_x, float $bottom_right_y): bool

Нужна прямоугольная подложка под блок на автоматически собранном PNG.

Первая точка (35,35) — верхний левый угол, вторая (205,125) — нижний правый. Это координаты двух углов, не x,y,width,height.

Официальная сигнатура: ImagickDraw::rectangle(float $top_left_x, float $top_left_y, float $bottom_right_x, float $bottom_right_y): bool

ПараметрТипЧто передать
$top_left_xfloatx верхнего левого угла
$top_left_yfloaty верхнего левого угла
$bottom_right_xfloatx нижнего правого угла
$bottom_right_yfloaty нижнего правого угла

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.rectangle",
  "name": "ImagickDraw::rectangle",
  "purpose_en": "Draws a rectangle",
  "description_en": "Draws a rectangle given two coordinates and using the current stroke, stroke width, and fill settings.",
  "signature": "ImagickDraw::rectangle(float $top_left_x, float $top_left_y, float $bottom_right_x, float $bottom_right_y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "top_left_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the top left corner"
    },
    {
      "name": "top_left_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the top left corner"
    },
    {
      "name": "bottom_right_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the bottom right corner"
    },
    {
      "name": "bottom_right_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the bottom right corner"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::rectangle example",
      "language": "php",
      "code_sha256": "3dcf422532e638d6f274526ab995aa1c430f91d82f020c72b9f02e2d19c3c203"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.rectangle.php",
  "official_page_sha256": "4751fc9d3751877d19a8356760fc00d610125331a784802b3b6a24503206d4a9",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/rectangle.xml",
  "xml_sha256": "fabc3790b0eadb6134714e497bc93b998af1b4d56fee0f8f134820a4cd1c5cd2",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Мятный прямоугольник с бирюзовым краем
Мятный прямоугольник с бирюзовым краем Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Мятный прямоугольник с бирюзовым краемПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$draw->rectangle(35, 35, 205, 125);
$image->drawImage($draw);
$path = __DIR__ . '/rectangle-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'rectangle-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится rectangle-basic.png 240×160. Мятный прямоугольник с бирюзовым краем. Консоль выведет rectangle-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: Закрыть строку на созданном кодом тестовом документе

Перед отправкой скриншота нужно полностью перекрыть чувствительную строку непрозрачной плашкой. Для упражнения строки — серые полосы, а не настоящие личные данные.

Закрыть строку на созданном кодом тестовом документеПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setStrokeColor('none');
$draw->setFillColor('#b6c9ca');
foreach ([40, 70, 100, 130] as $y) {
    $draw->rectangle(30, $y, 270, $y + 8);
}
$draw->setFillColor('#172f34');
$draw->rectangle(25, 65, 280, 85);
$image->drawImage($draw);
$path = __DIR__ . '/redacted-document.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'redacted-document.png', "\n";
$draw->clear();
$image->clear();

Результат: redacted-document.png 320×180; консоль — redacted-document.png. Из четырёх серых строк вторая перекрыта сплошным тёмным прямоугольником. Сохраняется новая растровая PNG, исходный учебный файл отсутствует. В реальной задаче отдельно проверяйте миниатюры, метаданные, прочие кадры и отсутствие исходника в выдаче: одна нарисованная плашка не является полной политикой обезличивания.

На что можно наткнуться

При рисовании по целым координатам граничные пиксели и сглаживание отличаются от расчёта геометрической ширины x2−x1; не выдавайте его за строгий размер вырезанного массива пикселей. Для обрезки используйте cropImage; для скругления — roundRectangle.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::roundRectangle, ImagickDraw::polygon. Цвета и каналы: ImagickPixel и перебор пикселей.

ImagickDraw::roundRectangleОтчёт отправляется картинкой в мессенджер; панели должны выглядеть как аккуратные карточки. Первые четыре аргумента задают углы рамки. 18 и 18 — радиусы горизонтального и вертикального скругления, а не размеры всей карточки.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::roundRectangle(float $top_left_x, float $top_left_y, float $bottom_right_x, float $bottom_right_y, float $rounding_x, float $rounding_y): bool

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

Первые четыре аргумента задают углы рамки. 18 и 18 — радиусы горизонтального и вертикального скругления, а не размеры всей карточки.

Официальная сигнатура: ImagickDraw::roundRectangle(float $top_left_x, float $top_left_y, float $bottom_right_x, float $bottom_right_y, float $rounding_x, float $rounding_y): bool

ПараметрТипЧто передать
$top_left_xfloatx верхнего левого угла
$top_left_yfloaty верхнего левого угла
$bottom_right_xfloatx нижнего правого угла
$bottom_right_yfloaty нижнего правого угла
$rounding_xfloatГоризонтальный радиус углов
$rounding_yfloatВертикальный радиус углов

Все перечисленные параметры обязательные; передаются по значению, значений по умолчанию здесь нет. Числа — координаты в единицах холста, если в таблице не сказано «градусы». На холсте без преобразований одна единица соответствует пикселю; дробные координаты допустимы и влияют на сглаживание.

Результат вызова. Сигнатура объявляет bool. У большинства этих страниц текст return ошибочно говорит, что значения нет; актуальная реализация Imagick возвращает true после записи команды. Это ещё не PNG: изображение изменится при $image->drawImage($draw), а файл появится при writeImage. Не пытайтесь вывести результат метода как изображение и не стройте цепочку методов на возвращённом bool.

Ошибки и версии. Базовая доступность: PECL imagick 2, PECL imagick 3. Страница помечена как неполностью документированная; разделы исключений и изменений на ней пусты. Это отсутствие описания, а не обещание отсутствия ошибок. Некорректные типы и структура точек могут дать PHP TypeError/ImagickDrawException, применение команд или запись файла — ImagickException либо false. В примерах размеры и координаты заданы нами, запись проверяется отдельно. Для собственного сервиса проверяйте расширение, допустимые размеры и доступность каталога; ловите отказ на границе операции.

Полный сохранённый контракт исходной страницы PHP Manual

Английский снимок оставлен для сверки, включая формальные пробелы документации. Русские таблицы выше объясняют применение.

{
  "id": "imagickdraw.roundrectangle",
  "name": "ImagickDraw::roundRectangle",
  "purpose_en": "Draws a rounded rectangle",
  "description_en": "Draws a rounded rectangle given two coordinates, x [amp] y corner radiuses and using the current stroke, stroke width, and fill settings.",
  "signature": "ImagickDraw::roundRectangle(float $top_left_x, float $top_left_y, float $bottom_right_x, float $bottom_right_y, float $rounding_x, float $rounding_y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "top_left_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the top left corner"
    },
    {
      "name": "top_left_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the top left corner"
    },
    {
      "name": "bottom_right_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the bottom right"
    },
    {
      "name": "bottom_right_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the bottom right"
    },
    {
      "name": "rounding_x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x rounding"
    },
    {
      "name": "rounding_y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y rounding"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::roundRectangle example",
      "language": "php",
      "code_sha256": "1f191ae4b521a9828bfe18043c7c8ee2a689a01b717dc24270a7d8c9300a46e8"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.roundrectangle.php",
  "official_page_sha256": "8ebb02defa432f2b4462ef769059dd25b24011b155a23002a867873c60605cd8",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/roundrectangle.xml",
  "xml_sha256": "c1305fd6bde32a050d38c800d7beed5aa15e46f7a97450b09841c549b1f25c9d",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_shapes.py"
}
Прямоугольная панель со скруглением 18×18
Прямоугольная панель со скруглением 18×18 Иллюстрация получена ImageMagick CLI по тем же координатам; это не протокол выполнения PHP Imagick.
Минимальный результат: Прямоугольная панель со скруглением 18×18Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$draw->roundRectangle(35, 35, 205, 125, 18, 18);
$image->drawImage($draw);
$path = __DIR__ . '/roundrectangle-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'roundrectangle-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении рядом со скриптом появится roundrectangle-basic.png 240×160. Прямоугольная панель со скруглением 18×18. Консоль выведет roundrectangle-basic.png и перевод строки. image хранит пиксели, draw — команды; clear освобождает ресурсы после записи. Контуры могут чуть отличаться сглаживанием в разных сборках ImageMagick.

Практическая задача: Панель прогресса с безопасным радиусом

Пользователь выбрал радиус углов 80, но высота панели всего 60. Ограничиваем радиус, затем внутри строим полосу готовности по доле 0.65.

Панель прогресса с безопасным радиусомПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 140, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$left = 20; $top = 35; $right = 300; $bottom = 95;
$requestedRadius = 80;
$radius = min($requestedRadius, ($right - $left) / 2, ($bottom - $top) / 2);
$draw->setStrokeColor('#146c74');
$draw->setFillColor('#e8f3f0');
$draw->roundRectangle($left, $top, $right, $bottom, $radius, $radius);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$progress = 0.65;
$draw->roundRectangle(35, 53, 35 + 250 * $progress, 77, 12, 12);
$image->drawImage($draw);
$path = __DIR__ . '/progress-panel.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'progress-panel.png', "\n";
$draw->clear();
$image->clear();

Результат: progress-panel.png 320×140; консоль — progress-panel.png. Внешняя мятная капсула радиусом 30 и внутренняя бирюзовая полоса шириной 162.5 из допустимых 250. min выбирает наименьшее ограничение; до работы с внешними данными дополнительно проверьте порядок углов и долю в диапазоне 0..1.

На что можно наткнуться

Слишком большие радиусы относительно сторон делают результат неудобным для предсказания; в прикладном коде ограничивайте их половиной ширины и высоты. PNG с кнопкой не становится HTML-кнопкой и не получает события клика.

Стоимость. Холст и буферы занимают память пропорционально площади; 600×360 здесь — осознанно небольшой размер. Рисование длинного списка точек требует обработки этого списка, а заполнение большой области — растеризации её пикселей. Не генерируйте миллион вершин и не принимайте размеры без верхней границы из запроса. Для статичных иконок сохраните результат и переиспользуйте его, для интерактивного интерфейса рассмотрите SVG/CSS/canvas вместо повторной генерации PNG на каждый просмотр.

Рядом: ImagickDraw::rectangle, ImagickDraw::ellipse. Цвета и каналы: ImagickPixel и перебор пикселей.

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

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

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

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

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