Измените размер изображения в соответствии с размером текста

В приведенном ниже 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: версия Мартина Гейслера также хорошо работает

Related of "Измените размер изображения в соответствии с размером текста"

При использовании шрифта 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 .

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

Из вложенных примечаний пользователя PHP Manual :

 $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);