Измените размер размера изображения согласно размеру текста

Код PHP ниже генерирует текст как динамично созданное изображение, как я смог бы заставить изображение только быть столь же большим как текст?Спасибо.


ОБНОВЛЕНИЕ 1: Я нашел ответ здесь с примером исходного плаката - Создающий Изображение из текста в PHP - как я могу сделать мультилинию?

ОБНОВЛЕНИЕ 2: версия Martin Geisler также работает хорошо

5
задан Community 23 May 2017 в 12:07
поделиться

2 ответа

При использовании шрифта TrueType вы используете функцию imageftbbox , чтобы получить ограничивающую рамку для строкового набора с вашим шрифтом. Ограничивающая рамка дает смещения от базовой точки до четырех углов прямоугольника, занятого текстом. Поэтому, если вы сохраняете ограничивающую рамку в $ bb и используете imagefttext , чтобы поместить текст в ($ x, $ y) , то углы будут иметь эти координаты :

($x + $bb[6], $y + $bb[7])         ($x + $bb[4], $y + $bb[5])
                          +-------+
                          | Hello |
                          +-------+
($x + $bb[0], $y + $bb[1])         ($x + $bb[2], $y + $bb[3])

Это говорит нам, что нам нужна ширина изображения ($ x + $ bb [2]) - ($ x + $ bb [6]) = $ bb [2] - $ bb [6] и аналогично высота изображения $ bb [3] - $ bb [7] . Затем текст должен быть визуализирован с координатами (- $ bb [6], - $ bb [7]) внутри этого изображения, так как мы хотим иметь

(0, 0) = ($x + $bb[6], $y + $bb[7]) ==> $x = -$bb[6]  and $y = -$bb[7]

. Вы можете попробовать это с помощью этого кода. Поместите его в файл с именем img.

7
ответ дан 14 December 2019 в 01:09
поделиться

Ответ @Martin Geisler почти правильный, но мне не удалось полностью уместить текст внутри изображения. Я попробовал это вместо этого, и он отлично работает!

Из замечаний пользователей Руководства по PHP :

$text = "<?php echo \"hello, world\"; ?>";
$font = "./arial.ttf";
$size = "60";

$bbox = imagettfbbox($size, 0, $font, $text);

$width = abs($bbox[2] - $bbox[0]);
$height = abs($bbox[7] - $bbox[1]);

$image = imagecreatetruecolor($width, $height);

$bgcolor = imagecolorallocate($image, 255, 255, 255);
$color = imagecolorallocate($image, 0, 0, 0);

$x = $bbox[0] + ($width / 2) - ($bbox[4] / 2);
$y = $bbox[1] + ($height / 2) - ($bbox[5] / 2);

imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor);
imagettftext($image, $size, 0, $x, $y, $color, $font, $text);

$last_pixel= imagecolorat($image, 0, 0);

for ($j = 0; $j < $height; $j++)
{
    for ($i = 0; $i < $width; $i++)
    {
        if (isset($blank_left) && $i >= $blank_left)
        {
            break;
        }

        if (imagecolorat($image, $i, $j) !== $last_pixel)
        {
            if (!isset($blank_top))
            {
                $blank_top = $j;
            }
            $blank_left = $i;
            break;
        }

        $last_pixel = imagecolorat($image, $i, $j);
    }
}

$x -= $blank_left;
$y -= $blank_top;

imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor);
imagettftext($image, $size, 0, $x, $y, $color, $font, $text);

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
2
ответ дан 14 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: