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