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

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

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

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

Глава 331 · После первой геометрии

ImagickDraw: перенос, поворот, масштаб, наклон и affine

Шесть преобразований от простого переноса карточки до схемы из общего шаблона: локальные оси, порядок CTM, pivot, отражение, шесть коэффициентов и границы холста.

Разместить один шаблон без пересчёта всех вершин

Отчёту нужны несколько одинаковых карточек, указатель направления или условная схема сервисов. Удобно описать фигуру около своего локального начала, а положение, поворот и размер назначить отдельно. Тогда при переносе всей карточки не приходится исправлять координаты каждой рамки и строки.

На белом холсте 280×220 мятный прямоугольник с бирюзовым краем имеет углы (80,60) и (180,120). Локальный rectangle по-прежнему записан как (0,0)—(100,60).
На белом холсте 280×220 мятный прямоугольник с бирюзовым краем имеет углы (80,60) и (180,120). Локальный rectangle по-прежнему записан как (0,0)—(100,60). Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.

Локальные координаты принадлежат шаблону; координаты холста задают место пикселей картинки. На новом Draw x идёт вправо, y вниз. Преобразование связывает эти системы для следующих команд; оно не перекрашивает и не передвигает уже готовый PNG. Прежде полезны линии и прямоугольник, заливка и обводка.

Первый перенос: local (0,0) становится canvas (80,60)

Один локальный шаблон: после translate(80,60) точки (0,0)/(100,60) соответствуют (80,60)/(180,120) холста; графический отступ схемы не входит в эти числа
Один локальный шаблон: после translate(80,60) точки (0,0)/(100,60) соответствуют (80,60)/(180,120) холста; графический отступ схемы не входит в эти числа Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Разместить карточку в выбранной точкеПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->translate(80, 60);
$draw->rectangle(0, 0, 100, 60);
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/first-translation.png');
echo "first-translation.png\n";

Сохраните first.php и запустите php first.php. При успешной записи появится first-translation.png 280×220 с мятной карточкой (80,60)—(180,120) и бирюзовым краем. Консоль: first-translation.png и перевод строки. Это короткое введение; ниже writeImage проверяется и ресурсы очищаются.

ЗаписьКак прочитать
new Imagick / newImageСоздать холст фиксированного размера 280×220
new ImagickDrawСоздать отдельный объект команд с исходной системой координат
translate(80,60)Передвинуть начало для следующих команд
rectangle(0,0,100,60)Оставить форму в простых локальных координатах
drawImage / writeImageНанести команды на пиксели / сохранить PNG

$draw хранит объект; -> вызывает метод; в скобках передаются значения; ; завершает инструкцию. Методы преобразуют координатную систему последующих команд. Если сначала записать rectangle, а потом translate, первый rectangle уже останется на прежнем месте. См. объект и метод.

Почему порядок вызовов меняет результат

Перенести начало, затем повернуть локальные оси — одно действие; повернуть оси, затем перенести по ним — другое. На рисунке слева вызваны translate(100,60) и rotate(30), справа те же числа в обратном порядке. Сравниваем положение локального (0,0), а не угадываем по внешнему виду прямоугольника.

Слева T(100,60)→R(30): local origin на (100,60). Справа R(30)→T(100,60): origin около (56.60,101.96) внутри правой панели; её собственный сдвиг показа на 280 по x не входит в эти координаты
Слева T(100,60)→R(30): local origin на (100,60). Справа R(30)→T(100,60): origin около (56.60,101.96) внутри правой панели; её собственный сдвиг показа на 280 по x не входит в эти координаты Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Сохранить два порядка в одном отчётеПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(560, 260, 'white');
$image->setImageFormat('png');
foreach ([false, true] as $panel => $rotateFirst) {
    $draw = new ImagickDraw();
    $draw->setStrokeColor('#146c74');
    $draw->setStrokeWidth(4);
    $draw->setFillColor('#bdebe2');
    $draw->translate($panel * 280, 0);
    if ($rotateFirst) {
        $draw->rotate(30);
        $draw->translate(100, 60);
    } else {
        $draw->translate(100, 60);
        $draw->rotate(30);
    }
    $draw->rectangle(0, 0, 80, 60);
    $image->drawImage($draw);
    $draw->clear();
}
$path = __DIR__ . '/transform-order.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'transform-order.png', "\n";
$image->clear();

При успехе transform-order.png 560×260 содержит два одинаковых локальных прямоугольника (0,0)—(80,60), повёрнутых на 30°, но в разных местах. Слева начало (100,60), справа около (56.60,101.96) относительно своей панели. Первая translate($panel*280,0) в цикле лишь размещает две панели рядом; она отделена от сравниваемой пары. Консоль — transform-order.png.

Обозначим текущую связь систем как CTM, исходно единичную. В растеризаторе MVG новая команда N добавляется как CTM←CTM·N. Поэтому вызовы T→R дают произведение T·R: к локальной точке сначала применяется R, потом T. Это не указание переставлять код наугад: вызовы последовательно меняют локальные оси, а произведение описывает переход точки к холсту.

История на новом DrawЛокальная точкаНа холсте
translate(100,60), rotate(30)(0,0)(100,60)
rotate(30), translate(100,60)(0,0)(100 cos30°−60 sin30°, 100 sin30°+60 cos30°) ≈ (56.60,101.96)
translate(40,50), scale(1.6,0.9)(100,60)(40+160, 50+54) = (200,104)

Для независимых компонентов примеры создают новый Draw. Его clear в конце освобождает команды и сбрасывает настройки; clear не используется посередине как тайное средство отменить только матрицу. push/pop и viewbox — отдельные методы, здесь они не требуются.

Одна серверная карточка — три положения в схеме

Автоматическая схема использует один небольшой значок сервера: рамка и две строки. Для каждого экземпляра создаём отдельный Draw, переносим его локальный центр, задаём угол и масштаб, затем записываем общий шаблон. Соединения рисуем ещё одним Draw в координатах холста, чтобы они не унаследовали поворот последнего сервера.

PNG 640×360: три мятных сервера с центрами (110,130), (310,130), (520,130), углами 0°/15°/−15° и масштабами 1/1.2/0.8; оранжевые соединения остаются в системе холста
PNG 640×360: три мятных сервера с центрами (110,130), (310,130), (520,130), углами 0°/15°/−15° и масштабами 1/1.2/0.8; оранжевые соединения остаются в системе холста Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Собрать схему из локального шаблонаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(640, 360, 'white');
$image->setImageFormat('png');
$placements = [[110, 130, 0, 1], [310, 130, 15, 1.2], [520, 130, -15, 0.8]];
foreach ($placements as [$x, $y, $angle, $size]) {
    $server = new ImagickDraw();
    $server->setStrokeColor('#146c74');
    $server->setStrokeWidth(3);
    $server->setFillColor('#bdebe2');
    $server->translate($x, $y);
    $server->rotate($angle);
    $server->scale($size, $size);
    $server->rectangle(-45, -25, 45, 25);
    $server->line(-30, -10, 30, -10);
    $server->line(-30, 5, 15, 5);
    $image->drawImage($server);
    $server->clear();
}
$links = new ImagickDraw();
$links->setStrokeColor('#c25732');
$links->setStrokeWidth(4);
$links->setFillColor('none');
$links->line(110, 230, 310, 230);
$links->line(310, 230, 520, 230);
$links->line(110, 180, 110, 230);
$links->line(310, 190, 310, 230);
$links->line(520, 175, 520, 230);
$image->drawImage($links);
$links->clear();
$path = __DIR__ . '/server-layout.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'server-layout.png', "\n";
$image->clear();

При успехе server-layout.png 640×360 содержит три версии одного шаблона rectangle(-45,-25,45,25) и двух внутренних линий. У каждого свой центр/угол/размер из массива placements. Оранжевая горизонталь на y=230 и три вертикальных отрезка не повёрнуты. Они условно обозначают общую связь, а не доказывают конкретную топологию сети. Консоль — server-layout.png.

Упражнение: измените угол второго сервера с 15 на 0 — его центр (310,130) должен сохраниться. Затем замените размер третьего с 0.8 на 1.1: локальный шаблон не переписывается, но нужно заново учитывать его внешние границы и обводку. Чтобы масштабировать только отдельный декор, вынесите его в независимый Draw, как в примере наклонной плашки.

Не потерять систему координат при росте задачи

  • Сначала назначайте преобразование, затем записывайте фигуру. Для изменения уже готовых пикселей выбирайте растровую операцию Imagick, а не поздний вызов ImagickDraw.
  • Записывайте локальный шаблон около понятного начала или центра. Не смешивайте без объяснения координаты шаблона, холста и отступы сравнительной иллюстрации.
  • Порядок вызовов накапливается. Affine с единичной матрицей не отменяет историю; новый Draw обеспечивает независимый компонент.
  • Для заданного shear-коэффициента используйте явный affine. Поведение skewX/skewY проверяйте на своей связке версий; сторонние SVG/Snap.svg формулы не являются подтверждением Imagick API.
  • Размер PNG не растёт от transform. Проверяйте преобразованные границы, запас под stroke и ограничения числа объектов/команд. Для HTTP-вывода PNG исключите диагностические echo и посторонний HTML.

Параметры рисунка продолжают заливку и окончания/стыки обводки. Push/pop, viewbox, clipping и оставшиеся методы ImagickDraw остаются отдельными узлами полного справочника; этот небольшой блок не объявляет их готовыми.

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

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

ImagickDraw::translateНужно разместить одну карточку в разных местах отчёта, сохранив её внутренние координаты и расстояния между элементами.

PECL imagick 2, PECL imagick 3 · imagick

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

Нужно разместить одну карточку в разных местах отчёта, сохранив её внутренние координаты и расстояния между элементами.

Translate сдвигает систему координат следующих команд. На новом Draw после translate(80,60) локальная точка (0,0) оказывается в (80,60) холста, а (100,60) — в (180,120). Не нужно вручную прибавлять 80 и 60 к каждой вершине, полоске и значку шаблона.

Сигнатура и параметры

ImagickDraw::translate(float $x, float $y): bool
ПараметрТип и применение
$xfloat: горизонтальное смещение в текущей системе координат. На новом Draw положительное x идёт вправо, отрицательное влево.
$yfloat: вертикальное смещение. При обычной экранной оси y вниз положительное значение идёт вниз. После поворота/масштаба это смещение относится к изменённым осям, а не обязательно к пикселям холста.

Возвращаемый тип сигнатуры — bool; текущий PHP wrapper после записи преобразования возвращает true. Текст Return Values сохранённого Manual противоречиво говорит об отсутствии результата. Ни bool, ни сам Draw не являются готовой картинкой: drawImage наносит команды на пиксели, writeImage сохраняет файл. Нативный запуск PHP в этом пакете отложен, поэтому не выдаём проверку синтаксиса за подтверждение конкретной связки Imagick/ImageMagick.

Официальная доступность: PECL imagick 2, PECL imagick 3. В snapshot не объявлены отдельные изменения версии, удаление или deprecated-маркер данного метода. PHP-примеры используют синтаксис PHP 8.2+ и расширение imagick. Отсутствие changelog не доказывает тождественность всех версий рендерера.

Ошибки отдельно не перечислены в официальном snapshot. Неподходящий PHP-тип может вызвать TypeError; неверные/неполные коэффициенты — ImagickDrawException. Проверяйте конечность и прикладной диапазон заранее: возврат true не гарантирует, что фигура осталась в холсте. Растеризация и запись PNG могут дать ImagickException либо false; пример отдельно проверяет запись. Вырожденная матрица и слишком большой масштаб — геометрические проблемы, а не обязательно отвергаемые API значения.

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

Сохранены все исходные поля: описание, signature, параметры, return/failure, availability, changelog, сведения о примерах, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие нюансов в реализации.

{
  "id": "imagickdraw.translate",
  "name": "ImagickDraw::translate",
  "purpose_en": "Applies a translation to the current coordinate system",
  "description_en": "Applies a translation to the current coordinate system which moves the coordinate system origin to the specified coordinate.",
  "signature": "ImagickDraw::translate(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "horizontal translation"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "vertical translation"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::translate example",
      "language": "php",
      "code_sha256": "c9291e8bb1e22d1c12a1a5bf4b5fbc8a2222174a4df46d17149b6aedb75e6ddb"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.translate.php",
  "official_page_sha256": "74eb5e58a847312364e84874c66fab591619a730b1f44686f4cfbdfe4203ba07",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/translate.xml",
  "xml_sha256": "5410055b0466a1ecf12d0e773114e53e58a7dea0a8c48f1fef6b5a6449387563",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
На белом холсте 280×220 мятный прямоугольник с бирюзовым краем имеет углы (80,60) и (180,120). Локальный rectangle по-прежнему записан как (0,0)—(100,60).
На белом холсте 280×220 мятный прямоугольник с бирюзовым краем имеет углы (80,60) и (180,120). Локальный rectangle по-прежнему записан как (0,0)—(100,60). Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Перенос локального шаблона: первый результатПример для указанного окружения
<?php
declare(strict_types=1);

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

При успешном выполнении создаётся translate-basic.png 280×220. На белом холсте 280×220 мятный прямоугольник с бирюзовым краем имеет углы (80,60) и (180,120). Локальный rectangle по-прежнему записан как (0,0)—(100,60). Последняя и единственная строка консоли — translate-basic.png. Все данные и холст создаются программой; точные пиксели сглаженных краёв зависят от рендерера.

Практическая задача: Разложить четыре одинаковые карточки отчёта

Шаблон карточки содержит рамку и две строки. Меняем только положение; новый Draw на каждом шаге не наследует предыдущий перенос.

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

$image = new Imagick();
$image->newImage(380, 260, 'white');
$image->setImageFormat('png');
foreach ([[40, 40], [200, 40], [40, 140], [200, 140]] as [$x, $y]) {
    $card = new ImagickDraw();
    $card->setStrokeColor('#146c74');
    $card->setStrokeWidth(3);
    $card->setFillColor('#bdebe2');
    $card->translate($x, $y);
    $card->rectangle(0, 0, 100, 60);
    $card->line(15, 20, 85, 20);
    $card->line(15, 40, 60, 40);
    $image->drawImage($card);
    $card->clear();
}
$path = __DIR__ . '/report-cards.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'report-cards.png', "\n";
$image->clear();

Результат: report-cards.png 380×260. Четыре мятные карточки в сетке 2×2: их верхние левые углы (40,40), (200,40), (40,140), (200,140). Внутренние строки везде имеют одинаковые локальные координаты. Переносы независимы: последняя карточка не получает сумму четырёх позиций. Последняя строка — report-cards.png.

Ошибки, альтернативы и стоимость

Translate не означает установить абсолютное место фигуры независимо от истории. Два последовательных переноса на новом Draw накапливаются: (80,60), затем (20,0) дают (100,60). После rotate или scale изменятся и оси переноса. Настройка после уже записанного rectangle не переносит его задним числом.

Преобразование не увеличивает фиксированный холст автоматически. Рассчитывайте границы после всех операций и оставляйте поле под обводку, её стыки и сглаживание; вне холста результат обрезается. Проверка одних исходных width/height недостаточна после поворота или наклона. Настройка CTM и растеризация — разные этапы: основную работу задают площадь холста, сложность пути, число копий и сохранение PNG. Ограничивайте эти размеры, кешируйте готовый статичный рисунок, измеряйте полное задание вместо заявления, что одна матрица всегда быстрее нескольких вызовов.

В расширенных программах foreach обходит конфигурации/точки, if проверяет условие, throw сообщает о невозможном вводе. Новый Draw изолирует координаты одного компонента. См. массивы, условия и циклы, исключения.

Соседние инструменты: ImagickDraw::rotate · ImagickDraw::scale · ImagickDraw::skewX · ImagickDraw::skewY · ImagickDraw::affine. Основы: геометрия, толщина/цвет края.

ImagickDraw::rotateЗначок или указатель нужно направить по маршруту. Поворот должен происходить вокруг понятного центра, а не отправлять фигуру за край картинки.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::rotate(float $degrees): bool

Значок или указатель нужно направить по маршруту. Поворот должен происходить вокруг понятного центра, а не отправлять фигуру за край картинки.

Rotate принимает градусы и поворачивает текущие оси вокруг их начала (0,0). На обычном холсте x вправо/y вниз положительный угол выглядит как поворот по часовой стрелке. Сначала переносим локальное начало в (140,100), затем поворачиваем оси на 30°, а фигуру задаём симметрично вокруг локального нуля.

Сигнатура и параметры

ImagickDraw::rotate(float $degrees): bool
ПараметрТип и применение
$degreesfloat: угол в градусах, не радианах. Например 30 — по часовой стрелке при обычных экранных осях, -30 — обратно. После отражения системы знак видимого направления нельзя переносить автоматически.

Возвращаемый тип сигнатуры — bool; текущий PHP wrapper после записи преобразования возвращает true. Текст Return Values сохранённого Manual противоречиво говорит об отсутствии результата. Ни bool, ни сам Draw не являются готовой картинкой: drawImage наносит команды на пиксели, writeImage сохраняет файл. Нативный запуск PHP в этом пакете отложен, поэтому не выдаём проверку синтаксиса за подтверждение конкретной связки Imagick/ImageMagick.

Официальная доступность: PECL imagick 2, PECL imagick 3. В snapshot не объявлены отдельные изменения версии, удаление или deprecated-маркер данного метода. PHP-примеры используют синтаксис PHP 8.2+ и расширение imagick. Отсутствие changelog не доказывает тождественность всех версий рендерера.

Ошибки отдельно не перечислены в официальном snapshot. Неподходящий PHP-тип может вызвать TypeError; неверные/неполные коэффициенты — ImagickDrawException. Проверяйте конечность и прикладной диапазон заранее: возврат true не гарантирует, что фигура осталась в холсте. Растеризация и запись PNG могут дать ImagickException либо false; пример отдельно проверяет запись. Вырожденная матрица и слишком большой масштаб — геометрические проблемы, а не обязательно отвергаемые API значения.

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

Сохранены все исходные поля: описание, signature, параметры, return/failure, availability, changelog, сведения о примерах, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие нюансов в реализации.

{
  "id": "imagickdraw.rotate",
  "name": "ImagickDraw::rotate",
  "purpose_en": "Applies the specified rotation to the current coordinate space",
  "description_en": "Applies the specified rotation to the current coordinate space.",
  "signature": "ImagickDraw::rotate(float $degrees): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "degrees",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "degrees to rotate."
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::rotate example",
      "language": "php",
      "code_sha256": "59aa0bef5f5eab2705da10b18edbbf0d782d99768ba9ee497476549bdb0fe7bf"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.rotate.php",
  "official_page_sha256": "c5bd14d9674c969e6d853bcebf5ab95b4e7a6b37191b016b83b686b08d94f51a",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/rotate.xml",
  "xml_sha256": "e56d7227564d98d140c6d6a63566a4e79cfbbffbd246aba5c240c3e716291525",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Мятная карточка шириной 100 и высотой 60 повёрнута на 30° вокруг точки холста (140,100). Она целиком помещается в 280×220; осей и подписи центра в чистом PNG нет.
Мятная карточка шириной 100 и высотой 60 повёрнута на 30° вокруг точки холста (140,100). Она целиком помещается в 280×220; осей и подписи центра в чистом PNG нет. Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Поворот вокруг выбранного начала: первый результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->translate(140, 100);
$draw->rotate(30);
$draw->rectangle(-50, -30, 50, 30);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/rotate-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'rotate-basic.png', "\n";
$image->clear();

При успешном выполнении создаётся rotate-basic.png 280×220. Мятная карточка шириной 100 и высотой 60 повёрнута на 30° вокруг точки холста (140,100). Она целиком помещается в 280×220; осей и подписи центра в чистом PNG нет. Последняя и единственная строка консоли — rotate-basic.png. Все данные и холст создаются программой; точные пиксели сглаженных краёв зависят от рендерера.

Практическая задача: Направить стрелку из пункта A в пункт B

На схеме доставки известны две точки. Вычислим направление через atan2, повернём локальную стрелку вдоль него и получим наконечник точно в конечной точке.

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

$image = new Imagick();
$image->newImage(320, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('#bdebe2');
$ax = 70; $ay = 160;
$bx = 250; $by = 60;
$dx = $bx - $ax; $dy = $by - $ay;
$length = hypot($dx, $dy);
if ($length < 30) {
    throw new InvalidArgumentException('Для этой стрелки нужен маршрут не короче 30');
}
$angle = rad2deg(atan2($dy, $dx));
$draw->translate($ax, $ay);
$draw->rotate($angle);
$draw->polygon([
    ['x' => 0, 'y' => -7], ['x' => $length - 25, 'y' => -7],
    ['x' => $length - 25, 'y' => -16], ['x' => $length, 'y' => 0],
    ['x' => $length - 25, 'y' => 16], ['x' => $length - 25, 'y' => 7],
    ['x' => 0, 'y' => 7],
]);
echo 'angle=', number_format($angle, 2, '.', ''), '; length=',
    number_format($length, 2, '.', ''), "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/route-arrow.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'route-arrow.png', "\n";
$image->clear();

Результат: route-arrow.png 320×220. Мятная стрелка идёт от (70,160) вверх вправо к (250,60). hypot вычисляет длину, atan2 — угол в радианах с учётом знаков dx/dy, rad2deg переводит его в градусы API. При совпавших точках нет направления и пример отклоняет слишком короткий маршрут. Перед именем файла консоль: angle=-29.05; length=205.91. Последняя строка — route-arrow.png.

Ошибки, альтернативы и стоимость

Один rotate(30) не выбирает центр картинки автоматически. Для готовых координат с центром (cx,cy) последовательность T(cx,cy)→R(angle)→T(-cx,-cy) задаёт нужный pivot; для нового локального шаблона удобнее сразу хранить центр около (0,0). ImagickDraw::rotate меняет координаты рисования, а не поворачивает уже готовые пиксели как Imagick::rotateImage.

Преобразование не увеличивает фиксированный холст автоматически. Рассчитывайте границы после всех операций и оставляйте поле под обводку, её стыки и сглаживание; вне холста результат обрезается. Проверка одних исходных width/height недостаточна после поворота или наклона. Настройка CTM и растеризация — разные этапы: основную работу задают площадь холста, сложность пути, число копий и сохранение PNG. Ограничивайте эти размеры, кешируйте готовый статичный рисунок, измеряйте полное задание вместо заявления, что одна матрица всегда быстрее нескольких вызовов.

В расширенных программах foreach обходит конфигурации/точки, if проверяет условие, throw сообщает о невозможном вводе. Новый Draw изолирует координаты одного компонента. См. массивы, условия и циклы, исключения.

Соседние инструменты: ImagickDraw::translate · ImagickDraw::scale · ImagickDraw::skewX · ImagickDraw::skewY · ImagickDraw::affine. Основы: геометрия, толщина/цвет края.

ImagickDraw::scaleОдин векторный шаблон нужен в нескольких размерах или с противоположным направлением, без переписывания всех координат и ресайза уже размытого растра.

PECL imagick 2, PECL imagick 3 · imagick

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

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

Scale задаёт множители по локальным осям. 1 сохраняет размер, 2 удваивает, 0.5 уменьшает вдвое. В примере локальные 100×60 превращаются в геометрические 160×54; перенос (40,50) остаётся местом начала, потому что он вызван перед scale. Разные множители изменяют пропорции.

Сигнатура и параметры

ImagickDraw::scale(float $x, float $y): bool
ПараметрТип и применение
$xfloat: множитель горизонтальной локальной оси. Отрицательное значение отражает её; 0 схлопывает горизонтальное измерение.
$yfloat: множитель вертикальной локальной оси. Для сохранения пропорций обычно берут одинаковые положительные x и y. Ввод должен быть конечным и ограниченным задачей.

Возвращаемый тип сигнатуры — bool; текущий PHP wrapper после записи преобразования возвращает true. Текст Return Values сохранённого Manual противоречиво говорит об отсутствии результата. Ни bool, ни сам Draw не являются готовой картинкой: drawImage наносит команды на пиксели, writeImage сохраняет файл. Нативный запуск PHP в этом пакете отложен, поэтому не выдаём проверку синтаксиса за подтверждение конкретной связки Imagick/ImageMagick.

Официальная доступность: PECL imagick 2, PECL imagick 3. В snapshot не объявлены отдельные изменения версии, удаление или deprecated-маркер данного метода. PHP-примеры используют синтаксис PHP 8.2+ и расширение imagick. Отсутствие changelog не доказывает тождественность всех версий рендерера.

Ошибки отдельно не перечислены в официальном snapshot. Неподходящий PHP-тип может вызвать TypeError; неверные/неполные коэффициенты — ImagickDrawException. Проверяйте конечность и прикладной диапазон заранее: возврат true не гарантирует, что фигура осталась в холсте. Растеризация и запись PNG могут дать ImagickException либо false; пример отдельно проверяет запись. Вырожденная матрица и слишком большой масштаб — геометрические проблемы, а не обязательно отвергаемые API значения.

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

Сохранены все исходные поля: описание, signature, параметры, return/failure, availability, changelog, сведения о примерах, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие нюансов в реализации.

{
  "id": "imagickdraw.scale",
  "name": "ImagickDraw::scale",
  "purpose_en": "Adjusts the scaling factor",
  "description_en": "Adjusts the scaling factor to apply in the horizontal and vertical directions to the current coordinate space.",
  "signature": "ImagickDraw::scale(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "horizontal factor"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "vertical factor"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::scale example",
      "language": "php",
      "code_sha256": "68dc963fd39e6752c008c580415bfe7a7fed2eb4b804e97f251f27a76eeabe24"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.scale.php",
  "official_page_sha256": "6e355313241062b754ad59028a6ee2ee598fd97512358c243b022e07319b670b",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/scale.xml",
  "xml_sha256": "8c3980d764a8807c300ff543cbe9d767f56f3d2ee22dd9b0fc36aabc2c2fac68",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Прямоугольник на холсте 280×220 занимает геометрическую область (40,50)—(200,104). Сам PNG остаётся 280×220: scale не меняет его ширину или высоту.
Прямоугольник на холсте 280×220 занимает геометрическую область (40,50)—(200,104). Сам PNG остаётся 280×220: scale не меняет его ширину или высоту. Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Масштаб и отражение шаблона: первый результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->translate(40, 50);
$draw->scale(1.6, 0.9);
$draw->rectangle(0, 0, 100, 60);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/scale-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'scale-basic.png', "\n";
$image->clear();

При успешном выполнении создаётся scale-basic.png 280×220. Прямоугольник на холсте 280×220 занимает геометрическую область (40,50)—(200,104). Сам PNG остаётся 280×220: scale не меняет его ширину или высоту. Последняя и единственная строка консоли — scale-basic.png. Все данные и холст создаются программой; точные пиксели сглаженных краёв зависят от рендерера.

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

В интерфейсной схеме нужны противоположные направления. Отразим локальную горизонтальную ось второй стрелки; сам набор вершин останется общим.

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

$image = new Imagick();
$image->newImage(320, 220, 'white');
$image->setImageFormat('png');
foreach ([[40, 100, 1], [280, 100, -1]] as [$x, $y, $sx]) {
    $arrow = new ImagickDraw();
    $arrow->setStrokeColor('#146c74');
    $arrow->setStrokeWidth(3);
    $arrow->setFillColor('#bdebe2');
    $arrow->translate($x, $y);
    $arrow->scale($sx, 1);
    $arrow->polygon([
        ['x' => 0, 'y' => 0], ['x' => 60, 'y' => 0], ['x' => 60, 'y' => -15],
        ['x' => 100, 'y' => 15], ['x' => 60, 'y' => 45],
        ['x' => 60, 'y' => 30], ['x' => 0, 'y' => 30],
    ]);
    $image->drawImage($arrow);
    $arrow->clear();
}
$path = __DIR__ . '/mirrored-directions.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'mirrored-directions.png', "\n";
$image->clear();

Результат: mirrored-directions.png 320×220. Слева стрелка направлена вправо с наконечником (140,115), справа — влево с наконечником (180,115). Перенос второй к x=280 оставляет отрицательные локальные x после отражения внутри холста; scale(-1,1) на исходном начале мог бы увести фигуру в отрицательную область. Последняя строка — mirrored-directions.png.

Ошибки, альтернативы и стоимость

Это преобразование координат, не процент JPEG/PNG и не resize готового изображения. Масштаб участвует и в растеризации обводки; при неравных множителях нельзя обещать одну точную толщину stroke для всех направлений/версий. Ноль схлопывает фигуру; отрицательный множитель отражает также направление обхода и может вынести её за холст.

Преобразование не увеличивает фиксированный холст автоматически. Рассчитывайте границы после всех операций и оставляйте поле под обводку, её стыки и сглаживание; вне холста результат обрезается. Проверка одних исходных width/height недостаточна после поворота или наклона. Настройка CTM и растеризация — разные этапы: основную работу задают площадь холста, сложность пути, число копий и сохранение PNG. Ограничивайте эти размеры, кешируйте готовый статичный рисунок, измеряйте полное задание вместо заявления, что одна матрица всегда быстрее нескольких вызовов.

В расширенных программах foreach обходит конфигурации/точки, if проверяет условие, throw сообщает о невозможном вводе. Новый Draw изолирует координаты одного компонента. См. массивы, условия и циклы, исключения.

Соседние инструменты: ImagickDraw::translate · ImagickDraw::rotate · ImagickDraw::skewX · ImagickDraw::skewY · ImagickDraw::affine. Основы: геометрия, толщина/цвет края.

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

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::skewX(float $degrees): bool

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

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

Сигнатура и параметры

ImagickDraw::skewX(float $degrees): bool
ПараметрТип и применение
$degreesfloat: параметр наклона в градусах. Не передавайте коэффициент shear вместо угла. Ограничивайте диапазон прикладного ввода; для точного численного коэффициента используйте явный affine и его формулы.

Возвращаемый тип сигнатуры — bool; текущий PHP wrapper после записи преобразования возвращает true. Текст Return Values сохранённого Manual противоречиво говорит об отсутствии результата. Ни bool, ни сам Draw не являются готовой картинкой: drawImage наносит команды на пиксели, writeImage сохраняет файл. Нативный запуск PHP в этом пакете отложен, поэтому не выдаём проверку синтаксиса за подтверждение конкретной связки Imagick/ImageMagick.

Официальная доступность: PECL imagick 2, PECL imagick 3. В snapshot не объявлены отдельные изменения версии, удаление или deprecated-маркер данного метода. PHP-примеры используют синтаксис PHP 8.2+ и расширение imagick. Отсутствие changelog не доказывает тождественность всех версий рендерера.

Ошибки отдельно не перечислены в официальном snapshot. Неподходящий PHP-тип может вызвать TypeError; неверные/неполные коэффициенты — ImagickDrawException. Проверяйте конечность и прикладной диапазон заранее: возврат true не гарантирует, что фигура осталась в холсте. Растеризация и запись PNG могут дать ImagickException либо false; пример отдельно проверяет запись. Вырожденная матрица и слишком большой масштаб — геометрические проблемы, а не обязательно отвергаемые API значения.

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

Сохранены все исходные поля: описание, signature, параметры, return/failure, availability, changelog, сведения о примерах, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие нюансов в реализации.

{
  "id": "imagickdraw.skewx",
  "name": "ImagickDraw::skewX",
  "purpose_en": "Skews the current coordinate system in the horizontal direction",
  "description_en": "Skews the current coordinate system in the horizontal direction.",
  "signature": "ImagickDraw::skewX(float $degrees): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "degrees",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "degrees to skew"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::skewX example",
      "language": "php",
      "code_sha256": "5ad4b9eec4976e904d083b465d266e7df6ee017691304db1f3229b328ec9d451"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.skewx.php",
  "official_page_sha256": "63352f30ff77a82599d154721ee9f89d93baf640405f76b8c3bcbf2e0a687635",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/skewx.xml",
  "xml_sha256": "1d138288840f1e116db5c257f45fee7fe1e75bb3683186a94f3dadd4466af49f",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
На холсте 280×220 получается мятный параллелограмм: верхнее ребро начинается у (60,60), нижнее на y=120 сдвинуто по x. В использованном CLI 7.1.2-31 нижние углы около (85.36,120) и (185.36,120), по фактическому sin(25°). Это результат команды skewX(25), а не пересчитанный вручную SVG-параллелограмм.
На холсте 280×220 получается мятный параллелограмм: верхнее ребро начинается у (60,60), нижнее на y=120 сдвинуто по x. В использованном CLI 7.1.2-31 нижние углы около (85.36,120) и (185.36,120), по фактическому sin(25°). Это результат команды skewX(25), а не пересчитанный вручную SVG-параллелограмм. Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Наклон системы по горизонтали: первый результатПример для указанного окружения
<?php
declare(strict_types=1);

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

При успешном выполнении создаётся skewx-basic.png 280×220. На холсте 280×220 получается мятный параллелограмм: верхнее ребро начинается у (60,60), нижнее на y=120 сдвинуто по x. В использованном CLI 7.1.2-31 нижние углы около (85.36,120) и (185.36,120), по фактическому sin(25°). Это результат команды skewX(25), а не пересчитанный вручную SVG-параллелограмм. Последняя и единственная строка консоли — skewx-basic.png. Все данные и холст создаются программой; точные пиксели сглаженных краёв зависят от рендерера.

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

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

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

$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$back = new ImagickDraw();
$back->setStrokeColor('#146c74');
$back->setStrokeWidth(4);
$back->setFillColor('#bdebe2');
$back->translate(60, 70);
$back->skewX(-20);
$back->rectangle(0, 0, 220, 70);
$image->drawImage($back);
$back->clear();
$content = new ImagickDraw();
$content->setStrokeColor('#146c74');
$content->setStrokeWidth(5);
$content->setFillColor('none');
$content->line(85, 95, 235, 95);
$content->line(85, 120, 195, 120);
$image->drawImage($content);
$content->clear();
$path = __DIR__ . '/skewed-badge.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'skewed-badge.png', "\n";
$image->clear();

Результат: skewed-badge.png 360×220. Мятная плашка имеет наклонные боковины, а две бирюзовые полосы остаются горизонтальными в координатах холста. Преобразование не попало в контент благодаря отдельному Draw; для реального текста аналогично отдельно выбирают шрифт и размещение, а не искажают читаемые данные вместе с декором. Последняя строка — skewed-badge.png.

Ошибки, альтернативы и стоимость

Нельзя без проверки подменять этот метод формулой SVG x'=x+tan(angle)·y. В прочитанном текущем MagickCore parser skewX использует sin(angle); конкретный путь PHP→MVG и версия рендерера важны. Здесь угол передаётся API, а для требуемого точного shear ниже объяснён affine. Не строим обещание native PHP по одной CLI-картинке.

Преобразование не увеличивает фиксированный холст автоматически. Рассчитывайте границы после всех операций и оставляйте поле под обводку, её стыки и сглаживание; вне холста результат обрезается. Проверка одних исходных width/height недостаточна после поворота или наклона. Настройка CTM и растеризация — разные этапы: основную работу задают площадь холста, сложность пути, число копий и сохранение PNG. Ограничивайте эти размеры, кешируйте готовый статичный рисунок, измеряйте полное задание вместо заявления, что одна матрица всегда быстрее нескольких вызовов.

В расширенных программах foreach обходит конфигурации/точки, if проверяет условие, throw сообщает о невозможном вводе. Новый Draw изолирует координаты одного компонента. См. массивы, условия и циклы, исключения.

Соседние инструменты: ImagickDraw::translate · ImagickDraw::rotate · ImagickDraw::scale · ImagickDraw::skewY · ImagickDraw::affine. Основы: геометрия, толщина/цвет края.

ImagickDraw::skewYНа условной схеме устройства нужна боковая грань с наклонными верхним и нижним рёбрами. Она должна примыкать к прямому фасаду, не искажая весь фасад вместе с собой.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::skewY(float $degrees): bool

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

SkewY задаёт градусный параметр вертикального наклона. Вертикальные стороны прямоугольника остаются вертикальными, а их высотное положение зависит от x; это отличается от rotate, где меняется направление обеих осей. Отдельный Draw ограничивает наклон только нужной гранью.

Сигнатура и параметры

ImagickDraw::skewY(float $degrees): bool
ПараметрТип и применение
$degreesfloat: параметр наклона в градусах, не число пикселей и не коэффициент матрицы. Для воспроизводимой геометрии с заданным dy/dx задайте rx в affine явно, учитывая систему координат.

Возвращаемый тип сигнатуры — bool; текущий PHP wrapper после записи преобразования возвращает true. Текст Return Values сохранённого Manual противоречиво говорит об отсутствии результата. Ни bool, ни сам Draw не являются готовой картинкой: drawImage наносит команды на пиксели, writeImage сохраняет файл. Нативный запуск PHP в этом пакете отложен, поэтому не выдаём проверку синтаксиса за подтверждение конкретной связки Imagick/ImageMagick.

Официальная доступность: PECL imagick 2, PECL imagick 3. В snapshot не объявлены отдельные изменения версии, удаление или deprecated-маркер данного метода. PHP-примеры используют синтаксис PHP 8.2+ и расширение imagick. Отсутствие changelog не доказывает тождественность всех версий рендерера.

Ошибки отдельно не перечислены в официальном snapshot. Неподходящий PHP-тип может вызвать TypeError; неверные/неполные коэффициенты — ImagickDrawException. Проверяйте конечность и прикладной диапазон заранее: возврат true не гарантирует, что фигура осталась в холсте. Растеризация и запись PNG могут дать ImagickException либо false; пример отдельно проверяет запись. Вырожденная матрица и слишком большой масштаб — геометрические проблемы, а не обязательно отвергаемые API значения.

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

Сохранены все исходные поля: описание, signature, параметры, return/failure, availability, changelog, сведения о примерах, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие нюансов в реализации.

{
  "id": "imagickdraw.skewy",
  "name": "ImagickDraw::skewY",
  "purpose_en": "Skews the current coordinate system in the vertical direction",
  "description_en": "Skews the current coordinate system in the vertical direction.",
  "signature": "ImagickDraw::skewY(float $degrees): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "degrees",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "degrees to skew"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::skewY example",
      "language": "php",
      "code_sha256": "25e15d423d888cd4b3a91734a5b8cf919fdf2f621b9308c0b76404e0994e8943"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.skewy.php",
  "official_page_sha256": "ad23a632cb884ce89634709e0067fe26edd6f32c924f9e11f9bc9dcdac6762c5",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/skewy.xml",
  "xml_sha256": "957491ef07d9ad36a75aa6d43602c9af0ca1746929e1b38cde806f432dae2459",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
На белом 280×220 — мятная карточка с вертикальными боковыми сторонами и наклонными верхним/нижним рёбрами. Левый край идёт от (60,40) до (60,100). В использованном CLI 7.1.2-31 правые углы около (160,22.37) и (160,82.37): при этом положительном параметре наклон направлен вверх вправо. Это наблюдение конкретной версии, не обещание одинакового результата всех native PHP-связок.
На белом 280×220 — мятная карточка с вертикальными боковыми сторонами и наклонными верхним/нижним рёбрами. Левый край идёт от (60,40) до (60,100). В использованном CLI 7.1.2-31 правые углы около (160,22.37) и (160,82.37): при этом положительном параметре наклон направлен вверх вправо. Это наблюдение конкретной версии, не обещание одинакового результата всех native PHP-связок. Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Наклон системы по вертикали: первый результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->translate(60, 40);
$draw->skewY(20);
$draw->rectangle(0, 0, 100, 60);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/skewy-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'skewy-basic.png', "\n";
$image->clear();

При успешном выполнении создаётся skewy-basic.png 280×220. На белом 280×220 — мятная карточка с вертикальными боковыми сторонами и наклонными верхним/нижним рёбрами. Левый край идёт от (60,40) до (60,100). В использованном CLI 7.1.2-31 правые углы около (160,22.37) и (160,82.37): при этом положительном параметре наклон направлен вверх вправо. Это наблюдение конкретной версии, не обещание одинакового результата всех native PHP-связок. Последняя и единственная строка консоли — skewy-basic.png. Все данные и холст создаются программой; точные пиксели сглаженных краёв зависят от рендерера.

Практическая задача: Собрать фасад и наклонную боковую грань устройства

В условной схеме оборудование имеет прямой фасад и боковую панель. Вертикальный наклон применим только к боковой панели, сохранив общую границу.

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

$image = new Imagick();
$image->newImage(320, 240, 'white');
$image->setImageFormat('png');
$front = new ImagickDraw();
$front->setStrokeColor('#146c74');
$front->setStrokeWidth(3);
$front->setFillColor('#bdebe2');
$front->rectangle(40, 80, 160, 200);
$image->drawImage($front);
$front->clear();
$side = new ImagickDraw();
$side->setStrokeColor('#146c74');
$side->setStrokeWidth(3);
$side->setFillColor('#f1c6b7');
$side->translate(160, 80);
$side->skewY(-25);
$side->rectangle(0, 0, 90, 120);
$image->drawImage($side);
$side->clear();
$path = __DIR__ . '/device-side.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'device-side.png', "\n";
$image->clear();

Результат: device-side.png 320×240. Мятный прямой фасад занимает (40,80)—(160,200), справа к нему примыкает персиковая грань с наклонными верхним и нижним рёбрами. Общая вертикальная граница x=160 не смещена. Это условная параллельная проекция двух плоских фигур, а не перспективная 3D-модель; величина наклона зависит от описанной реализации skewY. Последняя строка — device-side.png.

Ошибки, альтернативы и стоимость

Не обещайте симметричную пару формул tan для skewX и skewY. Прочитанный текущий parser skewY использует -tan(angle/2); это не та же формула, что SVG shear. Особенно опасны углы около особенностей тангенса и неподконтрольный внешний ввод. Для точного коэффициента rx и нужного знака предпочтителен явный affine.

Преобразование не увеличивает фиксированный холст автоматически. Рассчитывайте границы после всех операций и оставляйте поле под обводку, её стыки и сглаживание; вне холста результат обрезается. Проверка одних исходных width/height недостаточна после поворота или наклона. Настройка CTM и растеризация — разные этапы: основную работу задают площадь холста, сложность пути, число копий и сохранение PNG. Ограничивайте эти размеры, кешируйте готовый статичный рисунок, измеряйте полное задание вместо заявления, что одна матрица всегда быстрее нескольких вызовов.

В расширенных программах foreach обходит конфигурации/точки, if проверяет условие, throw сообщает о невозможном вводе. Новый Draw изолирует координаты одного компонента. См. массивы, условия и циклы, исключения.

Соседние инструменты: ImagickDraw::translate · ImagickDraw::rotate · ImagickDraw::scale · ImagickDraw::skewX · ImagickDraw::affine. Основы: геометрия, толщина/цвет края.

ImagickDraw::affineЭкспортёр хранит положение, масштаб и перекос как шесть чисел. Нужна одна понятная формула перехода от локальной точки к точке холста и проверка, что фигура помещается в размер отчёта.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::affine(array $affine): bool

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

Affine добавляет указанную матрицу к текущему преобразованию; он не сбрасывает историю Draw. На новом Draw действуют формулы x'=sx·x+ry·y+tx и y'=rx·x+sy·y+ty. Ключ ry отвечает за вклад y в x, ключ rx — за вклад x в y; это особенно легко перепутать при переносе позиционного массива из другой библиотеки.

Сигнатура и параметры

ImagickDraw::affine(array $affine): bool
ПараметрТип и применение
$affinearray с обязательными именованными ключами sx, rx, ry, sy, tx, ty и конечными числами. sx/sy — диагональные коэффициенты; rx/ry — перекрёстные, это не градусы; tx/ty — перенос. Единичная матрица: sx=sy=1, остальные 0; переданная единичная матрица не отменяет прежний CTM.

Возвращаемый тип сигнатуры — bool; текущий PHP wrapper после записи преобразования возвращает true. Текст Return Values сохранённого Manual противоречиво говорит об отсутствии результата. Ни bool, ни сам Draw не являются готовой картинкой: drawImage наносит команды на пиксели, writeImage сохраняет файл. Нативный запуск PHP в этом пакете отложен, поэтому не выдаём проверку синтаксиса за подтверждение конкретной связки Imagick/ImageMagick.

Официальная доступность: PECL imagick 2, PECL imagick 3. В snapshot не объявлены отдельные изменения версии, удаление или deprecated-маркер данного метода. PHP-примеры используют синтаксис PHP 8.2+ и расширение imagick. Отсутствие changelog не доказывает тождественность всех версий рендерера.

Ошибки отдельно не перечислены в официальном snapshot. Неподходящий PHP-тип может вызвать TypeError; неверные/неполные коэффициенты — ImagickDrawException. Проверяйте конечность и прикладной диапазон заранее: возврат true не гарантирует, что фигура осталась в холсте. Растеризация и запись PNG могут дать ImagickException либо false; пример отдельно проверяет запись. Вырожденная матрица и слишком большой масштаб — геометрические проблемы, а не обязательно отвергаемые API значения.

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

Сохранены все исходные поля: описание, signature, параметры, return/failure, availability, changelog, сведения о примерах, see-also и hashes источников. Пустое поле означает отсутствие сведений в snapshot, а не отсутствие нюансов в реализации.

{
  "id": "imagickdraw.affine",
  "name": "ImagickDraw::affine",
  "purpose_en": "Adjusts the current affine transformation matrix",
  "description_en": "Adjusts the current affine transformation matrix with the specified affine transformation matrix.",
  "signature": "ImagickDraw::affine(array $affine): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "affine",
      "type": "array",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "Affine matrix parameters"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::affine example",
      "language": "php",
      "code_sha256": "172c01d89032cc8dd11c48d604bb1d54c62ab999a19a85886fe87612a2841a4d"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.affine.php",
  "official_page_sha256": "c8422c263b7356fb2095f9ee7d18a051d49a51afd8fbcc2c87311e5161d40032",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/affine.xml",
  "xml_sha256": "6cbfe9e822c00f87d2113e9bf2c6f7bf7bf7ae285496d715c71930731b06fff7",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_style.py"
}
Мятный четырёхугольник имеет вершины (50,40), (170,65), (191,125), (71,100) на 280×220. В частности локальная точка (100,60) попадает в (191,125). Все шесть именованных ключей участвуют в описании преобразования.
Мятный четырёхугольник имеет вершины (50,40), (170,65), (191,125), (71,100) на 280×220. В частности локальная точка (100,60) попадает в (191,125). Все шесть именованных ключей участвуют в описании преобразования. Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
Шесть коэффициентов общего преобразования: первый результатПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$draw->affine(['sx' => 1.2, 'rx' => 0.25, 'ry' => 0.35, 'sy' => 1, 'tx' => 50, 'ty' => 40]);
$draw->rectangle(0, 0, 100, 60);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/affine-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'affine-basic.png', "\n";
$image->clear();

При успешном выполнении создаётся affine-basic.png 280×220. Мятный четырёхугольник имеет вершины (50,40), (170,65), (191,125), (71,100) на 280×220. В частности локальная точка (100,60) попадает в (191,125). Все шесть именованных ключей участвуют в описании преобразования. Последняя и единственная строка консоли — affine-basic.png. Все данные и холст создаются программой; точные пиксели сглаженных краёв зависят от рендерера.

Практическая задача: Проверить матрицу экспортёра и границы фигуры

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

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

$image = new Imagick();
$image->newImage(320, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(4);
$draw->setFillColor('#bdebe2');
$m = ['sx' => 0.8, 'rx' => -0.2, 'ry' => 0.3, 'sy' => 1, 'tx' => 70, 'ty' => 70];
$keys = ['sx', 'rx', 'ry', 'sy', 'tx', 'ty'];
if (count($m) !== 6) {
    throw new InvalidArgumentException('Нужно ровно шесть коэффициентов');
}
foreach ($keys as $key) {
    if (!array_key_exists($key, $m) || (!is_int($m[$key]) && !is_float($m[$key])) || !is_finite((float) $m[$key])) {
        throw new InvalidArgumentException('Неверный коэффициент ' . $key);
    }
}
$det = $m['sx'] * $m['sy'] - $m['rx'] * $m['ry'];
if (abs($det) < 0.000001) {
    throw new InvalidArgumentException('Экспортёр не принимает схлопнутые фигуры');
}
$xs = []; $ys = [];
foreach ([[0, 0], [160, 0], [160, 100], [0, 100]] as [$x, $y]) {
    $xs[] = $m['sx'] * $x + $m['ry'] * $y + $m['tx'];
    $ys[] = $m['rx'] * $x + $m['sy'] * $y + $m['ty'];
}
if (min($xs) < 8 || min($ys) < 8 || max($xs) > 312 || max($ys) > 212) {
    throw new InvalidArgumentException('Фигура выходит за выбранное поле');
}
$draw->affine($m);
$draw->rectangle(0, 0, 160, 100);
echo 'bbox=', number_format(min($xs), 0, '.', ''), ',', number_format(min($ys), 0, '.', ''),
    '..', number_format(max($xs), 0, '.', ''), ',', number_format(max($ys), 0, '.', ''), "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/validated-affine.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'validated-affine.png', "\n";
$image->clear();

Результат: validated-affine.png 320×220. Мятный четырёхугольник имеет вершины (70,70), (198,38), (228,138), (100,170). Проверены все углы, а не только левый верхний и ширина до преобразования. Порог determinant и поле 8 — политика этого ограниченного экспортёра, не универсальный стандарт проверки любых матриц; для других stroke, острых стыков и сложных путей нужен соответствующий запас/расчёт границ. Перед именем файла консоль: bbox=70,38..228,170. Последняя строка — validated-affine.png.

Именованные PHP коэффициенты sx=1.2, rx=0.25, ry=0.35, sy=1, tx=50, ty=40: точка (100,60) даёт (191,125); это модель нового Draw без предыдущего CTM
Именованные PHP коэффициенты sx=1.2, rx=0.25, ry=0.35, sy=1, tx=50, ty=40: точка (100,60) даёт (191,125); это модель нового Draw без предыдущего CTM Отдельная иллюстрация ImageMagick CLI, не подтверждение нативного выполнения PHP. Оси/подписи сравнений не добавлены в чистые PNG программ.
КлючВклад в формулу
sxМножитель x в x'
ryВклад y в x'
txДобавка к x'
rxВклад x в y'
syМножитель y в y'
tyДобавка к y'

Явный горизонтальный shear с коэффициентом k задаётся sx=1, sy=1, ry=k, rx=0, tx=ty=0; вертикальный — rx=k, ry=0. Если задача определена именно стандартным углом SVG shear, коэффициент вычисляют tan(deg2rad(angle)) и затем передают в нужное поле affine. Не путайте этот контролируемый расчёт с описанной реализацией методов skewX/skewY. Поле tx/ty можно сразу включить в ту же матрицу.

Ошибки, альтернативы и стоимость

Именованные PHP keys и позиционная запись MVG имеют разный порядок двух перекрёстных полей. Текущий DrawAffine сериализует sx,ry,rx,sy,tx,ty; PHP binding присваивает одноимённые поля напрямую, parser читает соответствующий порядок. Поэтому ориентируйтесь на формулы, а не слепую копию шести позиций из SVG/CSS/CLI. Affine сохраняет прямые и параллельность: произвольная перспективная трапеция не задаётся такими шестью числами.

Преобразование не увеличивает фиксированный холст автоматически. Рассчитывайте границы после всех операций и оставляйте поле под обводку, её стыки и сглаживание; вне холста результат обрезается. Проверка одних исходных width/height недостаточна после поворота или наклона. Настройка CTM и растеризация — разные этапы: основную работу задают площадь холста, сложность пути, число копий и сохранение PNG. Ограничивайте эти размеры, кешируйте готовый статичный рисунок, измеряйте полное задание вместо заявления, что одна матрица всегда быстрее нескольких вызовов.

В расширенных программах foreach обходит конфигурации/точки, if проверяет условие, throw сообщает о невозможном вводе. Новый Draw изолирует координаты одного компонента. См. массивы, условия и циклы, исключения.

Соседние инструменты: ImagickDraw::translate · ImagickDraw::rotate · ImagickDraw::scale · ImagickDraw::skewX · ImagickDraw::skewY. Основы: геометрия, толщина/цвет края.

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

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

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

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

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