NibiruanChild
@NibiruanChild

Как сделать картинку из текста, вписанного в прямоуголник на PHP?

Суть задачи: создать изображение определенной ширины из текста. Просто писать на изображении или создать пустой канвас на imagick несложно и написать поверх, но есть 2 трудности, точнее подзадачи:

1. есть текст произвольной длины, есть прямоугольник, ширина и высота которого заданы и фиксированы, нужно динамически считать размер, учитывая особенности шрифтов (шрифты не все моноширинные, бывают с длинными хвостами и разной ширины каждая буква)

2. есть текст произвольной длины, теперь размер шрифта фиксирован, ширина изображения фиксирована, динамическая высота

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

Очень не хочется вручную разбирать шрифты, есть ли какие-то готовые функции, апи или либы по работе со шрифтами хотя бы, которые позволяют быстро получать инфу.
  • Вопрос задан
  • 4230 просмотров
Пригласить эксперта
Ответы на вопрос 3
Ответ написан
Комментировать
NibiruanChild
@NibiruanChild Автор вопроса
Кодер из меня тот-еще, но вроде 2 задача выполнена. Вдруг кому понадобится:

function wordWrapAnnotation($image, $draw, $text, $maxWidth)
{
    $words = preg_split('%\s%', $text, -1, PREG_SPLIT_NO_EMPTY);
    $lines = array();
    $i = 0;
    $lineHeight = 0;
    while (count($words) > 0)
    {
        $metrics = $image->queryFontMetrics($draw, implode(' ', array_slice($words, 0, ++$i)));
        $lineHeight = max($metrics['textHeight'], $lineHeight);

        if ($metrics['textWidth'] > $maxWidth or count($words) < $i)
        {
            $lines[] = implode(' ', array_slice($words, 0, --$i));
            $words = array_slice($words, $i);
            $i = 0;
        }
    }

    return array($lines, $lineHeight);
}

function createImageFromText($text){

    $maxWidth = 900;
    $font = 'BookmanOld.ttf';
    $fontSize = 34;
    $filename = 'res.png';
    $padding = 10;

    /* Create a new Imagick object */
    $image = new Imagick();
    $image->newImage(1, 1, 'white'); // none = transparent
    $image->setImageFormat("png");

    /* Create an ImagickDraw object */
    $draw = new ImagickDraw();

    /* Set the font */
    $draw->setFont($font);
    $draw->setFontSize($fontSize);

    list($lines, $lineHeight) = wordWrapAnnotation($image, $draw, $text, $maxWidth);
    $image->newImage($maxWidth+$padding, $padding+ count($lines)*$lineHeight, 'none'); // none = transparent    

    for($i = 0; $i < count($lines); $i++)
        $image->annotateImage($draw, $padding, + ($i+1)*$lineHeight, 0, $lines[$i]);

    //$image->writeImage($filename);
    return $image;
    
}

createImageFromText('бла бла бла текст абракадабрматьеезаногу')->writeImage('res.png');
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. Генерируешь картинку с текстом и прозраным фоном (получаешь ее размеры)
2. Накладываешь [1] на прямоугольник. С ресайзом и позиционированием в случае необходимости
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы