Найти в Дзене

Как на PHP вписать текст в изображение заданной ширины

Вот решение на PHP для вписывания текста в изображение заданной ширины (200px) с переносами по словам и учетом размера шрифта Arial 10pt: Пример генерации картинки с текстом // Настройки $imageWidth = 200; $fontSize = 10; $fontFile = '/правильный путь к шрифту/arial.ttf'; // Укажите правильный путь к шрифту $text = "Вот решение на PHP для вписывания текста в изображение заданной ширины (200px) с переносами по словам и учетом размера шрифта Arial 10pt. Ваш длинный текст, который нужно вписать в изображение, с правильными переносами по словам и запятым."; // Создаем временное изображение для расчетов $image = imagecreatetruecolor($imageWidth, 100); $backgroundColor = imagecolorallocate($image, 255, 255, 255); $textColor = imagecolorallocate($image, 0, 0, 0); // Функция для разбивки текста на строки function wrapText($text, $fontSize, $fontFile, $maxWidth) { $words = explode(' ', $text); $lines = []; $currentLine = ''; foreach ($words as $word) { // Проверяем ширину текущей строки с доба
Оглавление

Вот решение на PHP для вписывания текста в изображение заданной ширины (200px) с переносами по словам и учетом размера шрифта Arial 10pt:

Пример генерации картинки с текстом

// Настройки
$imageWidth = 200;
$fontSize = 10;
$fontFile = '/правильный путь к шрифту/arial.ttf'; // Укажите правильный путь к шрифту
$text = "Вот решение на PHP для вписывания текста в изображение заданной ширины (200px) с переносами по словам и учетом размера шрифта Arial 10pt. Ваш длинный текст, который нужно вписать в изображение, с правильными переносами по словам и запятым.";
// Создаем временное изображение для расчетов
$image = imagecreatetruecolor($imageWidth, 100);
$backgroundColor = imagecolorallocate($image, 255, 255, 255);
$textColor = imagecolorallocate($image, 0, 0, 0);
// Функция для разбивки текста на строки
function wrapText($text, $fontSize, $fontFile, $maxWidth) {
$words = explode(' ', $text);
$lines = [];
$currentLine = '';
foreach ($words as $word) {
// Проверяем ширину текущей строки с добавленным словом
$box = imagettfbbox($fontSize, 0, $fontFile, $currentLine . ' ' . $word);
$textWidth = $box[2] - $box[0];
if ($textWidth <= $maxWidth) {
$currentLine .= ($currentLine === '' ? '' : ' ') . $word;
} else {
$lines[] = $currentLine;
$currentLine = $word;
}
}
if ($currentLine !== '') {
$lines[] = $currentLine;
}
return $lines;
}
// Разбиваем текст на строки
$lines = wrapText($text, $fontSize, $fontFile, $imageWidth - 10); // 10px отступы по бокам
// Рассчитываем высоту изображения
$lineHeight = $fontSize * 1.5;
$imageHeight = count($lines) * $lineHeight + 20; // 20px отступы сверху и снизу
// Создаем финальное изображение
$finalImage = imagecreatetruecolor($imageWidth, $imageHeight);
imagefill($finalImage, 0, 0, $backgroundColor);
// Рисуем текст
$y = 20; // Начальная позиция Y
foreach ($lines as $line) {
imagettftext($finalImage, $fontSize, 0, 10, $y, $textColor, $fontFile, $line);
$y += $lineHeight;
}
// Сохраняем или выводим изображение
header('Content-Type: image/png');
imagepng($finalImage);
imagedestroy($finalImage);

Как это работает:

1. Разбивка текста на строки:

  • Текст разбивается на слова
  • Для каждого слова проверяется, поместится ли оно в текущую строку
  • Если не помещается - начинается новая строка

2. Расчет размеров:

  • Используется imagettfbbox() для точного расчета ширины текста
  • Высота изображения рассчитывается динамически по количеству строк

3. Переносы:

  • Переносы происходят только по пробелам
  • Запятые остаются привязанными к предыдущему слову
  • Сохраняется целостность слов

Дополнительные улучшения:

1. Для обработки запятых можно модифицировать функцию:

// В начале функции wrapText добавить:
$text = str_replace(',', ', ', $text); // Добавляем пробел после запятой
$text = preg_replace('/\s+/', ' ', $text); // Удаляем лишние пробелы

2. Для поддержки кириллицы:

// Убедитесь что шрифт поддерживает кириллицу
// И используйте mb_ функции для работы с текстом
$words = preg_split('/\s+/u', $text);

3. Для более точного расчета высоты:

$box = imagettfbbox($fontSize, 0, $fontFile, 'Ay'); // Буквы с выносными элементами
$lineHeight = $box[1] - $box[7] + 5; // Добавляем 5px межстрочный интервал

Это решение гарантирует, что текст будет корректно переноситься и полностью помещаться в указанную ширину изображения.