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

Дерево руководства
Глава 331 · После первой геометрии
ImagickDraw: перенос, поворот, масштаб, наклон и affine
Шесть преобразований от простого переноса карточки до схемы из общего шаблона: локальные оси, порядок CTM, pivot, отражение, шесть коэффициентов и границы холста.
Разместить один шаблон без пересчёта всех вершин
Отчёту нужны несколько одинаковых карточек, указатель направления или условная схема сервисов. Удобно описать фигуру около своего локального начала, а положение, поворот и размер назначить отдельно. Тогда при переносе всей карточки не приходится исправлять координаты каждой рамки и строки.

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

<?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), а не угадываем по внешнему виду прямоугольника.

<?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 в координатах холста, чтобы они не унаследовали поворот последнего сервера.

<?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| Параметр | Тип и применение |
|---|---|
| $x | float: горизонтальное смещение в текущей системе координат. На новом Draw положительное x идёт вправо, отрицательное влево. |
| $y | float: вертикальное смещение. При обычной экранной оси 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"
}
<?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| Параметр | Тип и применение |
|---|---|
| $degrees | float: угол в градусах, не радианах. Например 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"
}
<?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, повернём локальную стрелку вдоль него и получим наконечник точно в конечной точке.
<?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| Параметр | Тип и применение |
|---|---|
| $x | float: множитель горизонтальной локальной оси. Отрицательное значение отражает её; 0 схлопывает горизонтальное измерение. |
| $y | float: множитель вертикальной локальной оси. Для сохранения пропорций обычно берут одинаковые положительные 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"
}
<?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| Параметр | Тип и применение |
|---|---|
| $degrees | float: параметр наклона в градусах. Не передавайте коэффициент 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"
}
<?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| Параметр | Тип и применение |
|---|---|
| $degrees | float: параметр наклона в градусах, не число пикселей и не коэффициент матрицы. Для воспроизводимой геометрии с заданным 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"
}
<?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| Параметр | Тип и применение |
|---|---|
| $affine | array с обязательными именованными ключами 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"
}
<?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.

| Ключ | Вклад в формулу |
|---|---|
| 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. Основы: геометрия, толщина/цвет края.
Источники и обсуждения
- ImagickDraw::affine
- ImagickDraw::rotate
- ImagickDraw::scale
- ImagickDraw::skewX
- ImagickDraw::skewY
- ImagickDraw::translate
- SVG coordinate systems and matrix composition
- ImageMagick MVG transformations
- PHP affine keys and method binding
- DrawingWand affine serialization
- ImageMagick MVG parser, CTM and skew implementation
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


