根据文本大小调整图像大小

Posted

技术标签:

【中文标题】根据文本大小调整图像大小【英文标题】:Resize image size according to size of text 【发布时间】:2009-12-20 19:04:45 【问题描述】:

下面的 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:我在这里找到了原始海报示例的答案 - Creating IMage from Text in PHP - how can I make multiline?

更新 2:Martin Geisler 的版本也很好用

【问题讨论】:

【参考方案1】:

使用 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);
?>

如果您改用位图字体,请查看imagefontwidthimagefontheight 函数。

【讨论】:

我想使用 ttf 字体,我查看了 imageftbbox 页面上的一些示例,但似乎无法获得文本的尺寸。 是的,很抱歉我一开始回答错了问题——我现在给出了 TrueType 字体的代码。 我尝试了代码,我得到错误“图像“test.php”无法显示,因为它包含错误。” 我猜你没有更改字体的名称?我只是将随机字体复制到我的网络服务器进行测试。将标头更改为 Content-type: text/plain 以查看 PHP 发回给您的错误。【参考方案2】:

@Martin Geisler 的回答几乎是正确的,但我无法让我的文字完全适合图像。我尝试了这个,效果很好!

来自PHP Manual's User Contributed Notes:

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

【讨论】:

抱歉,Windows 和 Linux 的工作方式似乎不同,而且似乎没有任何脚本可以在两者中完美运行。

以上是关于根据文本大小调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章

如何根据屏幕大小调整按钮的图像和文本大小(自动布局)

如何根据需要调整背景图像的大小

根据图像的宽度自动调整 div 的各个部分的大小?

根据 UITableViewCell 标签高度和宽度调整背景图片大小

如何根据文本长度或背景图像调整按钮宽度

根据 UILabel 动态调整 uitableViewCell 大小(带段落间距)