Задание размера букв в PHP для работы с графикой

Раздел: Расширения PHP -> Работа с изображениями

Размер шрифта в PHP при работе с изображениями

Библиотека GD предоставляет несколько способов задания величины шрифта.

Как задать точный размер шрифта в пикселях с использованием TrueType?

Основной функцией является imagettftext(). Параметр size определяет высоту шрифта в пунктах. На практике размер примерно соответствует высоте в пикселях при разрешении 72 dpi.


$image = imagecreatetruecolor(200, 50);
$color = imagecolorallocate($image, 255, 0, 0);
$fontPath = '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf';
if (!file_exists($fontPath)) {
    die('Файл шрифта не найден');
}
imagettftext($image, 20, 0, 10, 35, $color, $fontPath, 'Привет, мир');
imagepng($image, 'output.png');
imagedestroy($image);

Show img php (показ изображений php)

Типичная ошибка:

неверный путь к шрифту приводит к возврату false и ошибке. Перед вызовом следует проверять существование файла. Также размер в пунктах не всегда точно соответствует пикселям, что может повлиять на позиционирование.

Какие способы существуют для встроенных шрифтов GD?

GD включает 5 встроенных шрифтов (номера 1-5). Размер этих шрифтов фиксирован и не масштабируется. Для выбора используется функция imagestring() или imageloadfont().


$image = imagecreatetruecolor(100, 50);
$color = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 10, 10, 'Текст', $color); // номер 5 - самый крупный

Php font size (размер шрифта в php)

Ограничение:

встроенные шрифты не поддерживают кириллицу в кодировке UTF-8, только Latin-1. Для русского текста необходимо использовать TrueType.

Как задать размер с помощью imagefttext()?

Функция imagefttext() является расширенной версией imagettftext() с дополнительными параметрами (межстрочный интервал, экстраинформация). Размер также задаётся в пунктах.


$settings = array('linespacing' => 1.5);
imagefttext($image, 14, 0, 20, 30, $color, $fontPath, 'Текст', $settings);

Php height (получение высоты в php)

Нюанс:

параметр linespacing умножает межстрочное расстояние, но не влияет на сам размер символов.

Как рассчитать размер текста перед выводом для точного позиционирования?

Функция imagettfbbox() возвращает массив из 8 чисел, описывающий ограничивающий прямоугольник. По нему вычисляется фактическая ширина и высота текста.


$bbox = imagettfbbox(20, 0, $fontPath, 'Пример');
$width = abs($bbox[2] - $bbox[0]);
$height = abs($bbox[7] - $bbox[1]);
echo "Ширина: $width, Высота: $height";

Важно:

координаты могут быть отрицательными, поэтому требуется abs(). Также bounding box учитывает только нарисованные пиксели, а не высоту строки.
Пример

// Пример 1: Вывод текста с разными размерами на одном изображении
$image = imagecreatetruecolor(400, 200);
$bg = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg);
$fontPath = '/path/to/font.ttf';
$colors = [
    imagecolorallocate($image, 255, 0, 0),
    imagecolorallocate($image, 0, 255, 0),
    imagecolorallocate($image, 0, 0, 255)
];
$sizes = [12, 18, 24];
$y = 30;
foreach ($sizes as $i => $size) {
    imagettftext($image, $size, 0, 20, $y, $colors[$i], $fontPath, "Размер $size");
    $y += 40;
}
imagepng($image, 'multi_size.png');
imagedestroy($image);
echo 'Изображение сохранено: multi_size.png';
// Результат: PNG-файл с тремя строками красного, зелёного и синего цвета.
// Размер шрифта: 12, 18, 24 пунктов соответственно.
Пример

// Пример 2: Автоматический подбор размера под заданную ширину
$text = 'Длинный текст для проверки';
$maxWidth = 200;
$fontSize = 20;
$bbox = imagettfbbox($fontSize, 0, $fontPath, $text);
$textWidth = abs($bbox[2] - $bbox[0]);
if ($textWidth > $maxWidth) {
    $fontSize = $fontSize * $maxWidth / $textWidth;
    $bbox = imagettfbbox($fontSize, 0, $fontPath, $text);
    $textWidth = abs($bbox[2] - $bbox[0]);
}
echo "Подобранный размер шрифта: $fontSize пунктов";
// Подобранный размер шрифта: 14.8 пунктов (значение зависит от шрифта и текста)
Пример

// Пример 3: Использование imagefttext с настройками межстрочного интервала
$settings = array(
    'linespacing' => 1.2,
    'extrainfo' => ' ',
);
$text = "Первая строка\nВторая строка";
$image = imagecreatetruecolor(300, 80);
$bg = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg);
$color = imagecolorallocate($image, 0, 0, 0);
imagefttext($image, 16, 0, 10, 30, $color, $fontPath, $text, $settings);
imagepng($image, 'fttext_example.png');
echo 'Сгенерировано fttext_example.png';
// Результат: изображение с двумя строками, расстояние между которыми увеличено на 1.2.
Пример

// Пример 4: Корректное отображение кириллицы через конвертацию кодировки
$text = 'Привет, мир!';
$textCP1251 = iconv('UTF-8', 'CP1251', $text);
$image = imagecreatetruecolor(200, 50);
$bg = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg);
$color = imagecolorallocate($image, 0, 0, 0);
$fontPath = 'C:/Windows/Fonts/arial.ttf'; // шрифт, поддерживающий CP1251
if (file_exists($fontPath)) {
    imagettftext($image, 18, 0, 10, 35, $color, $fontPath, $textCP1251);
    imagepng($image, 'cyrillic.png');
    echo 'Изображение сохранено: cyrillic.png';
} else {
    echo 'Шрифт не найден';
}
// Результат: корректно отображённые русские буквы на изображении. Без конвертации символы могут быть заменены на знаки вопроса.
Пример

// Пример 5: Поворот текста на произвольный угол
$image = imagecreatetruecolor(200, 200);
$bg = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg);
$color = imagecolorallocate($image, 0, 0, 255);
$angle = -45; // градусы, против часовой стрелки
$fontSize = 24;
$bbox = imagettfbbox($fontSize, $angle, $fontPath, 'Поворот');
$w = abs($bbox[2] - $bbox[0]);
$h = abs($bbox[7] - $bbox[1]);
$x = (200 - $w) / 2;
$y = (200 + $h) / 2;
imagettftext($image, $fontSize, $angle, $x, $y, $color, $fontPath, 'Поворот');
imagepng($image, 'rotated.png');
echo 'Изображение сохранено: rotated.png';
// Результат: текст, повёрнутый на 45 градусов и выровненный по центру изображения.

размер шрифта в PHP - comments

En
Php font size (php)