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

Дерево руководства
Глава 417 · После первых изображений и объектов Gmagick
Gmagick: шрифт, начертание и измерение строки
Выбрать вложенный шрифт, отличить настройки от настоящего начертания, измерить и уместить строку.
Разделить системный список и файл шрифта
Для ценника нужны буквы, которых нет в исходной картинке. Шрифт хранит рисунки символов; GmagickDraw задаёт, каким шрифтом и размером их рисовать, а Gmagick хранит изображение. Сначала узнаем настроенные имена, затем отдельно выберем воспроизводимый файл.


$image = new Gmagick(); $image->newImage(320,200,"#f4eddd","png");
$fonts = $image->queryFonts("*");
$draw = new GmagickDraw();
$draw->setFont(__DIR__ . "/DejaVuSans.ttf");
$draw->setFontSize(26);
$draw->setTextEncoding("UTF-8");
$image->annotateImage($draw,20,80,0,"Шрифт из файла");
$image->writeImage(__DIR__ . "/first-text.png");queryFonts возвращает массив настроенных имён; * выбирает все совпадения. Это не список всех TTF на диске. В проверенном runtime список пуст, но setFont по пути к вложенному DejaVuSans.ttf успешно рисует кириллицу. __DIR__ означает папку программы. getFont до настройки вернул false, после — строку пути. Полный пример явно задаёт UTF-8 и цвет. Помощник восстанавливает шрифт из base64 после проверки SHA256; установка в систему не нужна.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$image=gmCanvas();gmPng(clone $image,'gm98-text-font-list-before.png');
$available=$image->queryFonts('*');
$draw=new GmagickDraw();$unset=$draw->getFont();
$draw->setFont(__DIR__.'/DejaVuSans.ttf');
$selected=$draw->getFont();
$draw->setFontSize(26);$draw->setTextEncoding('UTF-8');$draw->setFillColor(new GmagickPixel('#244f65'));
$image->annotateImage($draw,20,80,0,'Шрифт из файла');
gmPng($image,'gm98-text-font-list-result.png');
file_put_contents(__DIR__.'/gm98-text-font-list.json',json_encode(['configured_fonts'=>$available,'selected_file'=>basename($selected),'initial_font'=>$unset],JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR));
gmReport('gm98-text-font-list',["gmagick.queryfonts", "gmagickdraw.setfont", "gmagickdraw.getfont", "gmagick.annotateimage"],["gm98-text-font-list-before.png", "gm98-text-font-list-result.png"],['list_array'=>is_array($available),'unset_false'=>$unset===false,'selected_file'=>basename($selected)==="DejaVuSans.ttf"],$errors??[],[]);
echo "fonts: configured-list=reported bundled-font=DejaVuSans.ttf png=2\n";
Ожидаемый результат
fonts: configured-list=reported bundled-font=DejaVuSans.ttf png=2
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Результат: список в JSON и два PNG320×200. Неизменённые DejaVu 2.37 взяты из Ubuntu-пакета 2.37-8; лицензия, источник и контрольные суммы включены в скачивание. Упражнение: пустой queryFonts запрещает текст? Решение: нет, доступный TTF с нужными символами можно выбрать по пути.
Основа: изображение и холст, объекты и переменные. В этой главе объект Draw хранит настройки и команды, Gmagick — изображение. Цвет текста задаётся через GmagickPixel; подробно о цвете — в главе о пикселях.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Обработать отсутствие имени и выбрать вложенный шрифт
На другом сервере может отсутствовать привычное имя шрифта. Проверим поиск и выберем вложенный файл как явный запасной вариант. Пустой результат поиска и недоступный файл — разные ситуации.

$fonts = $image->queryFonts("NoSuchFont_98*");
$draw = new GmagickDraw();
if ($fonts === []) {
$draw->setFont(__DIR__ . "/DejaVuSans.ttf");
} else {
$draw->setFont($fonts[0]);
}
$selected = $draw->getFont();[] — пустой массив, === проверяет строгое равенство. if выбирает запасной путь, когда совпадений нет. Для учебного NoSuchFont_98* список пуст; «Чай с мятой» появляется за счёт собственного файла. Query не заменяется сканированием каталога: программа сохраняет фактический результат API.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$image=gmCanvas();
$found=$image->queryFonts('NoSuchFont_98*');
$draw=new GmagickDraw();
if($found===[])$draw->setFont(__DIR__.'/DejaVuSans.ttf');else $draw->setFont($found[0]);
$font=$draw->getFont();$draw->setFontSize(24);$draw->setTextEncoding('UTF-8');$draw->setFillColor(new GmagickPixel('#244f65'));
$image->annotateImage($draw,20,80,0,'Чай с мятой');
gmPng($image,'gm98-text-font-fallback.png');
$errors=['empty_font'=>gmTry(fn()=>(new GmagickDraw())->setFont('')),'missing_font'=>gmTry(fn()=>(new GmagickDraw())->setFont(__DIR__.'/missing.ttf'))];
gmReport('gm98-text-font-fallback',["gmagick.queryfonts", "gmagickdraw.setfont", "gmagickdraw.getfont", "gmagick.annotateimage"],["gm98-text-font-fallback.png"],['no_match'=>$found===[],'fallback_path'=>basename($font)==="DejaVuSans.ttf"],$errors??[],[]);
echo "fallback: missing-pattern=empty bundled-font=used errors=2 png=1\n";
Ожидаемый результат
fallback: missing-pattern=empty bundled-font=used errors=2 png=1
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Полный пример также пробует пустую строку и отсутствующий путь. Оба отказа в Gmagick 2.0.6RC1 имеют фактический класс Exception; текст сохраняется в metrics.json. Упражнение: достаточно расширения .ttf? Решение: файл должен читаться и содержать нужные глифы. В архиве дополнительно проверяется его SHA256.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Сравнить размер шрифта и ширину одной строки
Одинаковая строка может перестать помещаться после увеличения размера. Сравним «Чай 129 ₽» при 18 и 32 пунктах на одинаковых холстах. Базовая линия остаётся y=80, поэтому видно изменение букв, а не случайное смещение.


$draw = gmPen();
$draw->setFontSize(18);
$smallSize = $draw->getFontSize();
$small = $image->queryFontMetrics($draw,"Чай 129 ₽");
$draw->setFontSize(32);
$largeSize = $draw->getFontSize();
$large = $image->queryFontMetrics($draw,"Чай 129 ₽");gmPen — помощник полной программы: создаёт Draw, выбирает вложенный файл, UTF-8 и цвет. setFontSize принимает пункты, getFontSize возвращает настройку как float. Это не высота видимого пятна в пикселях. queryFontMetrics получает настройки и точную строку. Ширина зависит от букв, шрифта, размера и параметров среды.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$small=gmCanvas();$large=gmCanvas();
$draw=gmPen();$draw->setFontSize(18);$size18=$draw->getFontSize();
$m18=$small->queryFontMetrics($draw,'Чай 129 ₽');$small->annotateImage($draw,20,80,0,'Чай 129 ₽');
$draw->setFontSize(32);$size32=$draw->getFontSize();
$m32=$large->queryFontMetrics($draw,'Чай 129 ₽');$large->annotateImage($draw,20,80,0,'Чай 129 ₽');
gmPng($small,'gm98-text-font-size18.png');gmPng($large,'gm98-text-font-size32.png');
gmReport('gm98-text-font-size',["gmagickdraw.setfontsize", "gmagickdraw.getfontsize", "gmagick.queryfontmetrics", "gmagick.annotateimage"],["gm98-text-font-size18.png", "gm98-text-font-size32.png"],['size_getters'=>$size18===18.0&&$size32===32.0,'width_grows'=>$m32["textWidth"]>$m18["textWidth"]],$errors??[],['size18'=>$size18,'size32'=>$size32,'metrics18'=>$m18,'metrics32'=>$m32]);
echo "size: 18pt-and-32pt same-text wider-at32 png=2\n";
Ожидаемый результат
size: 18pt-and-32pt same-text wider-at32 png=2
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Оба PNG имеют 320×200, но textWidth при 32 больше. Измерения находятся в metrics.json. Упражнение: можно умножить число букв на fontsize? Решение: нет, в пропорциональном шрифте буквы различаются по ширине; измеряйте точную строку с тем же файлом и настройками.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Отличить запрос начертания от настоящего файла
Нужно выделить цену жирным наклонным начертанием. Сравним просьбу «italic,700» с выбором настоящего файла этого начертания. Getter показывает настройку, но не является доказательством формы букв.



$draw = gmPen();
$draw->setFontStyle(Gmagick::STYLE_ITALIC);
$draw->setFontWeight(700);
$style = $draw->getFontStyle();
$weight = $draw->getFontWeight();
$image->annotateImage($draw,20,80,0,"Чай 129 ₽");STYLE_NORMAL, STYLE_ITALIC и STYLE_OBLIQUE обозначают начертания; STYLE_ANY — отсутствие предпочтения. Вес задаётся целым числом 100–900. Здесь явный DejaVuSans.ttf продолжает выбирать обычный файл после ITALIC/700: getters меняются, пиксели — нет. Третий PNG использует настоящий DejaVuSans-BoldOblique.ttf, и рисунок букв меняется.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$regular=gmCanvas();$requested=gmCanvas();$actual=gmCanvas();
$a=gmPen();$a->setFontStyle(Gmagick::STYLE_NORMAL);$a->setFontWeight(400);
$regular->annotateImage($a,20,80,0,'Чай 129 ₽');
$b=gmPen();$b->setFontStyle(Gmagick::STYLE_ITALIC);$b->setFontWeight(700);
$requested->annotateImage($b,20,80,0,'Чай 129 ₽');
$c=gmPen(26,'#244f65','DejaVuSans-BoldOblique.ttf');$c->setFontStyle(Gmagick::STYLE_OBLIQUE);$c->setFontWeight(700);
$actual->annotateImage($c,20,80,0,'Чай 129 ₽');
$settings=['requested_style'=>$b->getFontStyle(),'requested_weight'=>$b->getFontWeight(),'actual_style'=>$c->getFontStyle(),'actual_weight'=>$c->getFontWeight()];
gmPng($regular,'gm98-text-font-face-regular.png');gmPng($requested,'gm98-text-font-face-request.png');gmPng($actual,'gm98-text-font-face-file.png');
$errors=['weight99'=>gmTry(fn()=>(new GmagickDraw())->setFontWeight(99))];
gmReport('gm98-text-font-face',["gmagickdraw.setfontstyle", "gmagickdraw.getfontstyle", "gmagickdraw.setfontweight", "gmagickdraw.getfontweight", "gmagick.annotateimage"],["gm98-text-font-face-regular.png", "gm98-text-font-face-request.png", "gm98-text-font-face-file.png"],['stored_settings'=>$settings["requested_style"]===Gmagick::STYLE_ITALIC&&$settings["requested_weight"]===700,'file_wins_here'=>$regular->getImageSignature()===$requested->getImageSignature(),'face_changes'=>$actual->getImageSignature()!==$regular->getImageSignature()],$errors??[],$settings);
echo "face: requested-style=stored regular-file=same bold-oblique-file=different png=3\n";
Ожидаемый результат
face: requested-style=stored regular-file=same bold-oblique-file=different png=3
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Полный пример включает только два использованных файла. Вес 99 отвергнут с Exception. Упражнение: getFontWeight вернул 700 — доказана жирная надпись? Решение: доказана настройка; фактический результат зависит от файла и подбора шрифта. Не обещайте обязательную синтетическую жирность.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Поставить измеренную строку по центру рамки
Поставим цену по центру заданной рамки. Измерим строку и разделим свободное место пополам. Рамка x=24…296 имеет ширину 272; тонкая линия y=112 показывает базовую линию букв. Все линии нарисованы тем же PHP.


$draw = gmPen(26,"#244f65","DejaVuSans-BoldOblique.ttf");
$draw->setFontStyle(Gmagick::STYLE_OBLIQUE);
$draw->setFontWeight(700);
$metrics = $image->queryFontMetrics($draw,"Чай 129 ₽");
$x = 24 + (272 - $metrics["textWidth"]) / 2;
$image->annotateImage($draw,$x,112,0,"Чай 129 ₽");Массив этой версии содержит 7 полей: characterWidth, characterHeight, ascender, descender, textWidth, textHeight, maximumHorizontalAdvance. Ascender — подъём над базовой линией; descender здесь отрицателен и описывает нижнюю часть. textWidth помогает разместить строку, но не обещает точную границу каждого закрашенного пикселя, особенно у наклонных букв. Оставляем поля.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$image=gmCanvas();$draw=gmPen(26,'#244f65','DejaVuSans-BoldOblique.ttf');
$draw->setFontStyle(Gmagick::STYLE_OBLIQUE);$draw->setFontWeight(700);
$style=$draw->getFontStyle();$weight=$draw->getFontWeight();
$metrics=$image->queryFontMetrics($draw,'Чай 129 ₽');
$x=24+(272-$metrics['textWidth'])/2;$baseline=112;
$guide=new GmagickDraw();$guide->setFillColor(new GmagickPixel('none'));$guide->setStrokeColor(new GmagickPixel('#c8bda4'));$guide->rectangle(24,56,296,144);$guide->line(24,$baseline,296,$baseline);$image->drawImage($guide);
gmPng(clone $image,'gm98-text-font-metrics-before.png');
$image->annotateImage($draw,$x,$baseline,0,'Чай 129 ₽');gmPng($image,'gm98-text-font-metrics-after.png');
$errors=['metrics_type'=>gmTry(fn()=>$image->queryFontMetrics('wrong','Чай'))];
gmReport('gm98-text-font-metrics',["gmagick.queryfontmetrics", "gmagickdraw.setfontstyle", "gmagickdraw.getfontstyle", "gmagickdraw.setfontweight", "gmagickdraw.getfontweight", "gmagick.annotateimage"],["gm98-text-font-metrics-before.png", "gm98-text-font-metrics-after.png"],['array_contract'=>is_array($metrics)&&count($metrics)===7,'fits'=>$metrics["textWidth"]<=272&&$x>=24,'stored_face_request'=>$style===Gmagick::STYLE_OBLIQUE&&$weight===700,'descender_negative'=>$metrics["descender"]<0],$errors??[],['metrics'=>$metrics,'x'=>$x,'baseline'=>$baseline,'style'=>$style,'weight'=>$weight]);
echo "metrics: array7 centered-in272 baseline112 png=2\n";
Ожидаемый результат
metrics: array7 centered-in272 baseline112 png=2
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
PHP.net ошибочно пишет «нет параметров» и «возвращает Gmagick»; сигнатура, C и запуск подтверждают два аргумента и array. Для нашего 26pt жирного наклонного файла textWidth=147, x=86.5. Неверный тип Draw даёт TypeError. Упражнение: строка шириной 100 в этой рамке? Решение: x=24+(272−100)/2=110.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Уместить название по измеренной ширине
Названия разной длины должны оставаться внутри карточки. Ограничим ширину 272px и уменьшим размер лишь при необходимости. Здесь решается задача одной строки; перенос слов и сокращение названия требуют отдельного правила.


$draw = gmPen();
$draw->setFontSize(32);
$metrics = $image->queryFontMetrics($draw,$text);
if ($metrics["textWidth"] > 272) {
$draw->setFontSize(24);
}
$size = $draw->getFontSize();Короткий фрагмент показывает одно решение по условию. Полная fitCaption пробует размеры 32…12, измеряет каждый и возвращает первый подходящий. for выполняет ограниченный поиск, return заканчивает его. Если даже 12pt не подходит, бросается LengthException. Текст не уменьшается бесконечно до нечитаемого.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
function fitCaption(Gmagick $image,GmagickDraw $draw,string $text,float $width):array {
if($width<=0)throw new InvalidArgumentException('Positive width required');
for($size=32;$size>=12;$size--){$draw->setFontSize($size);$m=$image->queryFontMetrics($draw,$text);if($m['textWidth']<=$width)return ['size'=>$draw->getFontSize(),'metrics'=>$m];}
throw new LengthException('Caption does not fit even at12pt');
}
$short=gmCanvas();$long=gmCanvas();$a=gmPen();$b=gmPen();
$s=fitCaption($short,$a,'Чай',272);$l=fitCaption($long,$b,'Травяной чай с мятой',272);
$short->annotateImage($a,24,100,0,'Чай');$long->annotateImage($b,24,100,0,'Травяной чай с мятой');
gmPng($short,'gm98-text-font-fit-short.png');gmPng($long,'gm98-text-font-fit-long.png');
$errors=['bad_width'=>gmTry(fn()=>fitCaption(gmCanvas(),gmPen(),'Чай',0))];
gmReport('gm98-text-font-fit',["gmagickdraw.setfontsize", "gmagickdraw.getfontsize", "gmagick.queryfontmetrics", "gmagick.annotateimage"],["gm98-text-font-fit-short.png", "gm98-text-font-fit-long.png"],['both_fit'=>$s["metrics"]["textWidth"]<=272&&$l["metrics"]["textWidth"]<=272,'short_max'=>$s["size"]===32.0,'long_smaller'=>$l["size"]<$s["size"]],$errors??[],['short'=>$s,'long'=>$l]);
echo "fit: both-within272 long-caption=smaller png=2\n";
Ожидаемый результат
fit: both-within272 long-caption=smaller png=2
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
«Чай» остаётся 32pt; длинное название получает меньший размер, оба входят в 272px. Неположительную ширину отвергает собственный InvalidArgumentException. Упражнение: можно заменить строку после измерения? Решение: после изменения нужно измерить снова: результат относится к точным байтам, файлу и настройкам.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Из реального вопроса разработчика
Imagick center text over image in specified area. Автор хочет центрировать надпись внутри заданной области изображения, но получает центрирование относительно другой области. Задачу решаем собственным Gmagick-примером: измеряем точную строку с тем же файлом шрифта, считаем x от левой границы рамки и отдельно задаём базовую линию. Чужой Imagick-код не переносим как контракт Gmagick.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::queryfontmetricsИзмерить текст до рисования
PECL gmagick >= Unknown · gmagick
Gmagick::queryfontmetrics(GmagickDraw $draw, string $text): arrayGmagick::queryfontmetrics(GmagickDraw $draw, string $text): arrayОбязательны GmagickDraw draw и строка text. Возвращается array, несмотря на ошибочную фразу о Gmagick и «нет параметров» на PHP.net. Текущая реализация возвращает characterWidth, characterHeight, ascender, descender, textWidth, textHeight, maximumHorizontalAdvance; значения числовые. Измеряйте точный текст с теми же шрифтом и настройками, что при рисовании. Y у текста задаёт базовую линию, descender в нашем измерении отрицателен. textWidth не является универсальной точной рамкой закрашенных пикселей. Ошибка операции описана как GmagickException; неверный тип draw фактически дал TypeError.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $draw | GmagickDraw; обязательный | Объект GmagickDraw с точными настройками текста. |
| $text | string; обязательный | Строка текста; в примерах корректный UTF-8. |
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Сравнить размер шрифта и ширину одной строки; Поставить измеренную строку по центру рамки.
Gmagick::queryfontsУзнать настроенные имена шрифтов
PECL gmagick >= Unknown · gmagick
Gmagick::queryfonts(string $pattern = "*"): arrayGmagick::queryfonts(string $pattern = "*"): arrayНеобязательная строка pattern по умолчанию равна "*". Возвращается array имён, известных конфигурации GraphicsMagick, а не объект и не список всех TTF на диске. Разделы Parameters/Return Values на PHP.net содержат неточности; сигнатура, C и реальный вызов подтверждают pattern и array. Пустой массив является допустимым результатом. В нашем изолированном runtime даже * вернул []; явный вложенный TTF при этом успешно рисуется. Это не доказательство отсутствия шрифтов во всей системе.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $pattern | string; необязательный; default "*" | Шаблон настроенного имени; * выбирает все совпадения. |
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Разделить системный список и файл шрифта; Обработать отсутствие имени и выбрать вложенный шрифт.
GmagickDraw::getfontПрочитать выбранный шрифт
PECL gmagick >= Unknown · gmagick
GmagickDraw::getfont(): mixedGmagickDraw::getfont(): mixedАргументов нет. Официальная сигнатура mixed означает здесь строку выбранного шрифта либо false, если он не задан. Оба состояния подтверждены запуском: сначала false, после setFont — строковый путь. Значение описывает выбор, но само по себе не доказывает наличие каждого глифа или корректность отрисовки. Для сравнения пути в переносимом отчёте используем basename; контроль содержимого выполняется по SHA256 вложенного файла.
Параметров нет: вызов записывается с пустыми скобками.
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Разделить системный список и файл шрифта; Обработать отсутствие имени и выбрать вложенный шрифт.
GmagickDraw::getfontsizeПрочитать текущий размер шрифта
PECL gmagick >= Unknown · gmagick
GmagickDraw::getfontsize(): floatGmagickDraw::getfontsize(): floatАргументов нет; float возвращает размер, связанный с GmagickDraw. После setters18 и 32 получены 18.0 и 32.0; функция подбора читает реально выбранное значение. Getter не измеряет длину текста и не заменяет queryFontMetrics. Если после измерения изменить размер, прежние метрики уже не описывают новый вывод.
Параметров нет: вызов записывается с пустыми скобками.
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Сравнить размер шрифта и ширину одной строки; Уместить название по измеренной ширине.
GmagickDraw::getfontstyleПрочитать настройку начертания
PECL gmagick >= Unknown · gmagick
GmagickDraw::getfontstyle(): intGmagickDraw::getfontstyle(): intАргументов нет; int — константа STYLE_ либо 0, если стиль не задан, как описывает PHP.net. STYLE_NORMAL в этой среде также равен 0: число само по себе не различает отсутствие настройки и обычное начертание. Getter подтверждает сохранённый запрос, а не видимый наклон букв. Примеры читают ITALIC и OBLIQUE при разных файлах и показывают настоящие результаты.
Параметров нет: вызов записывается с пустыми скобками.
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Отличить запрос начертания от настоящего файла; Поставить измеренную строку по центру рамки.
GmagickDraw::getfontweightПрочитать запрошенный вес
PECL gmagick >= Unknown · gmagick
GmagickDraw::getfontweight(): intGmagickDraw::getfontweight(): intАргументов нет, результат int; PHP.net указывает 0, если вес не задан. В рабочих сценариях getter подтверждает установленные 400/700 и записывается в измерения. Это свойство Draw, не анализ толщины штрихов уже готового PNG. После выбора другого файла шрифта текст нужно измерить и отрисовать заново.
Параметров нет: вызов записывается с пустыми скобками.
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Отличить запрос начертания от настоящего файла; Поставить измеренную строку по центру рамки.
GmagickDraw::setfontВыбрать настроенное имя или доступный TTF
PECL gmagick >= Unknown · gmagick
GmagickDraw::setfont(string $font): GmagickDrawGmagickDraw::setfont(string $font): GmagickDrawОбязательная строка font выбирает шрифт; результат — GmagickDraw. Текущий C сначала проверяет настроенное имя, затем доступность файлового пути. Поэтому можно передать __DIR__ . "/DejaVuSans.ttf", даже когда queryFonts пуст. Пустая строка и отсутствующий путь в нашей версии дали Exception. Ошибка чтения файла и отсутствие нужного символа — разные причины проблем. Вложения содержат неизменённый файл, лицензию и происхождение; абсолютный путь с авторского компьютера для запуска не нужен.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $font | string; обязательный | Настроенное имя или доступный путь к файлу. |
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Разделить системный список и файл шрифта; Обработать отсутствие имени и выбрать вложенный шрифт.
GmagickDraw::setfontsizeЗадать размер текста в пунктах
PECL gmagick >= Unknown · gmagick
GmagickDraw::setfontsize(float $pointsize): GmagickDrawGmagickDraw::setfontsize(float $pointsize): GmagickDrawОбязательный float pointsize — размер шрифта в пунктах. Возвращается GmagickDraw. Это настройка для последующих текстовых команд, не ширина строки и не точная высота её закрашенной области в пикселях. Примеры сравнивают 18/32 и подбирают размер в ограниченном диапазоне 32…12 по queryFontMetrics. Положительный диапазон и минимальную читаемость задаёт наше приложение; не приписываем библиотеке проверку неиспытанных значений.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $pointsize | float; обязательный | Размер шрифта в пунктах. |
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Сравнить размер шрифта и ширину одной строки; Уместить название по измеренной ширине.
GmagickDraw::setfontstyleЗадать предпочтение начертания
PECL gmagick >= Unknown · gmagick
GmagickDraw::setfontstyle(int $style): GmagickDrawGmagickDraw::setfontstyle(int $style): GmagickDrawОбязательный int style принимает константу STYLE_NORMAL, STYLE_ITALIC, STYLE_OBLIQUE или STYLE_ANY. ANY действует как отсутствие предпочтения при выборе. Возвращается GmagickDraw. Для явного файла обычного DejaVu запрос ITALIC в проверенном runtime сохранился в настройке, но не изменил глифы. Файл BoldOblique дал настоящий другой рисунок. Поэтому задаём реальное начертание файлом и проверяем метрики, не обещаем обязательного синтетического курсива.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $style | int; обязательный | Константа Gmagick::STYLE_*. |
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Отличить запрос начертания от настоящего файла; Поставить измеренную строку по центру рамки.
GmagickDraw::setfontweightЗадать вес шрифта
PECL gmagick >= Unknown · gmagick
GmagickDraw::setfontweight(int $weight): GmagickDrawGmagickDraw::setfontweight(int $weight): GmagickDrawОбязательный int weight находится в диапазоне 100–900, результат GmagickDraw. В этой реализации диапазон проверяется;99 действительно дал Exception. В примерах 400 обозначает обычный запрос,700 — жирный. Запрос веса не заменяет соответствующий файл начертания: с явным regular TTF пиксели не изменились, хотя getter вернул 700. Для предсказуемого жирного наклонного результата вложен реальный BoldOblique.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $weight | int; обязательный | Целый вес 100–900. |
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Отличить запрос начертания от настоящего файла; Поставить измеренную строку по центру рамки.
Источники и обсуждения
- PHP.net Gmagick::queryfontmetrics
- PHP.net Gmagick::queryfonts
- PHP.net GmagickDraw::getfont
- PHP.net GmagickDraw::getfontsize
- PHP.net GmagickDraw::getfontstyle
- PHP.net GmagickDraw::getfontweight
- PHP.net GmagickDraw::setfont
- PHP.net GmagickDraw::setfontsize
- PHP.net GmagickDraw::setfontstyle
- PHP.net GmagickDraw::setfontweight
- Gmagick C implementation
- GmagickDraw C implementation
- DejaVu license
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


