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

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

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

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

Глава 340 · После первых надписей

ImagickDraw: настоящий Bold, наклонные буквы и узкое начертание

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

Сделать итоговую сумму действительно жирной

Покупатель должен быстро увидеть, сколько платить. Нам нужна крупная читаемая сумма «Итого 1 250 руб.» настоящим Bold-начертанием. Не будем надеяться, что Regular-файл сам изменит свои буквы: дадим renderer семейство, где приложены обычный и жирный файлы, и выберем вес 700.

Перед запуском распакуйте архив целиком. Полную программу выполняют в свежем CLI-процессе PHP с imagick: fonts.php подготавливает локальные fonts и поиск до первого font cache. Это готовая среда именно для самостоятельного CLI-примера, а не helper для переключения шрифтов между запросами PHP-FPM.

Реальный PNG 600×160: итоговая сумма набрана DejaVu Sans Bold, 32 пункта при 72 DPI; stroke отключён
Реальный PNG 600×160: итоговая сумма набрана DejaVu Sans Bold, 32 пункта при 72 DPI; stroke отключён

Ключевые строки ниже — поясняющая выдержка, а не отдельная программа. $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 + style + weight + stretch → зарегистрированные реальные TTF faces → формы букв → drawImage → PNG; getters читают запросы, а не распознают результат
Family + style + weight + stretch → зарегистрированные реальные TTF faces → формы букв → drawImage → PNG; getters читают запросы, а не распознают результат
ЗапросСмыслЧего он не задаёт
FamilyГруппа связанных начертаний, например AEN Sans → DejaVu SansПуть к конкретному TTF или список CSS fallback.
StyleПрямой Normal, курсивный Italic, наклонный Oblique, любой AnyЖирность, размер и установку отсутствующего файла.
WeightЧисловой запрос веса; в этом wrapper 100..900Толщину контура или гарантию файла для каждого числа.
StretchОбычное/узкое/широкое начертание и AnyПроцент сжатия, кернинг и готовую ширину строки.

Модель похожа на заказ одежды: серия, фасон, плотность и ширина помогают выбрать вещь из имеющегося набора. Это только аналогия выбора; PHP не шьёт отсутствующий TTF. Если подходящего файла нет, renderer может выбрать приближение или отказать в зависимости от операции/конфигурации. В наших примерах есть все используемые faces, и результаты проверены на реальных PNG.

Запустить тот же результат без установки шрифтов в систему

Свойства Draw — запросы. Type.xml связывает локальные имена с пятью неизменёнными полными DejaVu 2.37 TTF; getter family может быть false при явном setFont(file)
Свойства Draw — запросы. Type.xml связывает локальные имена с пятью неизменёнными полными DejaVu 2.37 TTF; getter family может быть false при явном setFont(file)

Каждый архив содержит 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 NormalDejaVuSans.ttfBook, обычный текст без засечек.
AEN Sans Normal 700 NormalDejaVuSans-Bold.ttfНастоящие жирные формы.
AEN Sans Oblique 400 NormalDejaVuSans-Oblique.ttfНастоящие наклонные формы.
AEN Sans Normal 400 CondensedDejaVuSansCondensed.ttfНастоящее узкое начертание.
AEN Serif Normal 400 NormalDejaVuSerif.ttfBook с засечками.

Для свежего 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

Три строки: fixed Regular при обычных настройках; тот же fixed Regular при запросе 700/Oblique/Condensed; явный настоящий Bold.ttf. Первые две строки имеют одинаковые пиксели
Три строки: fixed Regular при обычных настройках; тот же fixed Regular при запросе 700/Oblique/Condensed; явный настоящий Bold.ttf. Первые две строки имеют одинаковые пиксели

SetFont с путём выбирает конкретный файл. После этого изменение запроса family/style/weight/stretch не обязано переключать этот файл. Это не ошибка getter: настройки действительно сохранены, но уже указан более конкретный источник форм. Если нужен строгий известный результат, укажите нужный TTF. Если нужен подбор face из семейства, создайте новый Draw без fixed font и настройте доступное family.

Сравнить запрос начертания и явно выбранный TTFПример для указанного окружения
<?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. Повторный запуск заменяет одноимённые учебные файлы.

Проверить место и заранее выбрать политику отказа

Normal и Condensed используют разные реальные файлы; узость не обещается только по enum
Normal и Condensed используют разные реальные файлы; узость не обещается только по enum
Отсутствующее family вызывает обработанный отказ; приложение явно выбирает зарегистрированное AEN Sans и получает читаемую надпись
Отсутствующее family вызывает обработанный отказ; приложение явно выбирает зарегистрированное AEN Sans и получает читаемую надпись

Для поля шириной 180 недостаточно посчитать символы: буквы и начертания имеют разные метрики. Сначала измерьте строку в Normal, затем при необходимости в реально доступном Condensed; если она всё равно не помещается, выберите перенос, другой размер, сокращение по смыслу или отказ. Поле из примера не считается универсальным решением для любого текста. Пробелы и знаки также участвуют в advance.

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

Собрать понятную карточку получения заказа

Реальный PNG 600×340: жирные номер/итог, наклонный статус, компактный срок хранения и отдельная благодарность Serif
Реальный PNG 600×340: жирные номер/итог, наклонный статус, компактный срок хранения и отдельная благодарность Serif

Один значок начертания не нужен сам по себе: покупатель должен отличить номер, статус, сумму и срок. Для каждого блока создаём отдельный 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_familystring, обязательное непустое имя. В этих архивах 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
ПараметрЧто передать и зачем
$styleint, одна из 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
ПараметрЧто передать и зачем
$weightint 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.

Отклонить неверный вес из настроек и применить разрешённый 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 у конкретной семьи.

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

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

ImagickDraw::setFontStretch(int $stretch): bool
ПараметрЧто передать и зачем
$stretchint, 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.

Запросить настоящее Condensed вместо сжатия пикселей: первый результатПример для указанного окружения
<?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. Если и он не помещается, явно откажем, а не будем выдавать обрезанный результат за успешный.

Поместить номер в поле 180 пикселей, проверив метрикиПример для указанного окружения
<?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.

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

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

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

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

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