Изменить размер изображения в соответствии с размером текста - PullRequest
5 голосов
/ 20 декабря 2009

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

<?php
    header('Content-Type: image/jpeg');

    $text='Test';

    $img = imageCreate(200,200);

    imagecolorallocate($img, 255, 255, 255);

    $textColor = imagecolorallocate($img, 0, 0, 0); 

    imagefttext($img, 15, 0, 0, 55, $textColor, 'bgtbt.ttf', $text);

    imagejpeg($img);

    imagedestroy($img);
?>

ОБНОВЛЕНИЕ 1: я нашел ответ здесь на примере оригинального плаката - Создание IMage из текста в PHP - как мне сделать многострочное?

ОБНОВЛЕНИЕ 2: версия Мартина Гейслера также хорошо работает

Ответы [ 2 ]

6 голосов
/ 20 декабря 2009

При использовании шрифта 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.php и перейдите к img.php?q=Hello для проверки:

<?php
header("Content-type: image/png");

$q     = $_REQUEST['q'];
$font  = "Impact.ttf";
$size  = 30;
$bbox   = imageftbbox($size, 0, $font, $q);

$width  = $bbox[2] - $bbox[6];
$height = $bbox[3] - $bbox[7];

$im    = imagecreatetruecolor($width, $height);
$green = imagecolorallocate($im, 60, 240, 60);

imagefttext($im, $size, 0, -$bbox[6], -$bbox[7], $green, $font, $q);
imagepng($im);
imagedestroy($im);
?>

Если вместо этого вы используете растровые шрифты, посмотрите на функции imagefontwidth и imagefontheight.

2 голосов
/ 22 февраля 2010

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

Из замечаний пользователя Руководства по 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);
...