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

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

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

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

Глава 336 · После первой надписи

ImagickDraw: расположение подписей и сглаживание букв

Разместить заголовок, подписи и суммы на карточке: выбрать понятную опору, получить общий правый край и увидеть разницу сглаживания в готовом PNG.

Поставить статус в угол карточки

В готовом PNG статус «Готово» должен быть виден у верхнего левого края с понятным отступом. Сначала получим именно такую подпись. Затем научимся держать суммы у общего правого поля, подписи — в центре небольших карточек, а края букв — достаточно гладкими.

Белый PNG 320×180: «Готово» возле верхнего левого угла. NorthWest и Undefined alignment, смещение annotation (20,20), Open Sans 24 пункта при 72
Белый PNG 320×180: «Готово» возле верхнего левого угла. NorthWest и Undefined alignment, смещение annotation (20,20), Open Sans 24 пункта при 72

В архиве приложен тот же неизменённый Open Sans Regular 1.10 с кириллицей и Apache License 2.0, что в уроке о первой надписи, шрифте и пунктах. Распакуйте все файлы: font.php восстанавливает font.ttf из font.ttf.b64 и возвращает путь в $font, ничего не скачивая и не устанавливая. Рядом находятся полная лицензия и сведения об источнике. Папка должна быть доступна для записи.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_NORTHWEST);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->annotation(20, 20, 'Готово');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/first-corner-caption.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-corner-caption.png', "\n";
$image->clear();

Результат: first-corner-caption.png 320×180 с бирюзовым «Готово» возле верхнего левого угла. NorthWest использует (20,20) как смещение от привязки при Undefined alignment; это не обычная базовая линия y=20. Консоль — first-corner-caption.png. Font.ttf восстанавливается рядом из прилагаемых данных. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

$draw — переменная с объектом команд; -> вызывает его метод. Imagick::GRAVITY_NORTHWEST — именованная константа привязки, Imagick::ALIGN_UNDEFINED оставляет расчёт gravity без явного выравнивания. В annotation(20,20,'Готово') первые два аргумента задают смещение в этой политике, третий — текст. Точка с запятой завершает команду. Font/плотность задаются до текста; drawImage выполняет очередь, writeImage сохраняет файл. True/false у режима — boolean, а не строка в кавычках. Подробнее — очередь команд и вызов с аргументами.

Выбрать одну понятную опору для текста

В обычной политике Undefined gravity и Left alignment точка (20,60) означает начало строки и базовую линию y=60; направляющие относятся к схеме
В обычной политике Undefined gravity и Left alignment точка (20,60) означает начало строки и базовую линию y=60; направляющие относятся к схеме

Базовая линия — линия, на которой стоят буквы; верх их видимого рисунка обычно находится выше, а выносные элементы могут уходить ниже. В PHP константа Imagick::GRAVITY_FORGET (0) соответствует понятию UndefinedGravity в native ImageMagick; константы GRAVITY_UNDEFINED в проверенном PHP-расширении нет. При GRAVITY_FORGET и явном ALIGN_LEFT/CENTER/RIGHT y остаётся базовой линией, а x становится началом, центром или концом типографской строки. При gravity-привязке и ALIGN_UNDEFINED координаты трактуются относительно части холста. Поэтому нельзя без объяснения назвать любое y верхним краем или любой x левым началом текста.

Три фактических случая текущего renderer: Center+Undefined при (0,0) располагает «Заказ» по центру; Center+Center при (0,0) оставляет панель белой; Undefined+Center при (160,90) даёт рабочую строку на базовой линии 90
Три фактических случая текущего renderer: Center+Undefined при (0,0) располагает «Заказ» по центру; Center+Center при (0,0) оставляет панель белой; Undefined+Center при (160,90) даёт рабочую строку на базовой линии 90

Сочетание двух настроек требует понимания их взаимодействия. В прочитанном ImageMagick annotate.c сначала вычисляется gravity, затем explicit alignment заново задаёт смещения. Отсюда наблюдаемое поведение трёх панелей; это конкретная связка renderer и шрифта, а не обещание всех версий PHP Imagick. В своих программах ниже используем две явные политики: привязка к холсту + Undefined alignment, либо Undefined gravity + выравнивание относительно известной базовой точки. Они не складываются как независимые CSS-оси.

ЗадачаGravityAlignment и координаты
Короткий статус у углаNORTHWEST / SOUTHEASTUNDEFINED; (20,20) — отступ от привязки
Общая правая колонка ценFORGET (native Undefined)RIGHT; x=340 — опора правого края, y — baseline
Подпись центра отдельного элементаFORGET (native Undefined)CENTER; x — центр элемента, y — baseline
Подпись в центре холстаCENTERUNDEFINED; в простом контексте (0,0) — без дополнительного смещения

Подписать центры двух отдельных элементов

У двух карточек центры x=100 и x=300. Здесь нужна опора элемента, а не центр всего холста. В явной baseline-политике задаём Center alignment и используем координаты центров; заголовки и статусы стоят на разных базовых линиях.

PNG 400×200: две мятные карточки (20,20)—(180,180) и (220,20)—(380,180). Подписи центрированы на x=100/300, заголовки y=75, статусы y=115
PNG 400×200: две мятные карточки (20,20)—(180,180) и (220,20)—(380,180). Подписи центрированы на x=100/300, заголовки y=75, статусы y=115
Подписать склад и доставку в центрах их карточекПример для указанного окружения
<?php
declare(strict_types=1);

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(400, 200, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(20, 20, 180, 180);
$background->rectangle(220, 20, 380, 180);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(20);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_CENTER);
$draw->setTextAntialias(true);
$draw->annotation(100, 75, 'Склад');
$draw->annotation(300, 75, 'Доставка');
$draw->setFontSize(16);
$draw->setFillColor('#c25732');
$draw->annotation(100, 115, '12 мест');
$draw->annotation(300, 115, 'Готово');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/component-centered-captions.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'component-centered-captions.png', "\n";
$image->clear();

Результат: component-centered-captions.png 400×200 с двумя мятными панелями. «Склад» и «Доставка» в 20 пунктов стоят на y=75 относительно x=100 и x=300. Оранжевые «12 мест» и «Готово» в 16 пунктов — на y=115. Используется Undefined gravity и Center alignment. Консоль — component-centered-captions.png. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

Методы не знают границы этих карточек автоматически: координаты центров выбраны из нашего макета. При длинном адресе или фамилии нужна проверка ширины, затем перенос/сокращение. Следующий инструмент — измерение строки через Imagick::queryFontMetrics.

Смотреть на край буквы, а не на размытую миниатюру

Один и тот же «Заказ», 24 пункта при 72: слева AA on, справа AA off, непрозрачный бирюзовый на белом. Различается покрытие крайних пикселей
Один и тот же «Заказ», 24 пункта при 72: слева AA on, справа AA off, непрозрачный бирюзовый на белом. Различается покрытие крайних пикселей
Одинаковый фрагмент 16×16 из (20,43) увеличен в 8 раз ближайшим соседом: слева сглаживание включено, справа выключено; новые цвета при увеличении не добавлены
Одинаковый фрагмент 16×16 из (20,43) увеличен в 8 раз ближайшим соседом: слева сглаживание включено, справа выключено; новые цвета при увеличении не добавлены

Сглаживание делает частично покрытые буквой пиксели промежуточными по цвету между текстом и фоном. Оно не является размытием всего PNG. В этой модели сравниваются одинаковые настройки кроме AA, а крупный фрагмент показывает существующие пиксели. Отключение AA не отменяет полупрозрачную заливку, последующее уменьшение изображения или сглаживание просмотрщика. Внешний вид проверяйте при масштабе 100%; не пытайтесь диагностировать его только значением getter.

Жирность букв, обводка, размер и поддержка символов — отдельные причины качества. В наших примерах stroke явно none. Размер задан в пунктах, а не точной высотой окрашенных глифов. Плотность 72 установлена первой командой каждого нового текстового Draw, как объяснено в базовой главе.

Читать настройку полезно до рисования

Getter читает конфигурацию Draw: gravity/int, alignment/int, text-antialias/bool. Это не координаты, bounding box, ширина строки или оценка резкости PNG
Getter читает конфигурацию Draw: gravity/int, alignment/int, text-antialias/bool. Это не координаты, bounding box, ширина строки или оценка резкости PNG

Три getter полезны для переноса темы, проверки политики и временного восстановления. Пара gravity/alignment описывает способ трактовки координат; AA описывает край глифов. Ни один из getter не отвечает на вопрос «поместилась ли произвольная строка?». Для этого надо учитывать font, плотность, размер, метрики, трансформацию, область холста и последующий просмотр.

Числа enum выбирайте через именованные константы; не делайте из нуля автоматическую ошибку. У AA false — нормальное выключенное состояние. У setter true означает завершение записи настройки в текущем wrapper, а не подтверждение картинки. Сохранённые исходные страницы Manual содержат bool signature и противоречивое prose об отсутствии результата; здесь объяснено поведение прочитанного binding и отдельно проверено реальное исполнение всех примеров главы.

Собрать карточку с заголовком, суммами и статусом

Получатель отчёта должен сразу увидеть номер заказа, названия строк и суммы у правого поля. Фон рисуется отдельно. Для заголовка и статуса используем привязку к холсту, для колонок — явные базовые линии. Каждый новый текстовый Draw настраивается с нуля, поэтому не наследует случайную gravity или преобразование другого компонента.

PNG 480×240: мятная панель, «Заказ № 42» у верхнего левого поля, две строки названий слева и сумм справа, «Готово» у нижнего правого поля
PNG 480×240: мятная панель, «Заказ № 42» у верхнего левого поля, две строки названий слева и сумм справа, «Готово» у нижнего правого поля
Сохранить карточку с согласованными опорамиПример для указанного окружения
<?php
declare(strict_types=1);

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(480, 240, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(20, 20, 460, 220);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_NORTHWEST);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->annotation(40, 35, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$labels = new ImagickDraw();
$labels->setResolution(72, 72);
$labels->setFont($font);
$labels->setFontSize(18);
$labels->setStrokeColor('none');
$labels->setFillColor('#146c74');
$labels->setGravity(Imagick::GRAVITY_FORGET);
$labels->setTextAlignment(Imagick::ALIGN_LEFT);
$labels->setTextAntialias(true);
$labels->annotation(40, 110, 'Комплект');
$labels->annotation(40, 150, 'Доставка');
$image->drawImage($labels);
$labels->clear();
$amounts = new ImagickDraw();
$amounts->setResolution(72, 72);
$amounts->setFont($font);
$amounts->setFontSize(18);
$amounts->setStrokeColor('none');
$amounts->setFillColor('#146c74');
$amounts->setGravity(Imagick::GRAVITY_FORGET);
$amounts->setTextAlignment(Imagick::ALIGN_RIGHT);
$amounts->setTextAntialias(true);
$amounts->annotation(440, 110, '1 250 руб.');
$amounts->annotation(440, 150, '300 руб.');
$image->drawImage($amounts);
$amounts->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(14);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->annotation(40, 30, 'Готово');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/positioned-order-report.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'positioned-order-report.png', "\n";
$image->clear();

Результат: positioned-order-report.png 480×240 с мятной панелью (20,20)—(460,220). Заголовок 24 пункта: NW/Undefined, смещение (40,35). «Комплект»/«Доставка» и суммы «1 250 руб.»/«300 руб.» имеют baseline y=110/150: названия Left с x=40, суммы Right с x=440, gravity Undefined. Статус «Готово» 14 пунктов: SE/Undefined, смещение (40,30). Во всех текстовых контекстах AA true, full Open Sans и плотность 72. Консоль — positioned-order-report.png. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

Упражнение: замените цену на «9 950 руб.», сохранив её правую опору и остальные подписи. Решение: изменить только текст annotation у суммы; x=440 и ALIGN_RIGHT остаются. Затем попробуйте очень длинное название: правильный следующий шаг — измерение и перенос, а не смешивание двух центрирований. Для другого размера холста проверьте поля, ширину строк и положение внутренних колонок.

Дальше — измерение, преобразование или ограничение области

  • Для угла холста: явная gravity и Undefined alignment. Для собственной базовой точки: Undefined gravity и явный alignment.
  • Getter читает конфигурацию; ноль enum и false AA не равны ошибке. Видимость и размеры строки проверяются отдельно.
  • AA управляет краем глифов; прозрачность, масштабирование и шрифт продолжают влиять на готовый файл.
  • Каждый архив содержит неизменённый открытый шрифт, helper, лицензию и metadata; зависимость от системного Arial отсутствует.

Продолжение: измерение строки через Imagick::queryFontMetrics, поворот и другие преобразования, ограничение рисования окном, геометрические фигуры. Ограничивающее окно не делает длинную фразу вписанной: обрезанные буквы могут стать нечитаемыми.

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

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

ImagickDraw::getGravityПолучив тему чужого компонента, нужно узнать, к какой части холста она привязывает текст, прежде чем повторять её или исправлять конфликтующие настройки.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::getGravity(): int

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

Getter читает enum gravity конкретного Draw. NORTHWEST — верхний левый угол, CENTER — центр, SOUTHEAST — нижний правый. Это сохранённая настройка, а не координаты букв или доказательство видимости. Важно прочитать также alignment: явное выравнивание может изменить способ вычисления координат.

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

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

ImagickDraw::getGravity(): int

Аргументов нет: скобки пустые, метод читает настройку конкретного Draw.

int: одна из Imagick::GRAVITY_*; официальный текст допускает 0, когда gravity не задана. GRAVITY_FORGET/ноль — обычное отсутствие явной привязки, не false/ошибка. Не закрепляйте произвольное числовое значение enum в конфигурации без имени константы.

Доступность официальной записи: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в этой исходной записи пусты. Примеры рассчитаны на PHP 8.2+ с imagick и приложенным шрифтом; исторические версии исправлений без источника не приписываются.

Краткие официальные страницы не перечисляют отдельные ошибки этих методов и отмечают неполноту документации. Текущий wrapper setter не обещает проверку любого int enum: выбирайте именованные константы из собственной разрешённой политики. Отсутствующий font, неподдержанный символ, отказ drawImage или записи файла — отдельные ошибки общего процесса. False у AA getter и ноль у enum getter сами по себе не повод ловить исключение.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setGravity(Imagick::GRAVITY_SOUTHEAST);
$gravity = $theme->getGravity();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->setGravity($gravity);
$draw->annotation(20, 20, 'Готово');
echo 'gravity=SouthEast; type=', get_debug_type($gravity), "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-corner.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-corner.png', "\n";
$image->clear();

Результат: copied-corner.png 320×180. Бирюзовое «Готово» находится возле правого нижнего угла, с отступами 20 в принятом gravity-контексте. Из темы скопирован int enum, а не пиксели: новый Draw отдельно получил шрифт, плотность, цвет, ALIGN_UNDEFINED и прочитанную привязку. Перед именем файла консоль: gravity=SouthEast; type=int. Последняя строка — copied-corner.png. Все четыре файла подготовки шрифта включены в архив. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Тема содержит Center и явный Right одновременно. По одному getGravity нельзя понять, где окажется текст: сначала читаем обе настройки, затем сознательно выбираем привязку к холсту. В новый Draw переносится только разрешённая gravity, а alignment становится Undefined.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setGravity(Imagick::GRAVITY_CENTER);
$theme->setTextAlignment(Imagick::ALIGN_RIGHT);
$gravity = $theme->getGravity();
$alignment = $theme->getTextAlignment();
$allowed = [Imagick::GRAVITY_NORTHWEST, Imagick::GRAVITY_CENTER, Imagick::GRAVITY_SOUTHEAST];
if (!in_array($gravity, $allowed, true)) {
    $gravity = Imagick::GRAVITY_NORTHWEST;
}
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->setGravity($gravity);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->annotation(0, 0, 'Заказ');
echo 'policy=canvas-anchor; inherited-alignment=', $alignment === Imagick::ALIGN_RIGHT ? 'Right' : 'other', "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/normalized-anchor-policy.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'normalized-anchor-policy.png', "\n";
$image->clear();

Результат: normalized-anchor-policy.png 320×180. «Заказ» размещён возле центра холста с gravity Center и Undefined alignment. Мы не рисуем ошибочную исходную пару и не выдаём её getter за доказательство результата. Для иной привязки потребуются соответствующие осмысленные отступы, а не автоматическое применение (0,0). Перед именем файла консоль: policy=canvas-anchor; inherited-alignment=Right. Последняя строка — normalized-anchor-policy.png. Font.php получает данные из этого же архива. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Не делайте вывод «getter вернул Center, значит текст точно по центру». Результат зависит ещё от alignment, координат, метрик, трансформации и границ изображения. Для переноса настройки задайте её новому Draw явно; getter сам не клонирует шрифт или очередь. Пример нормализации читает пару настроек и выбирает одну понятную политику.

Чтение настройки не выполняет растеризацию; основная работа с шрифтом, глифами и пикселями происходит при рисовании. Ограничивайте размеры холста и внешнего текста. Для точного вписывания используйте измерение строки через Imagick::queryFontMetrics, а не бесконечное уменьшение размера или угадывание границ по enum. Сложное многострочное оформление — отдельная задача макета; браузерный текст в HTML может быть удобнее, если PNG не требуется.

В расширенных программах foreach повторяет команды для строк, === строго сравнивает значение/тип, in_array(..., true) проверяет разрешённые константы, array_key_exists выбирает опору из таблицы, ? : формирует короткую подпись on/off. См. условия и перебор и массив с ключами.

Соседние настройки: ImagickDraw::setGravity · ImagickDraw::getTextAlignment · ImagickDraw::setTextAlignment · ImagickDraw::getTextAntialias · ImagickDraw::setTextAntialias. Устройство очереди — Draw и отдельные изображения; изменения системы координат — преобразования.

ImagickDraw::setGravityЗаголовок должен держаться у верхнего края, а короткий статус — у нижнего правого угла карточки, даже когда начало строки не хочется вычислять вручную.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::setGravity(int $gravity): bool

Заголовок должен держаться у верхнего края, а короткий статус — у нижнего правого угла карточки, даже когда начало строки не хочется вычислять вручную.

Gravity выбирает опору относительно холста для следующих текстовых команд. В уроке с такой политикой alignment явно Undefined: annotation получает смещения относительно выбранной привязки. Это уже другая трактовка x/y, чем обычное начало строки и базовая линия при Undefined gravity. Для углов отступы направлены внутрь холста; центральные привязки используют смещения от центра.

Привязать подпись к части холста: рисунок результата или поясняющая модель
Привязать подпись к части холста: рисунок результата или поясняющая модель

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

ImagickDraw::setGravity(int $gravity): bool
ПараметрЧто передать и зачем
$gravityint, обязательная именованная константа Imagick::GRAVITY_*. NORTH/NORTHEAST/EAST/SOUTHEAST/SOUTH/SOUTHWEST/WEST/NORTHWEST/CENTER выбирают одну из девяти привязок. FORGET (нулевое native UndefinedGravity) убирает явную gravity-политику. Это не CSS-строка 'center', угол поворота или ширина поля.

bool по сигнатуре; текущий PHP wrapper вызывает void DrawSetGravity и возвращает true. В официальном prose сказано, что значения нет; оба исходных поля сохранены. True не подтверждает правильность произвольного int и не означает, что текст уже попал в PNG.

Доступность официальной записи: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в этой исходной записи пусты. Примеры рассчитаны на PHP 8.2+ с imagick и приложенным шрифтом; исторические версии исправлений без источника не приписываются.

Краткие официальные страницы не перечисляют отдельные ошибки этих методов и отмечают неполноту документации. Текущий wrapper setter не обещает проверку любого int enum: выбирайте именованные константы из собственной разрешённой политики. Отсутствующий font, неподдержанный символ, отказ drawImage или записи файла — отдельные ошибки общего процесса. False у AA getter и ноль у enum getter сами по себе не повод ловить исключение.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_NORTHWEST);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->annotation(20, 20, 'Готово');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/northwest-caption.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'northwest-caption.png', "\n";
$image->clear();

Результат: northwest-caption.png 320×180. Бирюзовое «Готово» расположено возле левого верхнего угла. В этой политике NORTHWEST и ALIGN_UNDEFINED координаты (20,20) задают смещение от привязки, а не базовую линию y=20. Верх окрашенных букв зависит от метрик шрифта; не выводите универсальную формулу из одной картинки. Последняя строка — northwest-caption.png. Все четыре файла подготовки шрифта включены в архив. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

В карточке короткий заголовок нужен сверху слева, а статус — снизу справа. Привязка к углу избавляет от вычитания ширины заранее известного короткого слова из ширины холста; длинные строки всё равно потребуют проверки границ.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(400, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_NORTHWEST);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->annotation(20, 20, 'Заказ № 42');
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);
$draw->setFontSize(18);
$draw->setFillColor('#c25732');
$draw->annotation(20, 20, 'Готово');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/opposite-corner-captions.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'opposite-corner-captions.png', "\n";
$image->clear();

Результат: opposite-corner-captions.png 400×200. Заголовок «Заказ № 42» бирюзовый, 24 пункта, у верхнего левого угла; оранжевый статус «Готово», 18 пунктов, у нижнего правого. Отступы каждой annotation равны (20,20) в её привязке. Изменение gravity перед второй командой не переставляет уже записанный заголовок. Последняя строка — opposite-corner-captions.png. Font.php получает данные из этого же архива. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Не складывайте без проверки gravity Center и ALIGN_CENTER: это не две независимые оси CSS. В текущем изученном renderer explicit alignment пересчитывает offset после gravity. Для базовых примеров выбирайте одну из двух явных политик. Отступ 20 при NorthWest не надо называть базовой линией y=20. Повороты, page offsets и многострочный текст требуют отдельного разбора, а не переноса одной формулы на все случаи.

Чтение настройки не выполняет растеризацию; основная работа с шрифтом, глифами и пикселями происходит при рисовании. Ограничивайте размеры холста и внешнего текста. Для точного вписывания используйте измерение строки через Imagick::queryFontMetrics, а не бесконечное уменьшение размера или угадывание границ по enum. Сложное многострочное оформление — отдельная задача макета; браузерный текст в HTML может быть удобнее, если PNG не требуется.

В расширенных программах foreach повторяет команды для строк, === строго сравнивает значение/тип, in_array(..., true) проверяет разрешённые константы, array_key_exists выбирает опору из таблицы, ? : формирует короткую подпись on/off. См. условия и перебор и массив с ключами.

Соседние настройки: ImagickDraw::getGravity · ImagickDraw::getTextAlignment · ImagickDraw::setTextAlignment · ImagickDraw::getTextAntialias · ImagickDraw::setTextAntialias. Устройство очереди — Draw и отдельные изображения; изменения системы координат — преобразования.

ImagickDraw::getTextAlignmentСтиль суммы или заголовка приходит из темы: нужно сохранить его смысл в новом компоненте и выбрать соответствующее место для строки.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::getTextAlignment(): int

Стиль суммы или заголовка приходит из темы: нужно сохранить его смысл в новом компоненте и выбрать соответствующее место для строки.

Getter возвращает enum Left/Center/Right либо неопределённое значение. Он не измеряет ни ширину строки, ни её правый пиксель, ни прямоугольник. В нашей явной baseline-политике Left начинает строку около x, Center располагает типографскую ширину вокруг x, Right заканчивает её около x.

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

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

ImagickDraw::getTextAlignment(): int

Аргументов нет: скобки пустые, метод читает настройку конкретного Draw.

int — Imagick::ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT; официальный текст предусматривает 0 при отсутствии выравнивания. ALIGN_UNDEFINED не следует трактовать как аварийный false. Число — настройка, а не x, не ширина и не число букв.

Доступность официальной записи: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в этой исходной записи пусты. Примеры рассчитаны на PHP 8.2+ с imagick и приложенным шрифтом; исторические версии исправлений без источника не приписываются.

Краткие официальные страницы не перечисляют отдельные ошибки этих методов и отмечают неполноту документации. Текущий wrapper setter не обещает проверку любого int enum: выбирайте именованные константы из собственной разрешённой политики. Отсутствующий font, неподдержанный символ, отказ drawImage или записи файла — отдельные ошибки общего процесса. False у AA getter и ноль у enum getter сами по себе не повод ловить исключение.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setTextAlignment(Imagick::ALIGN_RIGHT);
$alignment = $theme->getTextAlignment();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->setTextAlignment($alignment);
$draw->annotation(300, 90, '1 250 руб.');
echo 'alignment=Right; type=', get_debug_type($alignment), "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-amount-alignment.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-amount-alignment.png', "\n";
$image->clear();

Результат: copied-amount-alignment.png 320×180. Цена выровнена правым краем относительно опоры x=300, базовая линия y=90. Getter дал настройку Right, которая явно передана новому Draw с GRAVITY_FORGET; ширина цены не измерялась и готовая надпись не копировалась. Перед именем файла консоль: alignment=Right; type=int. Последняя строка — copied-amount-alignment.png. Все четыре файла подготовки шрифта включены в архив. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Компонент получил выравнивание из темы, но сам выбирает безопасную опору в карточке: Left получает x=20, Center — x=160, Right — x=300. Undefined приводим к Left явной политикой приложения, не называя ноль ошибкой native API.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setTextAlignment(Imagick::ALIGN_CENTER);
$alignment = $theme->getTextAlignment();
$anchors = [Imagick::ALIGN_LEFT => 20, Imagick::ALIGN_CENTER => 160, Imagick::ALIGN_RIGHT => 300];
if (!array_key_exists($alignment, $anchors)) {
    $alignment = Imagick::ALIGN_LEFT;
}
$x = $anchors[$alignment];
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->setTextAlignment($alignment);
$draw->annotation($x, 90, 'Заголовок');
echo 'anchor-x=', $x, '; policy=explicit-baseline', "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/alignment-aware-anchor.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'alignment-aware-anchor.png', "\n";
$image->clear();

Результат: alignment-aware-anchor.png 320×180. «Заголовок» центрируется вокруг x=160 на базовой линии y=90. Прочитанный int используется для выбора координаты и setter нового Draw. Это короткий известный текст; таблица опор сама по себе не вписывает произвольную длинную фразу. Перед именем файла консоль: anchor-x=160; policy=explicit-baseline. Последняя строка — alignment-aware-anchor.png. Font.php получает данные из этого же архива. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Передача Center в новый объект без выбора координат не создаёт готовый макет. Если gravity остаётся иной, результат может отличаться от ожидаемого. Примеры явно ставят GRAVITY_FORGET, выбирают anchor и затем применяют считанный enum. Для произвольной строки дополнительно нужны метрики/перенос.

Чтение настройки не выполняет растеризацию; основная работа с шрифтом, глифами и пикселями происходит при рисовании. Ограничивайте размеры холста и внешнего текста. Для точного вписывания используйте измерение строки через Imagick::queryFontMetrics, а не бесконечное уменьшение размера или угадывание границ по enum. Сложное многострочное оформление — отдельная задача макета; браузерный текст в HTML может быть удобнее, если PNG не требуется.

В расширенных программах foreach повторяет команды для строк, === строго сравнивает значение/тип, in_array(..., true) проверяет разрешённые константы, array_key_exists выбирает опору из таблицы, ? : формирует короткую подпись on/off. См. условия и перебор и массив с ключами.

Соседние настройки: ImagickDraw::getGravity · ImagickDraw::setGravity · ImagickDraw::setTextAlignment · ImagickDraw::getTextAntialias · ImagickDraw::setTextAntialias. Устройство очереди — Draw и отдельные изображения; изменения системы координат — преобразования.

ImagickDraw::setTextAlignmentСуммы разной длины должны иметь общий правый край, а подписи двух карточек — находиться вокруг их центров.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::setTextAlignment(int $align): bool

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

В явной политике GRAVITY_FORGET x/y annotation означают опору и базовую линию. ALIGN_LEFT располагает строку от x, ALIGN_CENTER — вокруг x, ALIGN_RIGHT — перед x. Центрируется типографская ширина, поэтому окрашенные границы не обязаны быть математически симметричны. Выравнивание не переносит длинный текст автоматически и не выравнивает изображение как HTML-блок.

Выравнивать строку относительно известной опоры: рисунок результата или поясняющая модель
Выравнивать строку относительно известной опоры: рисунок результата или поясняющая модель

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

ImagickDraw::setTextAlignment(int $align): bool
ПараметрЧто передать и зачем
$alignint, обязательная Imagick::ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT либо ALIGN_UNDEFINED. В baseline-политике явно выберите одну из первых трёх. Это не строка 'right' и не boolean. Undefined позволяет сохранить обработку gravity и не добавляет ещё одно центрирование.

bool: текущий PHP wrapper вызывает void DrawSetTextAlignment и возвращает true; prose Manual об отсутствии значения сохранено как исходное. Этот bool не содержит ширину строки и не доказывает видимый результат или допустимость произвольного числа.

Доступность официальной записи: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в этой исходной записи пусты. Примеры рассчитаны на PHP 8.2+ с imagick и приложенным шрифтом; исторические версии исправлений без источника не приписываются.

Краткие официальные страницы не перечисляют отдельные ошибки этих методов и отмечают неполноту документации. Текущий wrapper setter не обещает проверку любого int enum: выбирайте именованные константы из собственной разрешённой политики. Отсутствующий font, неподдержанный символ, отказ drawImage или записи файла — отдельные ошибки общего процесса. False у AA getter и ноль у enum getter сами по себе не повод ловить исключение.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
foreach ([[Imagick::ALIGN_LEFT, 50], [Imagick::ALIGN_CENTER, 95], [Imagick::ALIGN_RIGHT, 140]] as [$alignment, $baseline]) {
    $draw->setTextAlignment($alignment);
    $draw->annotation(160, $baseline, 'Заказ');
}
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/three-anchor-alignments.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'three-anchor-alignments.png', "\n";
$image->clear();

Результат: three-anchor-alignments.png 320×180. Три строки «Заказ» на базовых линиях 50, 95 и 140. У первой начало около x=160, вторая центрируется относительно x=160, третья заканчивается около x=160. Края окрашенных букв могут немного отличаться от типографской ширины из-за боковых полей глифов. Gravity явно Undefined. Последняя строка — three-anchor-alignments.png. Все четыре файла подготовки шрифта включены в архив. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

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

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(360, 180, 'white');
$image->setImageFormat('png');
$labels = new ImagickDraw();
$labels->setResolution(72, 72);
$labels->setFont($font);
$labels->setFontSize(18);
$labels->setStrokeColor('none');
$labels->setFillColor('#146c74');
$labels->setGravity(Imagick::GRAVITY_FORGET);
$labels->setTextAlignment(Imagick::ALIGN_LEFT);
$labels->setTextAntialias(true);
$labels->annotation(20, 50, 'Товар');
$labels->annotation(20, 95, 'Доставка');
$labels->annotation(20, 140, 'Скидка');
$image->drawImage($labels);
$labels->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(18);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_RIGHT);
$draw->setTextAntialias(true);
$draw->setTextAlignment(Imagick::ALIGN_RIGHT);
$draw->annotation(340, 50, '1 250 руб.');
$draw->annotation(340, 95, '300 руб.');
$draw->annotation(340, 140, '75 руб.');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/right-aligned-amounts.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'right-aligned-amounts.png', "\n";
$image->clear();

Результат: right-aligned-amounts.png 360×180. Слева названия на x=20, справа суммы разной длины с общей правой опорой x=340. Базовые линии строк — 50, 95, 140. Короткие русские названия и суммы помещаются в выбранный макет; код не рассчитывает максимальную ширину внешних данных. Последняя строка — right-aligned-amounts.png. Font.php получает данные из этого же архива. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Для одной общей горизонтальной линии сравнения задайте одинаковую x-опору и разные baseline y. Right при x=0 отправит большую часть текста влево за холст. Не дополняйте цену пробелами для выравнивания: даже у одного шрифта символы могут иметь разную ширину. Для центрированного многострочного блока с левыми строками нужен отдельный макет/измерение, а не обещание любого сочетания gravity и align.

Чтение настройки не выполняет растеризацию; основная работа с шрифтом, глифами и пикселями происходит при рисовании. Ограничивайте размеры холста и внешнего текста. Для точного вписывания используйте измерение строки через Imagick::queryFontMetrics, а не бесконечное уменьшение размера или угадывание границ по enum. Сложное многострочное оформление — отдельная задача макета; браузерный текст в HTML может быть удобнее, если PNG не требуется.

В расширенных программах foreach повторяет команды для строк, === строго сравнивает значение/тип, in_array(..., true) проверяет разрешённые константы, array_key_exists выбирает опору из таблицы, ? : формирует короткую подпись on/off. См. условия и перебор и массив с ключами.

Соседние настройки: ImagickDraw::getGravity · ImagickDraw::setGravity · ImagickDraw::getTextAlignment · ImagickDraw::getTextAntialias · ImagickDraw::setTextAntialias. Устройство очереди — Draw и отдельные изображения; изменения системы координат — преобразования.

ImagickDraw::getTextAntialiasНастройку сглаживания надо перенести из темы либо временно изменить для отдельной технической метки и вернуть перед обычной подписью.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::getTextAntialias(): bool

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

Getter читает bool text-antialias у Draw. Он не распознаёт резкость готового PNG, не подсчитывает промежуточные цвета и не проверяет, как браузер масштабировал изображение. False означает штатно выключенное сглаживание текста.

Прочитать и восстановить режим края букв: рисунок результата или поясняющая модель
Прочитать и восстановить режим края букв: рисунок результата или поясняющая модель

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

ImagickDraw::getTextAntialias(): bool

Аргументов нет: скобки пустые, метод читает настройку конкретного Draw.

bool: true — сглаживание текста включено, false — выключено. Возвращённое false не является ошибкой вызова. После явного setTextAntialias(false) код печатает off; get_debug_type показывает bool. Исходный Manual также отмечает, что текст обычно сглаживается по умолчанию; примеры всё равно задают режим явно.

Доступность официальной записи: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в этой исходной записи пусты. Примеры рассчитаны на PHP 8.2+ с imagick и приложенным шрифтом; исторические версии исправлений без источника не приписываются.

Краткие официальные страницы не перечисляют отдельные ошибки этих методов и отмечают неполноту документации. Текущий wrapper setter не обещает проверку любого int enum: выбирайте именованные константы из собственной разрешённой политики. Отсутствующий font, неподдержанный символ, отказ drawImage или записи файла — отдельные ошибки общего процесса. False у AA getter и ноль у enum getter сами по себе не повод ловить исключение.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setTextAntialias(false);
$antialias = $theme->getTextAntialias();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$draw->setTextAntialias($antialias);
$draw->annotation(20, 60, 'Заказ');
echo 'antialias=', $antialias ? 'on' : 'off', '; type=', get_debug_type($antialias), "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-hard-edge-setting.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-hard-edge-setting.png', "\n";
$image->clear();

Результат: copied-hard-edge-setting.png 320×180. Бирюзовое «Заказ» имеет более ступенчатый край в данной связке шрифта и renderer: новое рисование унаследовало выключенный режим. False — обычное значение настройки, а не сообщение об ошибке. Getter не смотрит на пиксели готового файла. Перед именем файла консоль: antialias=off; type=bool. Последняя строка — copied-hard-edge-setting.png. Все четыре файла подготовки шрифта включены в архив. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

Практическая задача: Временно отключить режим для технической метки и восстановить тему

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

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
$draw->setTextAntialias(true);
$previous = $draw->getTextAntialias();
$draw->setTextAntialias(false);
$draw->annotation(20, 60, 'AB-42');
$draw->setTextAntialias($previous);
$draw->annotation(20, 120, 'Заказ');
echo 'restored=', $previous ? 'on' : 'off', "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/restored-text-edge-policy.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'restored-text-edge-policy.png', "\n";
$image->clear();

Результат: restored-text-edge-policy.png 320×180. Верхняя техническая метка «AB-42» записана без сглаживания, нижнее «Заказ» — с исходным включённым режимом. Это две независимые текстовые команды; сохранённый getter bool служит восстановлению настройки, а не анализу резкости картинки. Перед именем файла консоль: restored=on. Последняя строка — restored-text-edge-policy.png. Font.php получает данные из этого же архива. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Видимый мягкий край может появиться из-за прозрачности, масштабирования файла или просмотра не в масштабе 100%, даже если настройка false. Чтение getter не анализирует эти этапы. Для восстановления передайте сохранённый bool setter до следующей annotation; уже записанная команда сохранит свой режим.

Чтение настройки не выполняет растеризацию; основная работа с шрифтом, глифами и пикселями происходит при рисовании. Ограничивайте размеры холста и внешнего текста. Для точного вписывания используйте измерение строки через Imagick::queryFontMetrics, а не бесконечное уменьшение размера или угадывание границ по enum. Сложное многострочное оформление — отдельная задача макета; браузерный текст в HTML может быть удобнее, если PNG не требуется.

В расширенных программах foreach повторяет команды для строк, === строго сравнивает значение/тип, in_array(..., true) проверяет разрешённые константы, array_key_exists выбирает опору из таблицы, ? : формирует короткую подпись on/off. См. условия и перебор и массив с ключами.

Соседние настройки: ImagickDraw::getGravity · ImagickDraw::setGravity · ImagickDraw::getTextAlignment · ImagickDraw::setTextAlignment · ImagickDraw::setTextAntialias. Устройство очереди — Draw и отдельные изображения; изменения системы координат — преобразования.

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

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::setTextAntialias(bool $antialias): bool

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

Сглаживание задаёт покрытие крайних пикселей букв при растеризации: частично покрытый пиксель получает смесь цвета текста и фона. Оно не меняет саму строку, font size и координаты, не исправляет отсутствие символа в шрифте. TextAntialias относится к тексту; StrokeAntialias — отдельная настройка геометрической обводки.

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

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

ImagickDraw::setTextAntialias(bool $antialias): bool
ПараметрЧто передать и зачем
$antialiasbool, обязательное true для включения или false для отключения. В примере передано настоящее boolean-значение, а не строка 'false', которая в PHP может трактоваться иначе. Установка режима не делает полупрозрачную заливку непрозрачной.

bool: текущий wrapper после void DrawSetTextAntialias возвращает true. Поэтому аргумент false (выключить режим) и результат операции true не противоречат друг другу. Raw prose «No value/Nothing» и bool signature сохранены, но результатом setter не является картинка.

Доступность официальной записи: PECL imagick 2, PECL imagick 3. Поля deprecated/removed/changelog в этой исходной записи пусты. Примеры рассчитаны на PHP 8.2+ с imagick и приложенным шрифтом; исторические версии исправлений без источника не приписываются.

Краткие официальные страницы не перечисляют отдельные ошибки этих методов и отмечают неполноту документации. Текущий wrapper setter не обещает проверку любого int enum: выбирайте именованные константы из собственной разрешённой политики. Отсутствующий font, неподдержанный символ, отказ drawImage или записи файла — отдельные ошибки общего процесса. False у AA getter и ноль у enum getter сами по себе не повод ловить исключение.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(640, 180, 'white');
$image->setImageFormat('png');
foreach ([[20, false], [340, true]] as [$x, $antialias]) {
    $draw = new ImagickDraw();
    $draw->setResolution(72, 72);
    $draw->setFont($font);
    $draw->setFontSize(24);
    $draw->setStrokeColor('none');
    $draw->setFillColor('#146c74');
    $draw->setGravity(Imagick::GRAVITY_FORGET);
    $draw->setTextAlignment(Imagick::ALIGN_UNDEFINED);
    $draw->setTextAntialias(true);
    $draw->setTextAntialias($antialias);
    $draw->annotation($x, 60, 'Заказ');
    $image->drawImage($draw);
    $draw->clear();
}
$path = __DIR__ . '/hard-and-smooth-text.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'hard-and-smooth-text.png', "\n";
$image->clear();

Результат: hard-and-smooth-text.png 640×180. В этом отдельном PHP-файле слева «Заказ» без сглаживания, справа — со сглаживанием (порядок обратный иллюстрации выше) при одинаковых 24 пунктах, плотности 72, цвете и белом фоне. Режим влияет на покрытие крайних пикселей глифов. Он не меняет point size, не переносит строку и не растягивает PNG. Смотрите файл при масштабе 100%, а не только его уменьшенную копию в браузере. Последняя строка — hard-and-smooth-text.png. Все четыре файла подготовки шрифта включены в архив. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Статус в 18 пунктов должен оставаться читаемым поверх мятной плашки. Явно включим сглаживание букв; отсутствие контура задаётся отдельно через stroke none. Это не способ сделать весь готовый PNG размытым или исправить отсутствие глифа.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(20, 30, 300, 150);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(18);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextAntialias(true);
$draw->annotation(35, 95, 'Доставка готова');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/smooth-small-card-caption.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'smooth-small-card-caption.png', "\n";
$image->clear();

Результат: smooth-small-card-caption.png 320×180. Мятная карточка (20,30)—(300,150) с бирюзовой надписью «Доставка готова», 18 пунктов, базовая линия y=95. Край букв сглаживается относительно фактического мятного фона. AA не заменяет файл шрифта, достаточный контраст и подходящий размер. Последняя строка — smooth-small-card-caption.png. Font.php получает данные из этого же архива. Распакуйте архив целиком в отдельную папку. При установленном PHP с imagick выполните в ней php example.php; PNG появится рядом с example.php и откроется обычным просмотрщиком изображений. Повторный запуск заменит одноимённый учебный PNG.

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

Сравнивайте один шрифт/размер/плотность/координаты и непрозрачный цвет на одном фоне, затем смотрите при 100%. Увеличенная схема использует ближайшего соседа, чтобы не создать новые цвета при увеличении. Не обещайте ровно два цвета для произвольного PNG, не путайте AA с жирностью: ненужная обводка тоже утолщает буквы. Отключение AA не отменяет alpha-compositing и последующий resize.

Чтение настройки не выполняет растеризацию; основная работа с шрифтом, глифами и пикселями происходит при рисовании. Ограничивайте размеры холста и внешнего текста. Для точного вписывания используйте измерение строки через Imagick::queryFontMetrics, а не бесконечное уменьшение размера или угадывание границ по enum. Сложное многострочное оформление — отдельная задача макета; браузерный текст в HTML может быть удобнее, если PNG не требуется.

В расширенных программах foreach повторяет команды для строк, === строго сравнивает значение/тип, in_array(..., true) проверяет разрешённые константы, array_key_exists выбирает опору из таблицы, ? : формирует короткую подпись on/off. См. условия и перебор и массив с ключами.

Соседние настройки: ImagickDraw::getGravity · ImagickDraw::setGravity · ImagickDraw::getTextAlignment · ImagickDraw::setTextAlignment · ImagickDraw::getTextAntialias. Устройство очереди — Draw и отдельные изображения; изменения системы координат — преобразования.

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

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

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

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

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