我想创建一个具有给定文本精确尺寸的图像,并将该文本放在该图像上。我从imagettfbbox获得的位置值似乎并不准确,特别是对于斜体字体样式。这会导致某些角色在右侧被剪切。
这是我的代码:
<?php
Header("Content-type: image/png");
$font = 'fonts/ArialItalic.ttf';
$text = "SOB";
$size = 48;
$bounds = imagettfbbox($size, 0, $font, $text);
$width = abs($bounds[4]-$bounds[6]);
$height = abs($bounds[7]-$bounds[1]);
$offset_y = $height;
$offset_x = $bounds[0];
$image = imagecreate($width,$height);
$background = ImageColorAllocate($image, 0, 0, 0);
$foreground = ImageColorAllocate($image, 255, 255, 255);
ImageTTFText($image, $size, 0, $offset_x, $offset_y, -$foreground, $font, $text);
imagePNG($image);
imagedestroy($image);
?>
计算出的宽度和高度似乎是正确的;但是,X / Y位置($ offset_x和$ offset_y)不是。
如何动态设置$ offset_x和$ offset_y,以便文本完全适合不同字体,大小和样式的图像?
答案 0 :(得分:0)
回答我自己的问题。 这是一个长期的PHP错误。见https://bugs.php.net/bug.php?id=52756 并且仍然存在于PHP 7.0.1中
可以在此处找到该错误的测试脚本:http://stuff.mindplay.dk/temp/metrics/test.php
为了让我的东西工作,我使用了一个关于php.net评论的想法 http://php.net/manual/de/function.imagettfbbox.php#97357
这个想法是将文本绘制到一个更大的画布上,并在每个像素上进行迭代,以找到每一侧(顶部,右侧,底部,左侧)的确切位置。这很慢,特别是在较大的图像上,但它适用于我。
如果有人有另一个更快或更优雅的想法,我很有兴趣阅读它。
答案 1 :(得分:0)
这是github上的library,可帮助您准确填写文本
示例代码
$text_measure = new TextMeasure($text, $font_path, $size);
$measure = $text_measure->measureText();
使用如下的度量数组:
$gd_image = imagecreatetruecolor($measure['width'], $measure['height']);
imagettftext($gd_image, $size, 0, $measure['x'], $measure['y'], $red, $font_path, $text);