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

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

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

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

Глава 417 · После первых изображений и объектов Gmagick

Gmagick: шрифт, начертание и измерение строки

Выбрать вложенный шрифт, отличить настройки от настоящего начертания, измерить и уместить строку.

Разделить системный список и файл шрифта

Для ценника нужны буквы, которых нет в исходной картинке. Шрифт хранит рисунки символов; GmagickDraw задаёт, каким шрифтом и размером их рисовать, а Gmagick хранит изображение. Сначала узнаем настроенные имена, затем отдельно выберем воспроизводимый файл.

До: собственный холст 320×200
До: собственный холст 320×200
После: кириллица из вложенного DejaVuSans.ttf, даже при пустом queryFonts
После: кириллица из вложенного DejaVuSans.ttf, даже при пустом queryFonts
$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, поэтому видно изменение букв, а не случайное смещение.

Одинаковая строка при 18pt; базовая линия y=80
Одинаковая строка при 18pt; базовая линия y=80
Та же строка при 32pt; измеренная ширина больше
Та же строка при 32pt; измеренная ширина больше
$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 показывает настройку, но не является доказательством формы букв.

Обычный файл DejaVuSans.ttf, NORMAL и 400
Обычный файл DejaVuSans.ttf, NORMAL и 400
Тот же файл с запросом ITALIC/700: в этой среде рисунок не изменился
Тот же файл с запросом ITALIC/700: в этой среде рисунок не изменился
Настоящий DejaVuSans-BoldOblique.ttf: жирное наклонное начертание
Настоящий DejaVuSans-BoldOblique.ttf: жирное наклонное начертание
$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.

Рамка x=24…296 и базовая линия y=112; всё нарисовано PHP
Рамка x=24…296 и базовая линия 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 и уменьшим размер лишь при необходимости. Здесь решается задача одной строки; перенос слов и сокращение названия требуют отдельного правила.

Короткое название остаётся при 32pt
Короткое название остаётся при 32pt
Длинное название: размер уменьшается до попадания в 272px
Длинное название: размер уменьшается до попадания в 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): array
Gmagick::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.

ПараметрОфициальный типНазначение
$drawGmagickDraw; обязательныйОбъект GmagickDraw с точными настройками текста.
$textstring; обязательныйСтрока текста; в примерах корректный 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 = "*"): array
Gmagick::queryfonts(string $pattern = "*"): array

Необязательная строка pattern по умолчанию равна "*". Возвращается array имён, известных конфигурации GraphicsMagick, а не объект и не список всех TTF на диске. Разделы Parameters/Return Values на PHP.net содержат неточности; сигнатура, C и реальный вызов подтверждают pattern и array. Пустой массив является допустимым результатом. В нашем изолированном runtime даже * вернул []; явный вложенный TTF при этом успешно рисуется. Это не доказательство отсутствия шрифтов во всей системе.

ПараметрОфициальный типНазначение
$patternstring; необязательный; 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(): mixed
GmagickDraw::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(): float
GmagickDraw::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(): int
GmagickDraw::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(): int
GmagickDraw::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): GmagickDraw
GmagickDraw::setfont(string $font): GmagickDraw

Обязательная строка font выбирает шрифт; результат — GmagickDraw. Текущий C сначала проверяет настроенное имя, затем доступность файлового пути. Поэтому можно передать __DIR__ . "/DejaVuSans.ttf", даже когда queryFonts пуст. Пустая строка и отсутствующий путь в нашей версии дали Exception. Ошибка чтения файла и отсутствие нужного символа — разные причины проблем. Вложения содержат неизменённый файл, лицензию и происхождение; абсолютный путь с авторского компьютера для запуска не нужен.

ПараметрОфициальный типНазначение
$fontstring; обязательныйНастроенное имя или доступный путь к файлу.

Отдельного раздела ошибок у этой страницы 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): GmagickDraw
GmagickDraw::setfontsize(float $pointsize): GmagickDraw

Обязательный float pointsize — размер шрифта в пунктах. Возвращается GmagickDraw. Это настройка для последующих текстовых команд, не ширина строки и не точная высота её закрашенной области в пикселях. Примеры сравнивают 18/32 и подбирают размер в ограниченном диапазоне 32…12 по queryFontMetrics. Положительный диапазон и минимальную читаемость задаёт наше приложение; не приписываем библиотеке проверку неиспытанных значений.

ПараметрОфициальный типНазначение
$pointsizefloat; обязательныйРазмер шрифта в пунктах.

Отдельного раздела ошибок у этой страницы 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): GmagickDraw
GmagickDraw::setfontstyle(int $style): GmagickDraw

Обязательный int style принимает константу STYLE_NORMAL, STYLE_ITALIC, STYLE_OBLIQUE или STYLE_ANY. ANY действует как отсутствие предпочтения при выборе. Возвращается GmagickDraw. Для явного файла обычного DejaVu запрос ITALIC в проверенном runtime сохранился в настройке, но не изменил глифы. Файл BoldOblique дал настоящий другой рисунок. Поэтому задаём реальное начертание файлом и проверяем метрики, не обещаем обязательного синтетического курсива.

ПараметрОфициальный типНазначение
$styleint; обязательныйКонстанта 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): GmagickDraw
GmagickDraw::setfontweight(int $weight): GmagickDraw

Обязательный int weight находится в диапазоне 100–900, результат GmagickDraw. В этой реализации диапазон проверяется;99 действительно дал Exception. В примерах 400 обозначает обычный запрос,700 — жирный. Запрос веса не заменяет соответствующий файл начертания: с явным regular TTF пиксели не изменились, хотя getter вернул 700. Для предсказуемого жирного наклонного результата вложен реальный BoldOblique.

ПараметрОфициальный типНазначение
$weightint; обязательныйЦелый вес 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.

Два применения: Отличить запрос начертания от настоящего файла; Поставить измеренную строку по центру рамки.

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

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

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

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

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