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

Дерево руководства
Глава 335 · После первой фигуры
ImagickDraw: понятные надписи, файл шрифта и размер текста
Добавить читаемую подпись в карточку и получить готовый PNG: приложенный шрифт, базовая линия, размер в пунктах, плотность и обработка пропавшего файла.
Подписать статус и сохранить готовый PNG
Человеку, который открыл карточку заказа, нужна понятная подпись «Готово». Нарисуем её на белом изображении и сохраним PNG, который можно отправить или встроить в отчёт. Для первого результата достаточно файла шрифта, размера, цвета и одной команды текста. В каждом скачиваемом архиве уже есть открытый шрифт с кириллицей и его лицензия.

Распакуйте пример целиком. Первая строка $font = require __DIR__ . '/font.php'; запускает приложенный маленький подготовительный файл и получает путь к font.ttf. Он восстанавливает тот же шрифт из данных архива; ничего не скачивает и не устанавливает. Затем код создаёт холст и текстовый объект. Подробнее подготовка файла разобрана сразу после первого результата.
<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 120, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(20, 50, 'Готово');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/first-text-label.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-text-label.png', "\n";
$image->clear();
При успешном выполнении first-text-label.png 320×120 содержит читаемое бирюзовое «Готово» на белом фоне. Строка начинается около x=20 и стоит на базовой линии y=50; это не её верхняя граница. Файл font.ttf создаётся рядом из приложенных данных. Консоль — first-text-label.png.
$font, $image, $draw — имена переменных. new ImagickDraw() создаёт объект команд; -> вызывает его метод. setResolution(72,72) задаёт плотность до рисования, setFont($font) выбирает файл, setFontSize(24) — размер в пунктах, setFillColor — цвет букв. annotation(20,50,'Готово') добавляет надпись; drawImage наносит команды на пиксели. __DIR__ — папка PHP-файла, точка соединяет строки пути, writeImage сохраняет PNG. Проверка if (!...) сообщает об отказе записи. Базовая очередь объяснена в объекте Draw.
Файл шрифта входит в пример

Шрифт хранит формы символов. Одного имени «Arial» недостаточно: сервер может не знать его или выбрать другой файл. Приложенный Open Sans Regular 1.10 содержит использованные русские буквы. Рядом лежат font-license.txt с полной Apache License 2.0 и copyright, а также font-metadata.json с версией/источником. Поддержка этой кириллицы не означает поддержку всех emoji и письменностей.
| Файл архива | Назначение |
|---|---|
| font.ttf.b64 | Текстовая запись байтов неизменённого TTF; это транспортная форма, не новый шрифт. |
| font.php | Проверяет данные, восстанавливает font.ttf в папке примера, возвращает его путь. |
| font-license.txt | Условия распространения конкретного файла и copyright. |
| font-metadata.json | Сведения об исходнике, версии, размере и контрольной сумме. |
Base64 лишь позволяет положить бинарный font в текстовый пакет примера. Читать эту длинную запись вручную не требуется. Для работы достаточно распаковать весь архив и запустить основной PHP-файл в папке, доступной для записи. Если используете свой font, передайте путь к нему и проверьте его лицензию; helper относится к переносимости этих примеров, а не является методом Imagick.
Что делает приложенный font.php
<?php
// Portable example fixture. The unmodified Open Sans font uses Apache-2.0;
// see font-license.txt. No font is downloaded or installed on the computer.
$fontPath = __DIR__ . '/font.ttf';
$fontSha256 = '13c03e22a633919beb2847c58c8285fb8a735ee97097d7c48fd403f8294b05f8';
if (!is_file($fontPath) || hash_file('sha256', $fontPath) !== $fontSha256) {
$encoded = file_get_contents(__DIR__ . '/font.ttf.b64');
$fontBytes = $encoded === false ? false : base64_decode($encoded, true);
if ($fontBytes === false || strlen($fontBytes) !== 217276 || hash('sha256', $fontBytes) !== $fontSha256) {
throw new RuntimeException('Повреждён файл примера font.ttf.b64');
}
if (file_put_contents($fontPath, $fontBytes, LOCK_EX) !== strlen($fontBytes)) {
throw new RuntimeException('Не удалось записать font.ttf: проверьте права папки примера');
}
}
return $fontPath;
Базовая линия помогает поставить текст на своё место

Если поставить y=0, буквы могут уйти выше изображения. Прибавить к y постоянное «магическое число» для любого шрифта тоже ненадёжно: формы и выносные элементы отличаются. Здесь используется обычный начальный контекст без gravity и преобразований. Для точного размещения переменной строки нужно отдельно измерить строку через Imagick::queryFontMetrics. Getter размера этого не делает.

<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 160, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(15, 20, 305, 140);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(30, 82, 'Заказ № 42');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/card-with-text.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'card-with-text.png', "\n";
$image->clear();
Результат: card-with-text.png 320×160 содержит мятную карточку с бирюзовой надписью «Заказ № 42». Прямоугольник нанесён первым объектом, текст — вторым. Плотность второго Draw настроена до его команд, поэтому уже подготовленная геометрия первого не затрагивается. Консоль — card-with-text.png.
Пункты, пиксели и плотность



Пункт — единица размера: 1 pt = 1/72 дюйма. Пиксель — элемент готового растра. Номинальный масштаб em в пикселях = pt × DPI / 72: при 24 пунктах и 72 получаем 24, при 144 — 48. Это не равенство высоте закрашенных букв; формула связывает номинальный масштаб шрифта с плотностью. Высота реально окрашенных букв зависит от конкретных символов, font, hinting и сглаживания; сам point size её не измеряет. Getter возвращает настройку в пунктах. DPI рисующего контекста, размеры холста и печатная плотность PNG — три отдельных свойства.
В текущем PHP wrapper setResolution заменяет внутренний DrawingWand. Поэтому безопасная последовательность здесь: новый Draw → плотность → font → размер/цвет → annotation. Не вставляйте этот setter после накопленной очереди с ожиданием, что она гарантированно сохранится. Увеличение плотности текста не делает newImage(320,120) большим холстом; нужные поля и размер задают отдельно.
Когда шрифт пропал или надпись не помещается

Проверяйте путь и права чтения, затем поддержку нужных символов в самом font. Пустая строка, квадратики вместо букв, неверная кодировка и слишком маленький холст — разные причины. В примерах выбирается известный fallback для необязательного файла; обязательная фирменная гарнитура потребовала бы понятного отказа. Строки сохранены в UTF-8; испорченные исходные байты замена шрифта не исправит.
Annotation добавляет строку с заданными координатами; автоматическое уменьшение под любую ширину здесь не предусмотрено. Для коротких известных подписей достаточно осознанного макета и полей. Для пользовательского текста нужны ограничение входа, измерение, перенос или сокращение; см. измерить строку через Imagick::queryFontMetrics. Эта глава знакомит с исходными настройками, а не объявляет готовым универсальный движок верстки.
Карточка заказа с настоящими подписями
Теперь у карточки есть понятный заголовок, две строки состояния и небольшая отметка обновления. Фон рисуется отдельно, затем новый текстовый Draw получает плотность и файл шрифта до записи надписей. Размер меняется перед нужными строками; уже записанные надписи остаются со своими настройками.

<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(480, 240, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(20, 20, 460, 220);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(28);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(40, 68, 'Заказ № 42');
$draw->setFontSize(18);
$draw->annotation(40, 110, 'Склад: 12 мест');
$draw->annotation(40, 145, 'Доставка: готово');
$draw->setFontSize(14);
$draw->setFillColor('#c25732');
$draw->annotation(40, 195, 'Обновлено сегодня');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/text-order-card.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'text-order-card.png', "\n";
$image->clear();
При успехе text-order-card.png 480×240 содержит мятную панель (20,20)—(460,220). Заголовок 28 пунктов стоит на y=68; строки 18 пунктов — на y=110 и y=145, отметка 14 пунктов — на y=195. Все строки начинаются с x=40. Используется приложенный Open Sans при плотности 72. Консоль — text-order-card.png.
Упражнение: замените только статус доставки на «Ожидается», сохранив расположение остальных строк. Решение: изменить текст второго annotation размера 18; не переносить setResolution в середину очереди. Затем попробуйте длинный адрес: прежде чем уменьшать point size наугад, измерьте его и выберите политику переноса или отдельную строку. GetFontSize не сообщит ширину адреса.
От короткой подписи к управляемому макету
- Для воспроизводимой подписи нужны файл font, поддерживаемые символы, размер в пунктах, плотность, цвет и базовая линия.
- GetFont/getFontSize читают настройки. Они не распознают текст с картинки и не измеряют его пиксельные границы.
- Плотность задавайте сразу после new Draw. Размер холста и метаданные печати — отдельные операции.
- Шрифт приложен к каждому примеру с полной лицензией; default-системный font не считается надёжной зависимостью.
- Длинная внешняя строка требует измерения и политики макета, а не обещания автоматического вписывания annotation.
Продолжить можно через измерить строку через Imagick::queryFontMetrics, ограничение области и оформление обводки. Другие текстовые API остаются отдельными узлами справочника.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
ImagickDraw::annotationУ статуса должна появиться настоящая читаемая надпись в PNG: её увидит человек, которому отправили карточку или отчёт.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::annotation(float $x, float $y, string $text): boolУ статуса должна появиться настоящая читаемая надпись в PNG: её увидит человек, которому отправили карточку или отчёт.
Annotation записывает текст в очередь Draw с текущими шрифтом, размером, цветом и координатной системой. В обычном начальном контексте x отсчитывается вправо, y вниз, а y текста обозначает базовую линию — линию, на которой стоят буквы. Части некоторых букв могут уходить ниже неё. Здесь не задана gravity/другая привязка и нет CTM.

Синтаксис, параметры и результат
ImagickDraw::annotation(float $x, float $y, string $text): bool| Параметр | Что передать и зачем |
|---|---|
| $x, $y | float, обязательные координаты начала строки и её базовой линии в текущем пространстве Draw. Это не ширина/высота блока и не координаты верхней границы букв. При y=0 значительная часть надписи может оказаться выше холста. |
| $text | string, обязательный текст. Примеры сохранены в UTF-8, а приложенный font содержит используемую кириллицу. Файл шрифта, кодировка строки и поддержка нужных символов — разные входные условия. |
bool по signature; текущий wrapper после void DrawAnnotation возвращает true. Официальное prose «Nothing is returned» сохранено отдельно. Возвращается не картинка, не ширина строки и не набор глифов.
Доступность официальной записи: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot пусты. Программы рассчитаны на PHP 8.2+ с imagick; файл font и его лицензия прилагаются. Исторический номер исправления, которого нет в источниках, не приписывается.
Ошибки в кратких страницах подробно не перечислены. Файл шрифта может отсутствовать/не читаться, font может не содержать символ, каталог может запрещать сохранение PNG, renderer может отказать при drawImage. Успех setter и успешная растеризация — разные этапы. Пример проверяет отказ writeImage; при HTTP-выводе диагностику обрабатывают до отправки бинарного PNG.
Полный сохранённый контракт PHP Manual
Исходные поля сохранены полностью: описание, параметры, return, ошибки, версии, исходные примеры/hashes, see-also и changelog. Неоднозначности signature/prose поясняются отдельно по текущему wrapper.
{
"id": "imagickdraw.annotation",
"name": "ImagickDraw::annotation",
"purpose_en": "Draws text on the image",
"description_en": "Draws text on the image.",
"signature": "ImagickDraw::annotation(float $x, float $y, string $text): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "x",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "The x coordinate where text is drawn"
},
{
"name": "y",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "The y coordinate where text is drawn"
},
{
"name": "text",
"type": "string",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "The text to draw on the image"
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.annotation.php",
"official_page_sha256": "2a959d491644d6bd1d99a5a9561199bcebfdb568b19c892cef77028fbbcd189d",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/annotation.xml",
"xml_sha256": "688a95c5acc1be8ff9b76d1ed0bb16bb7f58544504c01aac880909f0fbe30416",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_shapes.py"
}<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 120, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(20, 50, 'Готово');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/status-label.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'status-label.png', "\n";
$image->clear();
При успешном выполнении создаётся status-label.png 320×120. Бирюзовая надпись «Готово» на белом фоне. x=20 задаёт начало строки, y=50 — её базовую линию; это не верхний край видимых букв. Надпись появляется после drawImage, а не в возвращаемом bool annotation. Последняя строка — status-label.png. Все четыре файла шрифта/подготовки включены в скачиваемый архив.
Практическая задача: Подписать два компонента из данных
На карточках склада и доставки уже есть фоны, но без подписей их смысл не виден. Нанесём названия и статусы на разных базовых линиях; координаты и строки приходят из небольшого собственного массива.

<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(400, 200, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(20, 30, 180, 170);
$background->rectangle(220, 30, 380, 170);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(20);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
foreach ([[20, 'Склад', '12 мест'], [220, 'Доставка', 'Готово']] as [$left, $title, $status]) {
$draw->setFontSize(20);
$draw->setFillColor('#146c74');
$draw->annotation($left + 15, 80, $title);
$draw->setFontSize(16);
$draw->setFillColor('#c25732');
$draw->annotation($left + 15, 120, $status);
}
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/labelled-components.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'labelled-components.png', "\n";
$image->clear();
Результат: labelled-components.png 400×200. Две мятные карточки. Слева бирюзовое «Склад» и оранжевое «12 мест», справа «Доставка» и «Готово». Названия имеют базовую линию y=80 и размер 20 пунктов, статусы — y=120 и 16 пунктов. Цикл не рассчитывает ширину произвольных строк: здесь выбраны короткие известные подписи. Последняя строка — labelled-components.png. Приложенный font.php подготавливает файл из этого же архива.
Ошибки, альтернативы и стоимость
Успех записи команды не означает, что шрифт и все символы отрисуются при drawImage. Нулевой y, слишком маленький холст, прозрачный fill и неподдержанные глифы могут дать невидимую/обрезанную надпись. Начните с короткого текста, явного файла шрифта, непрозрачного цвета и свободных полей. Автоматический перенос и подбор размера этот метод не обещает.
Размер font и работа renderer добавляют стоимость загрузки/растеризации. Сохраняйте проверенную тему для компонентов, ограничивайте размеры холста и длину внешнего текста, не пытайтесь подобрать размер бесконечным циклом. Для точного вписывания сначала измерить строку через Imagick::queryFontMetrics, затем выберите перенос/сокращение. Не утверждайте, что произвольный шрифт или письменность отрисуются по одному успешному setter; проверяйте свою связку и нужные глифы.
В расширенных примерах require получает путь от helper, is_file/is_readable проверяют локальный файл, foreach обходит подписи, min/max ограничивают настройку, === различает типы. См. файлы, условия и циклы, аргументы и возврат функции.
Соседние API: ImagickDraw::setFont · ImagickDraw::getFont · ImagickDraw::setFontSize · ImagickDraw::getFontSize · ImagickDraw::setResolution. Практическое продолжение — независимые объекты команд и координаты.
ImagickDraw::setFontОдна и та же подпись должна выглядеть одинаково на компьютере разработчика и сервере, где привычного системного шрифта может не быть.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFont(string $font_name): boolОдна и та же подпись должна выглядеть одинаково на компьютере разработчика и сервере, где привычного системного шрифта может не быть.
SetFont выбирает шрифт для следующих текстовых команд. Полностью заданное настроенное имя может разрешаться через конфигурацию ImageMagick; явный путь к приложенному файлу уменьшает зависимость от системного списка шрифтов. Он не устанавливает шрифт в Windows/Linux и не делает любой символ поддержанным.

Синтаксис, параметры и результат
ImagickDraw::setFont(string $font_name): bool| Параметр | Что передать и зачем |
|---|---|
| $font_name | string, обязательное непустое имя доступного шрифта либо путь к файлу. В примерах передан абсолютный путь $font от приложенного helper; в нём нет имени диска автора или обязательного Arial. Не выбирайте произвольный путь из запроса пользователя. |
bool: true при успехе. Текущий wrapper отклоняет пустую строку, проверяет путь/доступ для имени, не найденного в списке, и превращает native MagickFalse в ImagickDrawException. Отказ декодирования или нужных глифов всё ещё может обнаружиться при рисовании.
Доступность официальной записи: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot пусты. Программы рассчитаны на PHP 8.2+ с imagick; файл font и его лицензия прилагаются. Исторический номер исправления, которого нет в источниках, не приписывается.
Ошибки в кратких страницах подробно не перечислены. Файл шрифта может отсутствовать/не читаться, font может не содержать символ, каталог может запрещать сохранение PNG, renderer может отказать при drawImage. Успех setter и успешная растеризация — разные этапы. Пример проверяет отказ writeImage; при HTTP-выводе диагностику обрабатывают до отправки бинарного PNG.
Полный сохранённый контракт PHP Manual
Исходные поля сохранены полностью: описание, параметры, return, ошибки, версии, исходные примеры/hashes, see-also и changelog. Неоднозначности signature/prose поясняются отдельно по текущему wrapper.
{
"id": "imagickdraw.setfont",
"name": "ImagickDraw::setFont",
"purpose_en": "Sets the fully-specified font to use when annotating with text",
"description_en": "Sets the fully-specified font to use when annotating with text.",
"signature": "ImagickDraw::setFont(string $font_name): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "font_name",
"type": "string",
"by_reference": false,
"optional": false,
"default": null,
"description_en": ""
}
],
"return_en": "Returns true on success.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setFont example",
"language": "php",
"code_sha256": "3272b8818b6b421dbd80df1a55695d9b1644c73a9d37adf330c94b3ff33e93ad"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setfont.php",
"official_page_sha256": "c27d22517063bb04b2679e27171a6b153acd310c038cad8e99f0550637423bbe",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setfont.xml",
"xml_sha256": "cfefdaa92264e46955838bc34bcbecd2eb4e6dc2809ab4fd6ebfc41b5a5a2f45",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 120, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(20, 50, 'Готово');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/bundled-font-label.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'bundled-font-label.png', "\n";
$image->clear();
При успешном выполнении создаётся bundled-font-label.png 320×120. Надпись «Готово» выведена приложенным Open Sans Regular, 24 пункта при плотности 72. Системный Arial/Helvetica не требуется; PHP передаёт путь к восстановленному font.ttf. Последняя строка — bundled-font-label.png. Все четыре файла шрифта/подготовки включены в скачиваемый архив.
Практическая задача: Продолжить экспорт при отсутствии необязательного шрифта
В развёртывании забыли дополнительный custom font. Проверим локальный файл до передачи его в native API и используем приложенный лицензированный шрифт. В архиве missing-custom.ttf намеренно отсутствует.
<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 120, 'white');
$image->setImageFormat('png');
$requested = __DIR__ . '/missing-custom.ttf';
if (!is_file($requested) || !is_readable($requested)) {
$requested = $font;
echo 'font-policy=bundled-fallback', "\n";
}
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($requested);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(20, 70, 'Шрифт восстановлен');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/font-fallback.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'font-fallback.png', "\n";
$image->clear();
Результат: font-fallback.png 320×120. Видимая надпись «Шрифт восстановлен» на белом фоне, 24 пункта, базовая линия y=70. Ошибка зависимости не подменяется пустым PNG. Это выбранная политика приложения: обязательный фирменный шрифт вместо fallback потребовал бы явного отказа. Перед именем файла консоль: font-policy=bundled-fallback. Последняя строка — font-fallback.png. Приложенный font.php подготавливает файл из этого же архива.
Ошибки, альтернативы и стоимость
Наличие файла и прав чтения не доказывает пригодность каждого глифа. Результат зависит от самого font и renderer. Для обязательной фирменной гарнитуры лучше отказать с ясной ошибкой; для необязательной предусмотрите известный fallback, как во втором примере. Лицензия должна разрешать распространение конкретного файла: не копируйте случайный шрифт из Windows в архив.
Размер font и работа renderer добавляют стоимость загрузки/растеризации. Сохраняйте проверенную тему для компонентов, ограничивайте размеры холста и длину внешнего текста, не пытайтесь подобрать размер бесконечным циклом. Для точного вписывания сначала измерить строку через Imagick::queryFontMetrics, затем выберите перенос/сокращение. Не утверждайте, что произвольный шрифт или письменность отрисуются по одному успешному setter; проверяйте свою связку и нужные глифы.
В расширенных примерах require получает путь от helper, is_file/is_readable проверяют локальный файл, foreach обходит подписи, min/max ограничивают настройку, === различает типы. См. файлы, условия и циклы, аргументы и возврат функции.
Соседние API: ImagickDraw::annotation · ImagickDraw::getFont · ImagickDraw::setFontSize · ImagickDraw::getFontSize · ImagickDraw::setResolution. Практическое продолжение — независимые объекты команд и координаты.
ImagickDraw::getFontКомпоненту нужно перенести выбранный файл в новый Draw или заменить неизвестную системную настройку понятным переносимым вариантом.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getFont(): stringКомпоненту нужно перенести выбранный файл в новый Draw или заменить неизвестную системную настройку понятным переносимым вариантом.
Getter сообщает строковое имя/путь текущего шрифта, но не читает текст с картинки и не измеряет его. Возвращаемая строка может обозначать настроенное имя, а не существующий путь; поэтому проверка файла осмысленна только в компоненте, который договорился работать с локальным файлом.

Синтаксис, параметры и результат
ImagickDraw::getFont(): stringАргументов нет. Метод читает настройку конкретного Draw.
Snapshot signature — string, но его return prose предусматривает false при отсутствии font; в прочитанном C также есть RETURN_FALSE при NULL. Это расхождение сохранено и пояснено, а код учитывает false. Binding сам освобождает временную C-строку; PHP-пользователю не нужен free.
Доступность официальной записи: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot пусты. Программы рассчитаны на PHP 8.2+ с imagick; файл font и его лицензия прилагаются. Исторический номер исправления, которого нет в источниках, не приписывается.
Ошибки в кратких страницах подробно не перечислены. Файл шрифта может отсутствовать/не читаться, font может не содержать символ, каталог может запрещать сохранение PNG, renderer может отказать при drawImage. Успех setter и успешная растеризация — разные этапы. Пример проверяет отказ writeImage; при HTTP-выводе диагностику обрабатывают до отправки бинарного PNG.
Полный сохранённый контракт PHP Manual
Исходные поля сохранены полностью: описание, параметры, return, ошибки, версии, исходные примеры/hashes, see-also и changelog. Неоднозначности signature/prose поясняются отдельно по текущему wrapper.
{
"id": "imagickdraw.getfont",
"name": "ImagickDraw::getFont",
"purpose_en": "Returns the font",
"description_en": "Returns a string specifying the font used when annotating with text.",
"signature": "ImagickDraw::getFont(): string",
"modifiers": [
"public"
],
"return_type": "string",
"parameters": [],
"return_en": "Returns a string on success and false if no font is set.",
"errors_en": "",
"changelog_en": "",
"examples": [],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.getfont.php",
"official_page_sha256": "94d22d6ecbb35a165b109f599bcc283ee794f41fd0c9cfd8c23e5604bbec7a8c",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getfont.xml",
"xml_sha256": "38580c5e9310942063f9bd4cd674da1ae901dbd70290611fdaf3bf692f95ed0f",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(360, 120, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setResolution(72, 72);
$theme->setFont($font);
$selected = $theme->getFont();
if ($selected === false || !is_file($selected)) {
throw new LogicException('Тема не содержит доступный файл шрифта');
}
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($selected);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(20, 60, 'Общая тема');
echo 'font=', basename($selected), '; type=', get_debug_type($selected), "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/reused-font-setting.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'reused-font-setting.png', "\n";
$image->clear();
При успешном выполнении создаётся reused-font-setting.png 360×120. Надпись «Общая тема» использует шрифт, прочитанный из другого Draw. Getter дал путь к настройке, новый объект явно получил его через setFont. Это не перенос готового изображения или метрик текста. Перед именем файла консоль: font=font.ttf; type=string. Последняя строка — reused-font-setting.png. Все четыре файла шрифта/подготовки включены в скачиваемый архив.
Практическая задача: Не зависеть от неизвестного шрифта по умолчанию
Компонент получает свежий Draw и не знает его настройки в чужой сборке. Прочитанное значение поможет принять политику: использовать именно файл из архива, а не случайное системное имя.
<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(360, 120, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$observed = $draw->getFont();
if ($observed === false || realpath($observed) !== realpath($font)) {
$draw->setFont($font);
}
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(20, 70, 'Шрифт выбран');
echo 'font-policy=portable', "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/explicit-font-policy.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'explicit-font-policy.png', "\n";
$image->clear();
Результат: explicit-font-policy.png 360×120. Надпись «Шрифт выбран» нарисована приложенным файлом независимо от начальной системной настройки. Код не обещает, что getFont нового объекта всегда false: учитывается и строка с другим путём/именем. Realpath используется для сравнения существующих локальных файлов. Перед именем файла консоль: font-policy=portable. Последняя строка — explicit-font-policy.png. Приложенный font.php подготавливает файл из этого же архива.
Ошибки, альтернативы и стоимость
Не считайте, что новый Draw всегда возвращает одинаковое значение на всех сборках. Прочитанный путь не включает размер, плотность, кодировку и размеры строки. Для повторного использования явно передайте его setFont другого объекта; чужой системный alias может отсутствовать на другом сервере.
Размер font и работа renderer добавляют стоимость загрузки/растеризации. Сохраняйте проверенную тему для компонентов, ограничивайте размеры холста и длину внешнего текста, не пытайтесь подобрать размер бесконечным циклом. Для точного вписывания сначала измерить строку через Imagick::queryFontMetrics, затем выберите перенос/сокращение. Не утверждайте, что произвольный шрифт или письменность отрисуются по одному успешному setter; проверяйте свою связку и нужные глифы.
В расширенных примерах require получает путь от helper, is_file/is_readable проверяют локальный файл, foreach обходит подписи, min/max ограничивают настройку, === различает типы. См. файлы, условия и циклы, аргументы и возврат функции.
Соседние API: ImagickDraw::annotation · ImagickDraw::setFont · ImagickDraw::setFontSize · ImagickDraw::getFontSize · ImagickDraw::setResolution. Практическое продолжение — независимые объекты команд и координаты.
ImagickDraw::setFontSizeЦена должна быть заметнее подписи, а название — отличаться от статуса. Размер текста задаётся до записи каждой нужной строки.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFontSize(float $point_size): boolЦена должна быть заметнее подписи, а название — отличаться от статуса. Размер текста задаётся до записи каждой нужной строки.
Параметр point size выражается в типографских пунктах: один пункт равен 1/72 дюйма. Вместе с плотностью рисования он определяет номинальный масштаб em, но не точную высоту окрашенных букв. Например, одинаковые 24 пункта при 72 и 144 дают разный пиксельный масштаб. Формы букв зависят от font, строки и сглаживания.

Синтаксис, параметры и результат
ImagickDraw::setFontSize(float $point_size): bool| Параметр | Что передать и зачем |
|---|---|
| $point_size | float, обязательный размер в пунктах, например 24.0. Для своего компонента используйте положительное конечное значение и разумный диапазон. Это не размер PNG, не желаемая ширина фразы и не число символов. |
bool: текущий wrapper вызывает void DrawSetFontSize и возвращает true. Текст Manual об отсутствии значения противоречит bool signature; snapshot не подменяется. Этот bool не доказывает, что строка поместится в холст.
Доступность официальной записи: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot пусты. Программы рассчитаны на PHP 8.2+ с imagick; файл font и его лицензия прилагаются. Исторический номер исправления, которого нет в источниках, не приписывается.
Ошибки в кратких страницах подробно не перечислены. Файл шрифта может отсутствовать/не читаться, font может не содержать символ, каталог может запрещать сохранение PNG, renderer может отказать при drawImage. Успех setter и успешная растеризация — разные этапы. Пример проверяет отказ writeImage; при HTTP-выводе диагностику обрабатывают до отправки бинарного PNG.
Полный сохранённый контракт PHP Manual
Исходные поля сохранены полностью: описание, параметры, return, ошибки, версии, исходные примеры/hashes, see-also и changelog. Неоднозначности signature/prose поясняются отдельно по текущему wrapper.
{
"id": "imagickdraw.setfontsize",
"name": "ImagickDraw::setFontSize",
"purpose_en": "Sets the font pointsize to use when annotating with text",
"description_en": "Sets the font pointsize to use when annotating with text.",
"signature": "ImagickDraw::setFontSize(float $point_size): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "point_size",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": "the point size"
}
],
"return_en": "Nothing is returned.",
"errors_en": "",
"changelog_en": "",
"examples": [
{
"title": "ImagickDraw::setFontSize example",
"language": "php",
"code_sha256": "4e00895c667a48a140c3802d47c10f8450425923dd000db1eacdc4084ffeee73"
}
],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setfontsize.php",
"official_page_sha256": "d3c72c4cb6b73812eb36c2446c68066dcb80807863755b44033a0155e5f6099b",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setfontsize.xml",
"xml_sha256": "b8696ea01f2688e64112e6fcf18c50a3546910a33ccf8b87a14e63e5830853b9",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(640, 120, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
foreach ([[20, 18], [340, 36]] as [$x, $points]) {
$draw->setFontSize($points);
$draw->annotation($x, 70, 'Заказ');
}
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/two-point-sizes.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'two-point-sizes.png', "\n";
$image->clear();
При успешном выполнении создаётся two-point-sizes.png 640×120. Две надписи «Заказ» на одной базовой линии y=70: слева 18 пунктов, справа 36 при одинаковых шрифте и плотности 72. Правая заметно крупнее; высота окрашенных букв не объявляется равной 18 или 36 пикселям. Последняя строка — two-point-sizes.png. Все четыре файла шрифта/подготовки включены в скачиваемый архив.
Практическая задача: Выделить цену и сохранить читаемую подпись
В ценнике название, цена и единица упаковки имеют разный визуальный вес. Оставим один шрифт и плотность, изменяя размер только перед нужной строкой.
<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(400, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(20, 45, 'Комплект');
$draw->setFontSize(36);
$draw->annotation(20, 100, '1 250 руб.');
$draw->setFontSize(14);
$draw->annotation(20, 145, 'За одну упаковку');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/price-hierarchy.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'price-hierarchy.png', "\n";
$image->clear();
Результат: price-hierarchy.png 400×180. Название «Комплект» в 24 пункта, крупная цена «1 250 руб.» в 36 и небольшая строка «За одну упаковку» в 14. Размеры заданы до соответствующих annotation; уже записанные строки не меняются задним числом. Последняя строка — price-hierarchy.png. Приложенный font.php подготавливает файл из этого же архива.
Ошибки, альтернативы и стоимость
Не используйте point size как готовую высоту/ширину надписи. Не выводите длинный текст в маленький холст с надеждой на автоматическое уменьшение. Для переменных строк требуется отдельное измерение и решение о переносе/сокращении. Старый пользовательский комментарий о «пиксельной высоте» не является нормативным определением параметра.
Размер font и работа renderer добавляют стоимость загрузки/растеризации. Сохраняйте проверенную тему для компонентов, ограничивайте размеры холста и длину внешнего текста, не пытайтесь подобрать размер бесконечным циклом. Для точного вписывания сначала измерить строку через Imagick::queryFontMetrics, затем выберите перенос/сокращение. Не утверждайте, что произвольный шрифт или письменность отрисуются по одному успешному setter; проверяйте свою связку и нужные глифы.
В расширенных примерах require получает путь от helper, is_file/is_readable проверяют локальный файл, foreach обходит подписи, min/max ограничивают настройку, === различает типы. См. файлы, условия и циклы, аргументы и возврат функции.
Соседние API: ImagickDraw::annotation · ImagickDraw::setFont · ImagickDraw::getFont · ImagickDraw::getFontSize · ImagickDraw::setResolution. Практическое продолжение — независимые объекты команд и координаты.
ImagickDraw::getFontSizeПодпись должна быть немного меньше заголовка; внешняя тема должна соблюдать допустимый диапазон компонента. Для этого нужно прочитать настройку, а не угадывать её по PNG.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::getFontSize(): floatПодпись должна быть немного меньше заголовка; внешняя тема должна соблюдать допустимый диапазон компонента. Для этого нужно прочитать настройку, а не угадывать её по PNG.
Getter возвращает текущий point size как float. Его можно использовать для производного стиля или проверки политики. Он не получает высоту буквы, ширину строки, базовую линию, число пикселей или размер уже созданного изображения.

Синтаксис, параметры и результат
ImagickDraw::getFontSize(): floatАргументов нет. Метод читает настройку конкретного Draw.
float — размер в пунктах, установленный в этом Draw. После явного setFontSize(24) ожидается 24.0; echo печатает 24, а get_debug_type показывает float. Getter не возвращает массив textWidth/textHeight.
Доступность официальной записи: PECL imagick 2, PECL imagick 3. Deprecated/removed/changelog в snapshot пусты. Программы рассчитаны на PHP 8.2+ с imagick; файл font и его лицензия прилагаются. Исторический номер исправления, которого нет в источниках, не приписывается.
Ошибки в кратких страницах подробно не перечислены. Файл шрифта может отсутствовать/не читаться, font может не содержать символ, каталог может запрещать сохранение PNG, renderer может отказать при drawImage. Успех setter и успешная растеризация — разные этапы. Пример проверяет отказ writeImage; при HTTP-выводе диагностику обрабатывают до отправки бинарного PNG.
Полный сохранённый контракт PHP Manual
Исходные поля сохранены полностью: описание, параметры, return, ошибки, версии, исходные примеры/hashes, see-also и changelog. Неоднозначности signature/prose поясняются отдельно по текущему wrapper.
{
"id": "imagickdraw.getfontsize",
"name": "ImagickDraw::getFontSize",
"purpose_en": "Returns the font pointsize",
"description_en": "Returns the font pointsize used when annotating with text.",
"signature": "ImagickDraw::getFontSize(): float",
"modifiers": [
"public"
],
"return_type": "float",
"parameters": [],
"return_en": "Returns the font size associated with the current ImagickDraw object.",
"errors_en": "",
"changelog_en": "",
"examples": [],
"see_also": [],
"availability": {
"from": "PECL imagick 2, PECL imagick 3",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.getfontsize.php",
"official_page_sha256": "ace20b6be422f7063c681cbbd8b9a2a682d9bd6d0b10c826fbb30d4bd11d9b75",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/getfontsize.xml",
"xml_sha256": "10fe137b9cc580d14fdc343599f6694a39f1d8ee132e4c994f2116259c2d24f8",
"official_undocumented_marker": true,
"owner": "imagick_reference_draw_style.py"
}<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(360, 140, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$points = $draw->getFontSize();
$draw->annotation(20, 50, 'Заголовок');
$draw->setFontSize($points - 6);
$draw->annotation(20, 90, 'Подпись');
echo 'font-size=', $points, '; type=', get_debug_type($points), "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/size-derived-caption.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'size-derived-caption.png', "\n";
$image->clear();
При успешном выполнении создаётся size-derived-caption.png 360×140. Заголовок в 24 пункта и подпись в 18 пунктов. Считанный float используется для производного оформления; он не измеряет ширину слова или расстояние от верхнего пикселя буквы до нижнего. Перед именем файла консоль: font-size=24; type=float. Последняя строка — size-derived-caption.png. Все четыре файла шрифта/подготовки включены в скачиваемый архив.
Практическая задача: Применить ограничение размера из внешней темы
Конфигурация передала слишком крупное значение 120 пунктов. Считаем настройку и приведём её к диапазону небольшого компонента. Это ограничение дизайна, а не вычисление границ любой строки.
<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(360, 120, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(120);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$provided = $draw->getFontSize();
$effective = min(28.0, max(14.0, $provided));
$draw->setFontSize($effective);
$draw->annotation(20, 70, 'Размер ограничен');
echo 'effective-size=', $effective, "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/bounded-font-setting.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'bounded-font-setting.png', "\n";
$image->clear();
Результат: bounded-font-setting.png 360×120. Надпись «Размер ограничен» в 28 пунктов. В этом известном макете она помещается в поле; само ограничение 28 не доказывает, что любая длинная фамилия или другой шрифт поместится. Для произвольных строк требуются метрики и политика переноса/сокращения. Перед именем файла консоль: effective-size=28. Последняя строка — bounded-font-setting.png. Приложенный font.php подготавливает файл из этого же архива.
Ошибки, альтернативы и стоимость
После изменения плотности один и тот же float может дать другой пиксельный масштаб. Сохранение одного point size без font и density недостаточно для воспроизводимого макета. Ограничение значения сверху полезно для темы, но не гарантирует, что произвольная строка уместится.
Размер font и работа renderer добавляют стоимость загрузки/растеризации. Сохраняйте проверенную тему для компонентов, ограничивайте размеры холста и длину внешнего текста, не пытайтесь подобрать размер бесконечным циклом. Для точного вписывания сначала измерить строку через Imagick::queryFontMetrics, затем выберите перенос/сокращение. Не утверждайте, что произвольный шрифт или письменность отрисуются по одному успешному setter; проверяйте свою связку и нужные глифы.
В расширенных примерах require получает путь от helper, is_file/is_readable проверяют локальный файл, foreach обходит подписи, min/max ограничивают настройку, === различает типы. См. файлы, условия и циклы, аргументы и возврат функции.
Соседние API: ImagickDraw::annotation · ImagickDraw::setFont · ImagickDraw::getFont · ImagickDraw::setFontSize · ImagickDraw::setResolution. Практическое продолжение — независимые объекты команд и координаты.
ImagickDraw::setResolutionВеб-карточка и подготовка текста для другой плотности не должны неожиданно давать разный масштаб. Явно зададим плотность контекста до выбора шрифта и рисования.
PECL imagick 3 >= 3.1.0 · imagick
ImagickDraw::setResolution(float $resolution_x, float $resolution_y): boolВеб-карточка и подготовка текста для другой плотности не должны неожиданно давать разный масштаб. Явно зададим плотность контекста до выбора шрифта и рисования.
Это метод ImagickDraw: он задаёт горизонтальную/вертикальную плотность рисующего контекста. Здесь при симметричных значениях используем 72 или 144 пикселя на дюйм. Номинальный emPixels=points*dpi/72. Он не добавляет пиксели уже готовому bitmap, не меняет newImage(width,height) и не равен setImageResolution для метаданных изображения.

Синтаксис, параметры и результат
ImagickDraw::setResolution(float $resolution_x, float $resolution_y): bool| Параметр | Что передать и зачем |
|---|---|
| $resolution_x, $resolution_y | float, обязательные положительные конечные плотности по x/y. Примеры используют одинаковые 72,72 или 144,144. Разные значения могут дать неравномерный масштаб; для обычных подписей это лишняя зависимость. |
bool: true при успехе. В текущем wrapper отказ подготовки density/нового DrawingWand даёт ImagickDrawException. По официальному snapshot доступен с PECL imagick 3 >= 3.1.0; не распространяйте общую доступность остальных методов на более ранний Imagick.
Доступность официальной записи: PECL imagick 3 >= 3.1.0. Deprecated/removed/changelog в snapshot пусты. Программы рассчитаны на PHP 8.2+ с imagick; файл font и его лицензия прилагаются. Исторический номер исправления, которого нет в источниках, не приписывается.
Ошибки в кратких страницах подробно не перечислены. Файл шрифта может отсутствовать/не читаться, font может не содержать символ, каталог может запрещать сохранение PNG, renderer может отказать при drawImage. Успех setter и успешная растеризация — разные этапы. Пример проверяет отказ writeImage; при HTTP-выводе диагностику обрабатывают до отправки бинарного PNG.
Полный сохранённый контракт PHP Manual
Исходные поля сохранены полностью: описание, параметры, return, ошибки, версии, исходные примеры/hashes, see-also и changelog. Неоднозначности signature/prose поясняются отдельно по текущему wrapper.
{
"id": "imagickdraw.setresolution",
"name": "ImagickDraw::setResolution",
"purpose_en": "Sets the resolution",
"description_en": "Sets the resolution.",
"signature": "ImagickDraw::setResolution(float $resolution_x, float $resolution_y): bool",
"modifiers": [
"public"
],
"return_type": "bool",
"parameters": [
{
"name": "resolution_x",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": ""
},
{
"name": "resolution_y",
"type": "float",
"by_reference": false,
"optional": false,
"default": null,
"description_en": ""
}
],
"return_en": "Returns true on success.",
"errors_en": "",
"changelog_en": "",
"examples": [],
"see_also": [],
"availability": {
"from": "PECL imagick 3 >= 3.1.0",
"deprecated": null,
"removed": null
},
"official_url": "https://www.php.net/manual/en/imagickdraw.setresolution.php",
"official_page_sha256": "d47d60f5e1e8a086008656ba8570b5b0abc893d67b4af4924affe3add070b27b",
"xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/setresolution.xml",
"xml_sha256": "cdf131703cd0a2dcda7cbebe1ff3dd3a1de96efb7efc68d9226468e1773a24bc",
"official_undocumented_marker": false,
"owner": "imagick_reference_draw_style.py"
}<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(640, 120, 'white');
$image->setImageFormat('png');
foreach ([[20, 72], [340, 144]] as [$x, $dpi]) {
$draw = new ImagickDraw();
$draw->setResolution($dpi, $dpi);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation($x, 80, 'Заказ');
$image->drawImage($draw);
$draw->clear();
}
$path = __DIR__ . '/same-points-two-densities.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'same-points-two-densities.png', "\n";
$image->clear();
При успешном выполнении создаётся same-points-two-densities.png 640×120. Слева «Заказ» в 24 пункта при 72, справа — тоже 24 пункта при 144. На неизменном холсте правая надпись заметно крупнее. Плотность относится к рисующему контексту; размеры PNG остаются 640×120. Последняя строка — same-points-two-densities.png. Все четыре файла шрифта/подготовки включены в скачиваемый архив.
Практическая задача: Согласовать номинальный масштаб с иной плотностью
Сервис использует рисующий контекст 144, а компонент должен сохранить номинальный масштаб 24 пикселя на em. Пересчитаем point size до рисования: points=emPixels*72/dpi.
<?php
declare(strict_types=1);
$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 120, 'white');
$image->setImageFormat('png');
$dpi = 144;
$emPixels = 24;
$points = $emPixels * 72 / $dpi;
$draw = new ImagickDraw();
$draw->setResolution($dpi, $dpi);
$draw->setFont($font);
$draw->setFontSize($points);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->annotation(20, 70, 'Готово');
echo 'draw-dpi=', $dpi, '; point-size=', $points, '; nominal-em=', $emPixels, "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/density-aware-label.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'density-aware-label.png', "\n";
$image->clear();
Результат: density-aware-label.png 320×120. Надпись «Готово» использует 12 пунктов при 144, что соответствует номинальному em 24 пикселя. Это не обещание высоты видимой буквы ровно 24 и не побитная гарантия совпадения с другой библиотекой. Размер PNG 320×120 не изменился; метаданные печатной плотности файла отдельно не задавались. Перед именем файла консоль: draw-dpi=144; point-size=12; nominal-em=24. Последняя строка — density-aware-label.png. Приложенный font.php подготавливает файл из этого же архива.
Ошибки, альтернативы и стоимость
Текущий PHP wrapper создаёт заменяющий DrawingWand из DrawInfo, затем подставляет его вместо старого. Поэтому вызывайте setResolution сразу после new ImagickDraw, до annotation, геометрии и сохранённых контекстов. Поздний вызов нельзя считать безобидной меткой с гарантией сохранения очереди команд. Все примеры соблюдают этот порядок.
Размер font и работа renderer добавляют стоимость загрузки/растеризации. Сохраняйте проверенную тему для компонентов, ограничивайте размеры холста и длину внешнего текста, не пытайтесь подобрать размер бесконечным циклом. Для точного вписывания сначала измерить строку через Imagick::queryFontMetrics, затем выберите перенос/сокращение. Не утверждайте, что произвольный шрифт или письменность отрисуются по одному успешному setter; проверяйте свою связку и нужные глифы.
В расширенных примерах require получает путь от helper, is_file/is_readable проверяют локальный файл, foreach обходит подписи, min/max ограничивают настройку, === различает типы. См. файлы, условия и циклы, аргументы и возврат функции.
Соседние API: ImagickDraw::annotation · ImagickDraw::setFont · ImagickDraw::getFont · ImagickDraw::setFontSize · ImagickDraw::getFontSize. Практическое продолжение — независимые объекты команд и координаты.
Источники и обсуждения
- ImagickDraw::annotation
- ImagickDraw::getFont
- ImagickDraw::getFontSize
- ImagickDraw::setFont
- ImagickDraw::setFontSize
- ImagickDraw::setResolution
- PHP ImagickDraw wrappers
- Current ImagickDraw stub signatures
- DrawingWand text baseline and point size
- ImageMagick text: pointsize, density and fonts
- Unmodified Open Sans Regular font source
- Apache License 2.0
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


