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

Дерево руководства
Глава 340 · После первых надписей
ImagickDraw: настоящий Bold, наклонные буквы и узкое начертание
Выбрать реальные шрифтовые файлы по семейству, стилю, весу и ширине; отличить сохранённый запрос от результата, обработать отказ и получить понятную карточку заказа.
Сделать итоговую сумму действительно жирной
Покупатель должен быстро увидеть, сколько платить. Нам нужна крупная читаемая сумма «Итого 1 250 руб.» настоящим Bold-начертанием. Не будем надеяться, что Regular-файл сам изменит свои буквы: дадим renderer семейство, где приложены обычный и жирный файлы, и выберем вес 700.
Перед запуском распакуйте архив целиком. Полную программу выполняют в свежем CLI-процессе PHP с imagick: fonts.php подготавливает локальные fonts и поиск до первого font cache. Это готовая среда именно для самостоятельного CLI-примера, а не helper для переключения шрифтов между запросами PHP-FPM.

Ключевые строки ниже — поясняющая выдержка, а не отдельная программа. $draw уже создан и настроен, $image уже является пиксельным холстом; полная запускаемая версия находится сразу после объяснения.
$draw->setFontFamily('AEN Sans');
$draw->setFontWeight(700);
$draw->annotation(20, 80, 'Итого 1 250 руб.');
$image->drawImage($draw);SetFontFamily выбирает настроенную группу начертаний, setFontWeight(700) просит жирное, annotation записывает текст, drawImage исполняет команды на пикселях. -> вызывает метод объекта, скобки передают аргументы; 700 — вес запроса, не толщина обводки и не размер букв. Размер задаётся отдельно setFontSize. AEN Sans — наше локальное имя конфигурации для настоящих DejaVu Sans, а не имя, которое обязательно есть на любой машине.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(700);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->annotation(20, 80, 'Итого 1 250 руб.');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/first-bold-total.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-bold-total.png', "\n";
$image->clear();
Результат: first-bold-total.png 600×160. Кириллическая сумма видима, буквы жирные за счёт DejaVu Sans Bold. Сначала fonts.php восстановил приложенные файлы и типографическую конфигурацию этого CLI-процесса. Затем family/weight выбрали подходящее начертание; writeImage сохранил PNG. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Перед началом: первые надписи и baseline, отдельный объект Draw, переменная и присваивание. В этой главе каждый новый запрос сопоставлен с реальным изображением; ссылки дополняют объяснение, а не заменяют его.
Разделить семейство, стиль, вес и ширину

| Запрос | Смысл | Чего он не задаёт |
|---|---|---|
| Family | Группа связанных начертаний, например AEN Sans → DejaVu Sans | Путь к конкретному TTF или список CSS fallback. |
| Style | Прямой Normal, курсивный Italic, наклонный Oblique, любой Any | Жирность, размер и установку отсутствующего файла. |
| Weight | Числовой запрос веса; в этом wrapper 100..900 | Толщину контура или гарантию файла для каждого числа. |
| Stretch | Обычное/узкое/широкое начертание и Any | Процент сжатия, кернинг и готовую ширину строки. |
Модель похожа на заказ одежды: серия, фасон, плотность и ширина помогают выбрать вещь из имеющегося набора. Это только аналогия выбора; PHP не шьёт отсутствующий TTF. Если подходящего файла нет, renderer может выбрать приближение или отказать в зависимости от операции/конфигурации. В наших примерах есть все используемые faces, и результаты проверены на реальных PNG.
Запустить тот же результат без установки шрифтов в систему

Каждый архив содержит fonts.php, font-metadata.json, font-license.txt и пять TTF в base64. Это полные оригинальные DejaVu 2.37 из официального release ZIP, без subsetting и правки таблиц имён. Лицензионные notices Bitstream Vera/Arev и указание public domain для изменений DejaVu сохранены. Helper проверяет длину/SHA-256 и восстанавливает байты рядом с программой, затем создаёт type.xml с абсолютными путями. Имена AEN Sans/AEN Serif — только записи конфигурации, оригинальные имена внутри TTF не меняются.
| Запись | Настоящий файл | Что видно |
|---|---|---|
| AEN Sans Normal 400 Normal | DejaVuSans.ttf | Book, обычный текст без засечек. |
| AEN Sans Normal 700 Normal | DejaVuSans-Bold.ttf | Настоящие жирные формы. |
| AEN Sans Oblique 400 Normal | DejaVuSans-Oblique.ttf | Настоящие наклонные формы. |
| AEN Sans Normal 400 Condensed | DejaVuSansCondensed.ttf | Настоящее узкое начертание. |
| AEN Serif Normal 400 Normal | DejaVuSerif.ttf | Book с засечками. |
Для свежего CLI-процесса fonts.php задаёт MAGICK_FONT_PATH до первого обращения к font cache и проверяет регистрацию своих имён через queryFonts. В текущем PHP wrapper семейство также проверяется по списку сконфигурированных font names; поэтому базовые name AEN Sans/AEN Serif совпадают с family. На web-сервере общий font config готовят до запуска PHP-FPM workers и учитывают их кеш/права; не переносите этот учебный helper как переключатель общего набора fonts между пользовательскими запросами. Старые Open Sans-примеры используют свой отдельный неизменённый комплект.
Почему Regular.ttf не становится Bold от числа 700

SetFont с путём выбирает конкретный файл. После этого изменение запроса family/style/weight/stretch не обязано переключать этот файл. Это не ошибка getter: настройки действительно сохранены, но уже указан более конкретный источник форм. Если нужен строгий известный результат, укажите нужный TTF. Если нужен подбор face из семейства, создайте новый Draw без fixed font и настройте доступное family.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 260, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($fonts['DejaVuSans.ttf']);
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->annotation(20, 65, 'Заказ № 42');
$draw->setFontWeight(700);
$draw->setFontStyle(Imagick::STYLE_OBLIQUE);
$draw->setFontStretch(Imagick::STRETCH_CONDENSED);
$draw->annotation(20, 145, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$bold = new ImagickDraw();
$bold->setResolution(72, 72);
$bold->setFont($fonts['DejaVuSans-Bold.ttf']);
$bold->setFontStyle(Imagick::STYLE_NORMAL);
$bold->setFontWeight(700);
$bold->setFontStretch(Imagick::STRETCH_NORMAL);
$bold->setFontSize(32);
$bold->setTextEncoding('UTF-8');
$bold->setFillColor('#146c74');
$bold->setStrokeColor('none');
$bold->setGravity(Imagick::GRAVITY_FORGET);
$bold->setTextAlignment(Imagick::ALIGN_LEFT);
$bold->annotation(20, 225, 'Заказ № 42');
echo 'fixed-Regular=unchanged; explicit-Bold=changed', "\n";
$image->drawImage($bold);
$bold->clear();
$path = __DIR__ . '/fixed-regular-versus-real-bold.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'fixed-regular-versus-real-bold.png', "\n";
$image->clear();
Результат: fixed-regular-versus-real-bold.png 600×260. Первые две строки «Заказ № 42» одинаковые Book, хотя вторая имеет запросы 700/Oblique/Condensed. Третья действительно жирная, потому что задан DejaVuSans-Bold.ttf. Проверено равенство соответствующих пикселей первых двух строк и отличие третьей. Getter в этом режиме сообщает запросы, а не распознаёт начертание из файла. Консоль до имени файла: fixed-Regular=unchanged; explicit-Bold=changed. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Проверить место и заранее выбрать политику отказа


Для поля шириной 180 недостаточно посчитать символы: буквы и начертания имеют разные метрики. Сначала измерьте строку в Normal, затем при необходимости в реально доступном Condensed; если она всё равно не помещается, выберите перенос, другой размер, сокращение по смыслу или отказ. Поле из примера не считается универсальным решением для любого текста. Пробелы и знаки также участвуют в advance.
В native-проверке отсутствующий family и weight 1000 дали ImagickDrawException; эти две ошибки намеренно пойманы в самостоятельных программах, после чего изображение построено известными настройками. Для style/stretch wrapper принимает int без отдельной проверки enum, поэтому не выдумываем аналогичное исключение на каждый неизвестный номер. В интерфейсе приложения разрешайте понятные режимы, затем переводите их в именованные константы. Подробнее — обработка исключений, условие и match.
Собрать понятную карточку получения заказа

Один значок начертания не нужен сам по себе: покупатель должен отличить номер, статус, сумму и срок. Для каждого блока создаём отдельный Draw с понятным выбором, поэтому наклон и узость служебной строки не переходят в сумму. Все нужные шрифты уже находятся в комплекте.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 340, 'white');
$image->setImageFormat('png');
$panel = new ImagickDraw();
$panel->setStrokeColor('none');
$panel->setFillColor('#e3f3ef');
$panel->roundRectangle(10, 10, 590, 330, 16, 16);
$image->drawImage($panel);
$panel->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(700);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->annotation(30, 65, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$note = new ImagickDraw();
$note->setResolution(72, 72);
$note->setFontFamily('AEN Sans');
$note->setFontStyle(Imagick::STYLE_OBLIQUE);
$note->setFontWeight(400);
$note->setFontStretch(Imagick::STRETCH_NORMAL);
$note->setFontSize(24);
$note->setTextEncoding('UTF-8');
$note->setFillColor('#146c74');
$note->setStrokeColor('none');
$note->setGravity(Imagick::GRAVITY_FORGET);
$note->setTextAlignment(Imagick::ALIGN_LEFT);
$note->annotation(30, 120, 'Готов к выдаче');
$image->drawImage($note);
$note->clear();
$total = new ImagickDraw();
$total->setResolution(72, 72);
$total->setFontFamily('AEN Sans');
$total->setFontStyle(Imagick::STYLE_NORMAL);
$total->setFontWeight(700);
$total->setFontStretch(Imagick::STRETCH_NORMAL);
$total->setFontSize(40);
$total->setTextEncoding('UTF-8');
$total->setFillColor('#146c74');
$total->setStrokeColor('none');
$total->setGravity(Imagick::GRAVITY_FORGET);
$total->setTextAlignment(Imagick::ALIGN_LEFT);
$total->annotation(30, 190, 'Итого 1 250 руб.');
$image->drawImage($total);
$total->clear();
$compact = new ImagickDraw();
$compact->setResolution(72, 72);
$compact->setFontFamily('AEN Sans');
$compact->setFontStyle(Imagick::STYLE_NORMAL);
$compact->setFontWeight(400);
$compact->setFontStretch(Imagick::STRETCH_CONDENSED);
$compact->setFontSize(24);
$compact->setTextEncoding('UTF-8');
$compact->setFillColor('#146c74');
$compact->setStrokeColor('none');
$compact->setGravity(Imagick::GRAVITY_FORGET);
$compact->setTextAlignment(Imagick::ALIGN_LEFT);
$compact->annotation(30, 245, 'Срок хранения: 3 дня');
$image->drawImage($compact);
$compact->clear();
$thanks = new ImagickDraw();
$thanks->setResolution(72, 72);
$thanks->setFontFamily('AEN Serif');
$thanks->setFontStyle(Imagick::STYLE_NORMAL);
$thanks->setFontWeight(400);
$thanks->setFontStretch(Imagick::STRETCH_NORMAL);
$thanks->setFontSize(24);
$thanks->setTextEncoding('UTF-8');
$thanks->setFillColor('#146c74');
$thanks->setStrokeColor('none');
$thanks->setGravity(Imagick::GRAVITY_FORGET);
$thanks->setTextAlignment(Imagick::ALIGN_LEFT);
$thanks->annotation(30, 300, 'Спасибо!');
$image->drawImage($thanks);
$thanks->clear();
$path = __DIR__ . '/order-card-real-font-faces.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'order-card-real-font-faces.png', "\n";
$image->clear();
Результат: order-card-real-font-faces.png 600×340. На мятной панели жирный «Заказ № 42» (32 пункта), наклонный «Готов к выдаче» (24), жирный «Итого 1 250 руб.» (40), узкий «Срок хранения: 3 дня» (24), «Спасибо!» семейства Serif (24). Начала x=30, baseline y=65/120/190/245/300. Каждый блок использует свою реальную face и явные остальные параметры. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Упражнение: увеличьте сумму до 48 пунктов и проверьте, помещается ли ваш новый текст внутри панели. Решение: изменить size именно блока total, измерить его теми же параметрами и при необходимости увеличить холст/панель или поменять компоновку. Нельзя считать любой текст помещающимся только потому, что прежняя сумма подошла. Продолжение: размещение текста, межстрочные и межбуквенные интервалы, подложки и оформление.
Выбрать family matching или точный файл
- Для выбора из заранее доступных реальных faces используйте family/style/weight/stretch без fixed setFont(file).
- Для строгого известного файла используйте setFont с проверенным путём; запросы getter не доказывают изменение этого файла.
- Getters читают сохранённые запросы. Подтверждение результата — реальное рисование, метрики и видимые буквы.
- Для воспроизводимости сохраняйте fonts, конфигурацию, лицензию и версии; font на вашей Windows не означает font в PHP-FPM.
- Для ограниченного поля измеряйте уже выбранное начертание; изменение stretch не заменяет правила компоновки.
Здесь закончены восемь карточек выбора начертания, а не весь Imagick или весь PHP Manual. Дальше по задаче: создать первую подпись, измерить текст, сохранить собственный векторный шаблон.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
ImagickDraw::getFontFamilyНовому текстовому блоку нужно семейство темы либо понятный default, когда никакое семейство не задано.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getFontFamily(): stringНовому текстовому блоку нужно семейство темы либо понятный default, когда никакое семейство не задано.
Getter читает сохранённое имя family у этого Draw. Это настройка запроса, а не анализ букв и не обещание конкретного TTF. Свежий объект в проверке вернул false; в сигнатуре страницы указан string, но prose прямо описывает false при отсутствии family. Проверяем это строго через === false.

Синтаксис, параметры и результат
ImagickDraw::getFontFamily(): stringПараметров нет: пустые скобки читают настройку текущего Draw.
string с выбранным именем либо false, если family не задано. После setFont(путь к TTF) getter family также может остаться false: путь font и запрос family — разные свойства. PHP сам управляет памятью возвращённой строки.
Официальная доступность: PECL imagick 2, PECL imagick 3. В исходной записи нет отметок deprecated/removed и отдельного changelog. Сохранена исходная отметка неполной документации там, где она есть; пустое описание ошибок не означает, что отказов нет. Полные исходные поля официальной записи сохранены в контракте. Примеры PHP 8.2+ фактически выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 с пятью неизменёнными DejaVu 2.37 fonts.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 160, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$family = $theme->getFontFamily();
if ($family === false) {
$family = 'AEN Sans';
}
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontFamily($family);
$draw->annotation(20, 65, 'Заказ № 42');
echo 'unset-family=explicit-AEN-Sans', "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/family-unset-policy.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'family-unset-policy.png', "\n";
$image->clear();
Результат: family-unset-policy.png 600×160. Надпись «Заказ № 42» настоящим DejaVu Sans Book. Getter свежего объекта вернул false; код принял явное решение выбрать зарегистрированный AEN Sans. Имя не установлено по умолчанию и не угадано из пикселей. Консоль до имени файла: unset-family=explicit-AEN-Sans. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Практическая задача: Перенести семейство сертификата в другой текстовый блок
Тема сертификата уже выбрала Serif. Прочитаем эту настройку и применим к новому объекту, чтобы заголовок и номер использовали одно семейство, а не зависели от системного default.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setFontFamily('AEN Serif');
$family = $theme->getFontFamily();
if ($family === false) {
throw new LogicException('В теме сертификата нужно явное семейство');
}
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontFamily($family);
$draw->annotation(20, 65, 'Сертификат');
$draw->annotation(20, 145, 'Заказ № 42');
echo 'theme-family=AEN Serif; applied=two-lines', "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/certificate-family-from-theme.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'certificate-family-from-theme.png', "\n";
$image->clear();
Результат: certificate-family-from-theme.png 600×200. Две строки Serif с засечками. Копируется именно семейство; цвет, размер, вес, стиль и ширина нового Draw настроены отдельно. Getter не считывает весь дизайн сертификата и не переносит настройки одним значением. Консоль до имени файла: theme-family=AEN Serif; applied=two-lines. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Ошибки, альтернативы и стоимость
Не объявляйте false ошибкой чтения PNG и не выводите по имени family точный использованный файл. Getter не переносит размер, цвет, style, weight и stretch. При точном setFont(file) сохранённая family не доказывает, что renderer использовал соответствующее семейство.
Установка параметров, поиск/чтение TTF, поддержка символов, вычисление метрик, рисование и запись PNG — отдельные этапы. Один true setter не проверяет их все. При неизвестной настройке выбирайте разрешённый режим приложения или явный отказ. Не передавайте пути к произвольным загружаемым fonts; комплект главы фиксирован. Растеризация и метрики требуют работы font renderer; кэшировать можно проверенный результат для неизменных текста и всех font-настроек. Не обещаем ускорение от одного getter или одинаковый результат при смене renderer.
Общие строки подготовили UTF-8 текст, 72 DPI, размер, цвет и отсутствие stroke. SetResolution вызывается сразу после создания Draw до других настроек. Координата y у annotation — baseline, а не верхняя граница символов. QueryFontMetrics следует выполнять при тех же family/style/weight/stretch и размере, с которыми будет нарисована строка. Метрика advance и bbox пикселей — разные измерения.
Соседние настройки: ImagickDraw::setFontFamily · ImagickDraw::getFontStyle · ImagickDraw::setFontStyle · ImagickDraw::getFontWeight · ImagickDraw::setFontWeight · ImagickDraw::getFontStretch · ImagickDraw::setFontStretch. Для точного файла — setFont и первые подписи, для положения — baseline и выравнивание, для метрик — queryFontMetrics.
ImagickDraw::setFontFamilyИз одного шаблона нужно получить простой статус без засечек или оформление сертификата с засечками.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFontFamily(string $font_family): boolИз одного шаблона нужно получить простой статус без засечек или оформление сертификата с засечками.
Передайте имя доступного family, затем согласуйте style, weight, stretch и font size. Наш type.xml связывает AEN Sans с настоящими DejaVu Sans Book/Bold/Oblique/Condensed, AEN Serif — с DejaVu Serif Book. Это локальные имена конфигурации, не новые или переименованные шрифты. Оригинальные TTF неизменны.

Синтаксис, параметры и результат
ImagickDraw::setFontFamily(string $font_family): bool| Параметр | Что передать и зачем |
|---|---|
| $font_family | string, обязательное непустое имя. В этих архивах AEN Sans или AEN Serif. Это не путь к TTF, не список CSS fallback через запятую и не имя, которое гарантированно имеется на чужом сервере. |
bool, true при успехе. Текущий binding отвергает пустое имя и имя, отсутствующее в списке сконфигурированных font names, через ImagickDrawException. Поэтому в локальном type.xml также есть базовые записи name=AEN Sans/AEN Serif, совпадающие с family. Успешный setter не означает успешный PNG при повреждённом TTF или отказе записи.
Официальная доступность: PECL imagick 2, PECL imagick 3. В исходной записи нет отметок deprecated/removed и отдельного changelog. Сохранена исходная отметка неполной документации там, где она есть; пустое описание ошибок не означает, что отказов нет. Полные исходные поля официальной записи сохранены в контракте. Примеры PHP 8.2+ фактически выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 с пятью неизменёнными DejaVu 2.37 fonts.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontFamily('AEN Sans');
$draw->annotation(20, 65, 'Заказ № 42');
$draw->setFontFamily('AEN Serif');
$draw->annotation(20, 145, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/sans-and-serif-families.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'sans-and-serif-families.png', "\n";
$image->clear();
Результат: sans-and-serif-families.png 600×200. Две одинаковые строки 32 пункта: сверху DejaVu Sans Book без засечек, снизу DejaVu Serif Book с засечками. AEN Sans/AEN Serif — локальные имена конфигурации из архива; оригинальные TTF не переименованы и не изменены. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Практическая задача: Обработать отсутствующее семейство и выбрать известную замену
Старое название в настройках сайта отсутствует в этой библиотеке. Вместо молчаливой надежды на случайный системный font обработаем отказ и явно выберем AEN Sans из приложенного набора.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
try {
$draw->setFontFamily('AEN Missing Family 26');
throw new LogicException('Учебное имя не должно быть зарегистрировано');
} catch (ImagickDrawException $error) {
$draw->setFontFamily('AEN Sans');
echo 'missing-family=handled; fallback=AEN Sans', "\n";
}
$draw->annotation(20, 65, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/missing-family-explicit-fallback.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'missing-family-explicit-fallback.png', "\n";
$image->clear();
Результат: missing-family-explicit-fallback.png 600×160. Нормальная читаемая строка получена известным DejaVu Sans после реально обработанного ImagickDrawException. Замена — политика приложения, а не обещание setter автоматически подобрать хороший похожий шрифт. Пустая строка family также запрещена текущим binding. Консоль до имени файла: missing-family=handled; fallback=AEN Sans. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Ошибки, альтернативы и стоимость
Название в CSS/операционной системе не равно зарегистрированному имени ImageMagick. Для неизвестного семейства выбирайте явную замену приложения или отказ; не полагайтесь на случайный системный fallback. Если уже зафиксирован setFont(file), он имеет приоритет перед поиском family: используйте новый Draw для нового способа выбора.
Установка параметров, поиск/чтение TTF, поддержка символов, вычисление метрик, рисование и запись PNG — отдельные этапы. Один true setter не проверяет их все. При неизвестной настройке выбирайте разрешённый режим приложения или явный отказ. Не передавайте пути к произвольным загружаемым fonts; комплект главы фиксирован. Растеризация и метрики требуют работы font renderer; кэшировать можно проверенный результат для неизменных текста и всех font-настроек. Не обещаем ускорение от одного getter или одинаковый результат при смене renderer.
Общие строки подготовили UTF-8 текст, 72 DPI, размер, цвет и отсутствие stroke. SetResolution вызывается сразу после создания Draw до других настроек. Координата y у annotation — baseline, а не верхняя граница символов. QueryFontMetrics следует выполнять при тех же family/style/weight/stretch и размере, с которыми будет нарисована строка. Метрика advance и bbox пикселей — разные измерения.
Соседние настройки: ImagickDraw::getFontFamily · ImagickDraw::getFontStyle · ImagickDraw::setFontStyle · ImagickDraw::getFontWeight · ImagickDraw::setFontWeight · ImagickDraw::getFontStretch · ImagickDraw::setFontStretch. Для точного файла — setFont и первые подписи, для положения — baseline и выравнивание, для метрик — queryFontMetrics.
ImagickDraw::getFontStyleНаклонное примечание темы надо перенести в новый объект либо временно сделать заголовок прямым и вернуть прежний запрос.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getFontStyle(): intНаклонное примечание темы надо перенести в новый объект либо временно сделать заголовок прямым и вернуть прежний запрос.
Getter возвращает int enum STYLE_*, связанный с текущим Draw; 0 означает, что style не задан. Он не измеряет наклон нарисованной буквы и не возвращает файл. Для воспроизводимого рисунка запрос явно задают перед annotation.

Синтаксис, параметры и результат
ImagickDraw::getFontStyle(): intПараметров нет: пустые скобки читают настройку текущего Draw.
int: STYLE_NORMAL, STYLE_ITALIC, STYLE_OBLIQUE, STYLE_ANY или другое сохранённое значение данной сборки; официальный случай 0 при отсутствии настройки сохранён. Реальный свежий getter дал 0. Для совместимости используйте именованные константы, а не придуманный STYLE_UNDEFINED.
Официальная доступность: PECL imagick 2, PECL imagick 3. В исходной записи нет отметок deprecated/removed и отдельного changelog. Сохранена исходная отметка неполной документации там, где она есть; пустое описание ошибок не означает, что отказов нет. Полные исходные поля официальной записи сохранены в контракте. Примеры PHP 8.2+ фактически выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 с пятью неизменёнными DejaVu 2.37 fonts.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 160, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setFontStyle(Imagick::STYLE_OBLIQUE);
$style = $theme->getFontStyle();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontStyle($style);
$draw->annotation(20, 65, 'Заказ № 42');
echo 'copied-style=Oblique', "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-oblique-style.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-oblique-style.png', "\n";
$image->clear();
Результат: copied-oblique-style.png 600×160. Наклонная «Заказ № 42» создана реальным DejaVu Sans Oblique, зарегистрированным для этого запроса. Getter дал enum настройки, который передан setter нового Draw; он не анализировал уже готовые буквы и не вернул путь к TTF. Консоль до имени файла: copied-style=Oblique. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Практическая задача: Временно сделать заголовок прямым и вернуть наклонное примечание
В теме примечания нужен Oblique, но заголовок должен остаться прямым. Сохраним прочитанное значение и вернём его перед второй строкой.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_OBLIQUE);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$previous = $draw->getFontStyle();
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->annotation(20, 65, 'Информация о выдаче');
$draw->setFontStyle($previous);
$draw->annotation(20, 145, 'Возьмите документ');
echo 'temporary-style=Normal; restored=Oblique', "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/restored-oblique-note.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'restored-oblique-note.png', "\n";
$image->clear();
Результат: restored-oblique-note.png 600×200. Прямой заголовок и наклонное примечание, без случайного переноса наклона на всё изображение. Setter после первой annotation не меняет уже записанный заголовок; сохранённый getter enum используется для второй записи. Консоль до имени файла: temporary-style=Normal; restored=Oblique. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Ошибки, альтернативы и стоимость
Возвращённый STYLE_OBLIQUE ещё не гарантирует, что доступно Oblique-начертание или что не зафиксирован Regular-файл через setFont. Одинаковые метрики не доказывают одинаковые формы: Normal и Oblique этой строки имеют одинаковый advance, но видимые буквы различаются.
Установка параметров, поиск/чтение TTF, поддержка символов, вычисление метрик, рисование и запись PNG — отдельные этапы. Один true setter не проверяет их все. При неизвестной настройке выбирайте разрешённый режим приложения или явный отказ. Не передавайте пути к произвольным загружаемым fonts; комплект главы фиксирован. Растеризация и метрики требуют работы font renderer; кэшировать можно проверенный результат для неизменных текста и всех font-настроек. Не обещаем ускорение от одного getter или одинаковый результат при смене renderer.
Общие строки подготовили UTF-8 текст, 72 DPI, размер, цвет и отсутствие stroke. SetResolution вызывается сразу после создания Draw до других настроек. Координата y у annotation — baseline, а не верхняя граница символов. QueryFontMetrics следует выполнять при тех же family/style/weight/stretch и размере, с которыми будет нарисована строка. Метрика advance и bbox пикселей — разные измерения.
Соседние настройки: ImagickDraw::getFontFamily · ImagickDraw::setFontFamily · ImagickDraw::setFontStyle · ImagickDraw::getFontWeight · ImagickDraw::setFontWeight · ImagickDraw::getFontStretch · ImagickDraw::setFontStretch. Для точного файла — setFont и первые подписи, для положения — baseline и выравнивание, для метрик — queryFontMetrics.
ImagickDraw::setFontStyleВ карточке нужно выделить примечание наклоном, сохранив прямой заголовок.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFontStyle(int $style): boolВ карточке нужно выделить примечание наклоном, сохранив прямой заголовок.
STYLE_NORMAL запрашивает прямое начертание, STYLE_ITALIC — курсивное, STYLE_OBLIQUE — наклонное, STYLE_ANY не ограничивает выбор по этому признаку. Наш комплект содержит настоящий Oblique и показывает именно его, не переименовывая в Italic. Поиск зависит от зарегистрированных faces; setter не устанавливает отсутствующий файл.

Синтаксис, параметры и результат
ImagickDraw::setFontStyle(int $style): bool| Параметр | Что передать и зачем |
|---|---|
| $style | int, одна из Imagick::STYLE_*: NORMAL, ITALIC, OBLIQUE или ANY с полным префиксом STYLE_. ANY — wildcard «любой», а не обязательный NORMAL. В проверке NORMAL=1, ITALIC=2, OBLIQUE=3, ANY=4; выбирайте имена. Зарегистрированный STYLE_BOLD не используется как замена весу 700. |
bool по сигнатуре. Официальное prose говорит об отсутствии результата; текущий wrapper передаёт int в void DrawSetFontStyle и возвращает true. Wrapper не выполняет самостоятельную проверку разрешённого enum, поэтому не обещаем исключение для любого неизвестного int.
Официальная доступность: PECL imagick 2, PECL imagick 3. В исходной записи нет отметок deprecated/removed и отдельного changelog. Сохранена исходная отметка неполной документации там, где она есть; пустое описание ошибок не означает, что отказов нет. Полные исходные поля официальной записи сохранены в контракте. Примеры PHP 8.2+ фактически выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 с пятью неизменёнными DejaVu 2.37 fonts.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->annotation(20, 65, 'Заказ № 42');
$draw->setFontStyle(Imagick::STYLE_OBLIQUE);
$draw->annotation(20, 145, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/normal-and-oblique-style.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'normal-and-oblique-style.png', "\n";
$image->clear();
Результат: normal-and-oblique-style.png 600×200. Сверху прямое, снизу наклонное начертание одной строки. Это выбор двух настоящих файлов DejaVu Sans Book и Oblique через семейство; не искусственный наклон уже растрового текста. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Практическая задача: Выбрать наклонное примечание по понятному режиму приложения
Пользовательская настройка slanted означает наклонное примечание. Преобразуем разрешённое слово в конкретный enum и используем реально приложенный Oblique. Не передаём произвольную строку как int и не называем этот файл Italic.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$requested = 'slanted';
$style = match ($requested) {
'normal' => Imagick::STYLE_NORMAL,
'slanted' => Imagick::STYLE_OBLIQUE,
default => throw new InvalidArgumentException('Неизвестный режим текста'),
};
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->annotation(20, 65, 'Пункт выдачи');
$draw->setFontStyle($style);
$draw->annotation(20, 145, 'Возьмите документ');
echo 'mode=slanted; matched=Oblique-face', "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/allowed-style-for-service-note.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'allowed-style-for-service-note.png', "\n";
$image->clear();
Результат: allowed-style-for-service-note.png 600×200. Обычный заголовок и настоящее наклонное примечание. Match превращает допустимый режим в именованную константу. Для другого семейства нужны соответствующие реально доступные faces; установка enum не доставляет отсутствующий Italic/Bold файл. Консоль до имени файла: mode=slanted; matched=Oblique-face. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Ошибки, альтернативы и стоимость
Style — не размер букв и не обводка. При fixed Regular.ttf setFontStyle(OBLIQUE) в нашей проверке не меняет пиксели: выбранный файл остаётся Regular. Для реального наклонного результата используйте подходящий файл либо настроенное family matching. Выбирайте допустимые enum в приложении, например match из примера.
Установка параметров, поиск/чтение TTF, поддержка символов, вычисление метрик, рисование и запись PNG — отдельные этапы. Один true setter не проверяет их все. При неизвестной настройке выбирайте разрешённый режим приложения или явный отказ. Не передавайте пути к произвольным загружаемым fonts; комплект главы фиксирован. Растеризация и метрики требуют работы font renderer; кэшировать можно проверенный результат для неизменных текста и всех font-настроек. Не обещаем ускорение от одного getter или одинаковый результат при смене renderer.
Общие строки подготовили UTF-8 текст, 72 DPI, размер, цвет и отсутствие stroke. SetResolution вызывается сразу после создания Draw до других настроек. Координата y у annotation — baseline, а не верхняя граница символов. QueryFontMetrics следует выполнять при тех же family/style/weight/stretch и размере, с которыми будет нарисована строка. Метрика advance и bbox пикселей — разные измерения.
Соседние настройки: ImagickDraw::getFontFamily · ImagickDraw::setFontFamily · ImagickDraw::getFontStyle · ImagickDraw::getFontWeight · ImagickDraw::setFontWeight · ImagickDraw::getFontStretch · ImagickDraw::setFontStretch. Для точного файла — setFont и первые подписи, для положения — baseline и выравнивание, для метрик — queryFontMetrics.
ImagickDraw::getFontWeightЖирное оформление итогов должно сохраниться после временной обычной строки или перейти в новый блок.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getFontWeight(): intЖирное оформление итогов должно сохраниться после временной обычной строки или перейти в новый блок.
Getter возвращает int веса текущего Draw; 0 означает отсутствие заданного веса. Это запрос для выбора начертания. Он не сообщает толщину пиксельной обводки и не гарантирует наличие Bold-файла.

Синтаксис, параметры и результат
ImagickDraw::getFontWeight(): intПараметров нет: пустые скобки читают настройку текущего Draw.
int при успехе; официальный случай 0 при отсутствии weight сохранён. В native-проверке свежий Draw дал 0, после setter 700 — 700. Ноль можно прочитать как отсутствие настройки, но нельзя передать setFontWeight(0), потому что текущий setter имеет другой допустимый диапазон.
Официальная доступность: PECL imagick 2, PECL imagick 3. В исходной записи нет отметок deprecated/removed и отдельного changelog. Сохранена исходная отметка неполной документации там, где она есть; пустое описание ошибок не означает, что отказов нет. Полные исходные поля официальной записи сохранены в контракте. Примеры PHP 8.2+ фактически выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 с пятью неизменёнными DejaVu 2.37 fonts.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 160, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setFontWeight(700);
$weight = $theme->getFontWeight();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontWeight($weight);
$draw->annotation(20, 65, 'Заказ № 42');
echo 'copied-weight=700', "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-bold-weight.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-bold-weight.png', "\n";
$image->clear();
Результат: copied-bold-weight.png 600×160. Жирная «Заказ № 42» использует зарегистрированный DejaVu Sans Bold. Getter вернул int 700 — запрос веса, а не толщину линии в пикселях или доказательство конкретного выбранного файла. Консоль до имени файла: copied-weight=700. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Практическая задача: Сохранить жирное оформление итога, временно сделать строку обычной
Тема итоговой суммы имеет вес 700. Строка количества должна быть обычной, итог — снова выделенным. Сохраним вес и восстановим его в нужном месте.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(700);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$previous = $draw->getFontWeight();
$draw->setFontWeight(400);
$draw->annotation(20, 65, 'Количество: 2');
$draw->setFontWeight($previous);
$draw->annotation(20, 145, 'Итого 1 250 руб.');
echo 'quantity-weight=400; total-weight=700', "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/restored-bold-total.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'restored-bold-total.png', "\n";
$image->clear();
Результат: restored-bold-total.png 600×200. Количество обычное, сумма жирная. Прочитанный 700 хранится в переменной и снова передаётся setter; это не толщина контура и не магическое имя style Bold. Консоль до имени файла: quantity-weight=400; total-weight=700. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Ошибки, альтернативы и стоимость
Не считайте getter 700 доказательством реальной жирности: фиксированный Regular.ttf может остаться Regular. Сохранять надо смысл настройки вместе с подходящим family/file и остальными параметрами. Наличие stroke тоже делает буквы толще, но это отдельная операция.
Установка параметров, поиск/чтение TTF, поддержка символов, вычисление метрик, рисование и запись PNG — отдельные этапы. Один true setter не проверяет их все. При неизвестной настройке выбирайте разрешённый режим приложения или явный отказ. Не передавайте пути к произвольным загружаемым fonts; комплект главы фиксирован. Растеризация и метрики требуют работы font renderer; кэшировать можно проверенный результат для неизменных текста и всех font-настроек. Не обещаем ускорение от одного getter или одинаковый результат при смене renderer.
Общие строки подготовили UTF-8 текст, 72 DPI, размер, цвет и отсутствие stroke. SetResolution вызывается сразу после создания Draw до других настроек. Координата y у annotation — baseline, а не верхняя граница символов. QueryFontMetrics следует выполнять при тех же family/style/weight/stretch и размере, с которыми будет нарисована строка. Метрика advance и bbox пикселей — разные измерения.
Соседние настройки: ImagickDraw::getFontFamily · ImagickDraw::setFontFamily · ImagickDraw::getFontStyle · ImagickDraw::setFontStyle · ImagickDraw::setFontWeight · ImagickDraw::getFontStretch · ImagickDraw::setFontStretch. Для точного файла — setFont и первые подписи, для положения — baseline и выравнивание, для метрик — queryFontMetrics.
ImagickDraw::setFontWeightИтоговую сумму покупатель должен быстро отличить от обычной строки количества.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFontWeight(int $weight): boolИтоговую сумму покупатель должен быстро отличить от обычной строки количества.
Текущий PHP binding принимает целый вес от 100 до 900 включительно; не только значения с шагом 100. В примерах 400 выбирает Book/Regular, 700 — Bold из локальной конфигурации. Setter не добавляет обводку и не гарантирует отдельный файл для каждого числа внутри диапазона.

Синтаксис, параметры и результат
ImagickDraw::setFontWeight(int $weight): bool| Параметр | Что передать и зачем |
|---|---|
| $weight | int 100..900 включительно в проверенном Imagick 3.8.1 wrapper. Обычно 400 — обычный, 700 — жирный. Значение 550 допустимо как число, но не обещает отдельное начертание в данном комплекте. CSS 1..1000 не является контрактом этого метода. |
bool, true после допустимого значения. Текущий binding выбрасывает ImagickDrawException за пределами 100..900; реально выполнен отказ для 1000 и последующий явный выбор 700. Успешный setter не доказывает, что найден точный вес, что изменились пиксели или что файл сохранён.
Официальная доступность: PECL imagick 2, PECL imagick 3. В исходной записи нет отметок deprecated/removed и отдельного changelog. Сохранена исходная отметка неполной документации там, где она есть; пустое описание ошибок не означает, что отказов нет. Полные исходные поля официальной записи сохранены в контракте. Примеры PHP 8.2+ фактически выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 с пятью неизменёнными DejaVu 2.37 fonts.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontWeight(400);
$draw->annotation(20, 65, 'Заказ № 42');
$draw->setFontWeight(700);
$draw->annotation(20, 145, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/regular-and-bold-weight.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'regular-and-bold-weight.png', "\n";
$image->clear();
Результат: regular-and-bold-weight.png 600×200. Одна строка при 400 и 700: нижние буквы действительно жирнее и шире. Stroke отключён, поэтому отличие создаёт Bold-файл, а не обводка текста. В этом комплекте при 32 пунктах advance около 191 и 212, а не фиксированная ширина для всех шрифтов. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Практическая задача: Отклонить неверный вес из настроек и применить разрешённый 700
Настройки содержат 1000, но текущий PHP binding разрешает только целые 100..900 включительно. Покажем реальный отказ и понятное решение приложения — использовать 700.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
try {
$draw->setFontWeight(1000);
throw new LogicException('Текущий binding должен отклонить 1000');
} catch (ImagickDrawException $error) {
$draw->setFontWeight(700);
echo 'weight=1000-rejected; fallback=700', "\n";
}
$draw->annotation(20, 65, 'Итого 1 250 руб.');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/invalid-weight-handled.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'invalid-weight-handled.png', "\n";
$image->clear();
Результат: invalid-weight-handled.png 600×160. Жирная итоговая сумма создана Bold-файлом после обработанного отказа. При собственной валидации проверяйте диапазон до setter. Не переносите диапазон CSS 1..1000 в этот PHP wrapper и не требуйте, чтобы число обязательно делилось на 100. Консоль до имени файла: weight=1000-rejected; fallback=700. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Ошибки, альтернативы и стоимость
Историческое «всё выше некоторого числа жирное» нельзя считать универсальным правилом для любых семейств и версий. Смотрите доступные faces и конечный рисунок. Stroke выключен в наших сравнениях, чтобы не спутать Bold с обводкой. При прямом setFont(Regular.ttf) измените файл на настоящий Bold или начните family matching в новом Draw.
Установка параметров, поиск/чтение TTF, поддержка символов, вычисление метрик, рисование и запись PNG — отдельные этапы. Один true setter не проверяет их все. При неизвестной настройке выбирайте разрешённый режим приложения или явный отказ. Не передавайте пути к произвольным загружаемым fonts; комплект главы фиксирован. Растеризация и метрики требуют работы font renderer; кэшировать можно проверенный результат для неизменных текста и всех font-настроек. Не обещаем ускорение от одного getter или одинаковый результат при смене renderer.
Общие строки подготовили UTF-8 текст, 72 DPI, размер, цвет и отсутствие stroke. SetResolution вызывается сразу после создания Draw до других настроек. Координата y у annotation — baseline, а не верхняя граница символов. QueryFontMetrics следует выполнять при тех же family/style/weight/stretch и размере, с которыми будет нарисована строка. Метрика advance и bbox пикселей — разные измерения.
Соседние настройки: ImagickDraw::getFontFamily · ImagickDraw::setFontFamily · ImagickDraw::getFontStyle · ImagickDraw::setFontStyle · ImagickDraw::getFontWeight · ImagickDraw::getFontStretch · ImagickDraw::setFontStretch. Для точного файла — setFont и первые подписи, для положения — baseline и выравнивание, для метрик — queryFontMetrics.
ImagickDraw::getFontStretchУзкий служебный номер должен наследовать Condensed из темы, а заголовок оставаться обычным.
PECL imagick 2 >=2.3.0, PECL imagick 3 · imagick
ImagickDraw::getFontStretch(): intУзкий служебный номер должен наследовать Condensed из темы, а заголовок оставаться обычным.
Getter читает int StretchType текущего Draw. Это признак выбора normal/condensed/expanded face, а не ширина строки, процент или scale. Фактическое размещение проверяется метриками и пикселями с теми же font-настройками.

Синтаксис, параметры и результат
ImagickDraw::getFontStretch(): intПараметров нет: пустые скобки читают настройку текущего Draw.
int из Imagick::STRETCH_*. Официальная доступность getter: PECL imagick 2 >=2.3.0, PECL imagick 3. Свежий объект в native-проверке дал 0 — незаданное native-состояние; в публичных константах этой сборки нет STRETCH_UNDEFINED. После явного setter CONDENSED прочитан соответствующий enum.
Официальная доступность: PECL imagick 2 >=2.3.0, PECL imagick 3. В исходной записи нет отметок deprecated/removed и отдельного changelog. Сохранена исходная отметка неполной документации там, где она есть; пустое описание ошибок не означает, что отказов нет. Полные исходные поля официальной записи сохранены в контракте. Примеры PHP 8.2+ фактически выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 с пятью неизменёнными DejaVu 2.37 fonts.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 160, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setFontStretch(Imagick::STRETCH_CONDENSED);
$stretch = $theme->getFontStretch();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontStretch($stretch);
$draw->annotation(20, 65, 'Заказ № 42');
echo 'copied-stretch=Condensed', "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-condensed-stretch.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-condensed-stretch.png', "\n";
$image->clear();
Результат: copied-condensed-stretch.png 600×160. Строка нарисована настоящим DejaVu Sans Condensed, поэтому при том же размере занимает меньше места. Getter вернул STRETCH_CONDENSED, не коэффициент сжатия, не фактическую ширину и не массив размеров. Консоль до имени файла: copied-stretch=Condensed. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Практическая задача: Перенести узкое начертание темы только в номер заказа
Заголовок должен быть обычной ширины, а длинный служебный номер — компактным. Прочитаем Condensed из отдельной темы и применим только перед строкой номера.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setFontStretch(Imagick::STRETCH_CONDENSED);
$stretch = $theme->getFontStretch();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->annotation(20, 65, 'Карточка получения');
$draw->setFontStretch($stretch);
$draw->annotation(20, 145, 'Заказ № 42');
echo 'heading=Normal; order=Condensed', "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/condensed-order-from-theme.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'condensed-order-from-theme.png', "\n";
$image->clear();
Результат: condensed-order-from-theme.png 600×200. Обычный заголовок и узкий номер заказа. Getter сообщает запрос ширины начертания, не фактический размер строки. Чтобы узнать, поместится ли конкретный номер, нужны метрики с теми же family/style/weight/stretch и размером. Консоль до имени файла: heading=Normal; order=Condensed. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Ошибки, альтернативы и стоимость
Один getter CONDENSED не доказывает узость результата, особенно при фиксированном TTF. QueryFontMetrics textWidth — advance строки, не готовый bitmap bbox. Если требуется одинаковая ширина колонки, задайте правила переноса/сокращения и измерьте выбранное начертание.
Установка параметров, поиск/чтение TTF, поддержка символов, вычисление метрик, рисование и запись PNG — отдельные этапы. Один true setter не проверяет их все. При неизвестной настройке выбирайте разрешённый режим приложения или явный отказ. Не передавайте пути к произвольным загружаемым fonts; комплект главы фиксирован. Растеризация и метрики требуют работы font renderer; кэшировать можно проверенный результат для неизменных текста и всех font-настроек. Не обещаем ускорение от одного getter или одинаковый результат при смене renderer.
Общие строки подготовили UTF-8 текст, 72 DPI, размер, цвет и отсутствие stroke. SetResolution вызывается сразу после создания Draw до других настроек. Координата y у annotation — baseline, а не верхняя граница символов. QueryFontMetrics следует выполнять при тех же family/style/weight/stretch и размере, с которыми будет нарисована строка. Метрика advance и bbox пикселей — разные измерения.
Соседние настройки: ImagickDraw::getFontFamily · ImagickDraw::setFontFamily · ImagickDraw::getFontStyle · ImagickDraw::setFontStyle · ImagickDraw::getFontWeight · ImagickDraw::setFontWeight · ImagickDraw::setFontStretch. Для точного файла — setFont и первые подписи, для положения — baseline и выравнивание, для метрик — queryFontMetrics.
ImagickDraw::setFontStretchНомер заказа должен поместиться в ограниченном поле при прежней высоте букв.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFontStretch(int $stretch): boolНомер заказа должен поместиться в ограниченном поле при прежней высоте букв.
Выберите STRETCH_NORMAL или CONDENSED для доступного зарегистрированного начертания. В нашем наборе это два оригинальных файла Sans Book и Sans Condensed. STRETCH_ANY — wildcard без ограничения. Setter не задаёт коэффициент и не гарантирует наличие Expanded/UltraCondensed у конкретной семьи.

Синтаксис, параметры и результат
ImagickDraw::setFontStretch(int $stretch): bool| Параметр | Что передать и зачем |
|---|---|
| $stretch | int, Imagick::STRETCH_NORMAL, ULTRACONDENSED, EXTRACONDENSED, CONDENSED, SEMICONDENSED, SEMIEXPANDED, EXPANDED, EXTRAEXPANDED, ULTRAEXPANDED или ANY с полным префиксом STRETCH_. В примерах задействованы только реально имеющиеся Normal и Condensed; ANY не означает обязательный Normal. |
bool по сигнатуре, хотя официальный prose говорит об отсутствии результата. Текущий wrapper записывает int через void DrawSetFontStretch и возвращает true; самостоятельной проверки enum в wrapper нет. Неверный int не преподносится как гарантированное исключение.
Официальная доступность: PECL imagick 2, PECL imagick 3. В исходной записи нет отметок deprecated/removed и отдельного changelog. Сохранена исходная отметка неполной документации там, где она есть; пустое описание ошибок не означает, что отказов нет. Полные исходные поля официальной записи сохранены в контракте. Примеры PHP 8.2+ фактически выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 с пятью неизменёнными DejaVu 2.37 fonts.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->annotation(20, 65, 'Заказ № 42');
$draw->setFontStretch(Imagick::STRETCH_CONDENSED);
$draw->annotation(20, 145, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/normal-and-condensed-stretch.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'normal-and-condensed-stretch.png', "\n";
$image->clear();
Результат: normal-and-condensed-stretch.png 600×200. Сверху Normal, снизу Condensed одной строки при 32 пунктах. Нижняя строка реально уже за счёт зарегистрированного Condensed-файла; в этой проверке advance около 191 и 172. Setter не задаёт процент и не равен scale(0.9,1). Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Практическая задача: Поместить номер в поле 180 пикселей, проверив метрики
Номер при 32 пунктах не помещается в поле шириной 180. Сначала покажем обычную строку, затем измерим её и выберем зарегистрированный Condensed. Если и он не помещается, явно откажем, а не будем выдавать обрезанный результат за успешный.
<?php
declare(strict_types=1);
$fonts = require __DIR__ . '/fonts.php';
$image = new Imagick();
$image->newImage(600, 200, 'white');
$image->setImageFormat('png');
$frame = new ImagickDraw();
$frame->setFillColor('none');
$frame->setStrokeColor('#b0bfc2');
$frame->rectangle(20, 30, 200, 80);
$frame->rectangle(20, 110, 200, 160);
$image->drawImage($frame);
$frame->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFontFamily('AEN Sans');
$draw->setFontStyle(Imagick::STYLE_NORMAL);
$draw->setFontWeight(400);
$draw->setFontStretch(Imagick::STRETCH_NORMAL);
$draw->setFontSize(32);
$draw->setTextEncoding('UTF-8');
$draw->setFillColor('#146c74');
$draw->setStrokeColor('none');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$text = 'Заказ № 42';
$draw->annotation(20, 65, $text);
$normal = $image->queryFontMetrics($draw, $text)['textWidth'];
if ($normal > 180) {
$draw->setFontStretch(Imagick::STRETCH_CONDENSED);
}
$fitted = $image->queryFontMetrics($draw, $text)['textWidth'];
if ($fitted > 180) {
throw new RuntimeException('Даже Condensed не помещается: нужен другой дизайн');
}
$draw->annotation(20, 145, $text);
echo 'normal-overflow=yes; condensed-fits=yes', "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/measured-condensed-number.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'measured-condensed-number.png', "\n";
$image->clear();
Результат: measured-condensed-number.png 600×200. Две рамки от x=20 до x=200. Верхняя Normal-строка выходит за правую границу, нижняя Condensed-строка помещается. Проверка опирается на реальные textWidth около 191 и 172; это метрика advance, не обязательно bbox всех видимых пикселей. У другого текста/шрифта результат иной. Консоль до имени файла: normal-overflow=yes; condensed-fits=yes. Распакуйте архив целиком в отдельную папку и выполните php example.php в свежем CLI-процессе PHP с imagick. Откройте PNG рядом с example.php обычным просмотрщиком при 100%. Fonts.php проверит и восстановит пять приложенных полных TTF, создаст локальный type.xml и настроит поиск шрифтов только этого процесса до первого font cache. Файлы не скачиваются и не устанавливаются в Windows. Повторный запуск заменяет одноимённые учебные файлы.
Ошибки, альтернативы и стоимость
Не путайте stretch face с интервалом между буквами, размером шрифта и scale изображения. Сначала проверьте доступное начертание, затем измерьте результат. Fixed Regular.ttf не превратится в Condensed от одной настройки. При отсутствии подходящего face выберите другую компоновку, размер/перенос либо явный отказ, сохранив читаемость.
Установка параметров, поиск/чтение TTF, поддержка символов, вычисление метрик, рисование и запись PNG — отдельные этапы. Один true setter не проверяет их все. При неизвестной настройке выбирайте разрешённый режим приложения или явный отказ. Не передавайте пути к произвольным загружаемым fonts; комплект главы фиксирован. Растеризация и метрики требуют работы font renderer; кэшировать можно проверенный результат для неизменных текста и всех font-настроек. Не обещаем ускорение от одного getter или одинаковый результат при смене renderer.
Общие строки подготовили UTF-8 текст, 72 DPI, размер, цвет и отсутствие stroke. SetResolution вызывается сразу после создания Draw до других настроек. Координата y у annotation — baseline, а не верхняя граница символов. QueryFontMetrics следует выполнять при тех же family/style/weight/stretch и размере, с которыми будет нарисована строка. Метрика advance и bbox пикселей — разные измерения.
Соседние настройки: ImagickDraw::getFontFamily · ImagickDraw::setFontFamily · ImagickDraw::getFontStyle · ImagickDraw::setFontStyle · ImagickDraw::getFontWeight · ImagickDraw::setFontWeight · ImagickDraw::getFontStretch. Для точного файла — setFont и первые подписи, для положения — baseline и выравнивание, для метрик — queryFontMetrics.
Источники и обсуждения
- ImagickDraw::getFontFamily
- ImagickDraw::getFontStretch
- ImagickDraw::getFontStyle
- ImagickDraw::getFontWeight
- ImagickDraw::setFontFamily
- ImagickDraw::setFontStretch
- ImagickDraw::setFontStyle
- ImagickDraw::setFontWeight
- Imagick 3.8.1 font wrappers
- ImageMagick 7.1.1-46 font matching
- ImageMagick 7.1.1-46 text renderer
- ImageMagick resources and font configuration
- DejaVu 2.37 official release
- DejaVu redistribution notices
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


