Я заметил, что при использовании ‘imagettfbbox’ это, кажется, далеко не точно.
Например:
<?php
$text = 'hello there';
$box = imagettfbbox(12,0,'arial.ttf',$text);
$width = abs($box[0]-$box[2]);
$text = str_replace(' ',' ',$text);
echo '<svg width="500" height="200">
<g transform="scale(5)">
<text x="0" y="20" style="font-family:arial; font-size:12pt;">'.$text.'</text>
<rect x="0" y="10" width="'.$width.'" height="20" style="fill-opacity:0.5; fill:yellow;" />
</g>
</svg>';
exit;
?>
Как вы можете видеть здесь, коробка почти полностью отсекает «е».
Есть ли другое решение для получения точной ширины коробки?
Здесь может быть несколько вещей. Во-первых, вы не говорите браузеру использовать тот же набор шрифтов, что и у вашего PHP. Хотя это вряд ли проблема с таким распространенным шрифтом, как arial, вам стоит проверить его еще раз. Используйте эту CSS, чтобы указать браузеру использовать ваш шрифт.
@font-face {
font-family: "arial";
src: url("arial.ttf");
}
Другая проблема заключается в том, что вы не совсем выровняли желтое поле с текстом на левой стороне. PHP imagettfbbox точно измеряет ваш текст, поэтому любое смещение создаст проблему. Вот HTML, который я использовал для тестирования.
<div style="position:relative;">
<div style="font-family:arial; font-size:12pt; position: absolute; left: 0px;"><?php echo $text;?></div>
<div style="width:<?php echo $width;?>px;height:20px;position:absolute;left:1px;background-color:yellow;opacity:0.5;"/>
</div>
Это выровнялось идеально слева направо для меня. Я бы предположил, что это не проблема с imagettfbbox, и вам просто нужно поиграть с некоторыми вещами, чтобы подтвердить это с вашей стороны.
Других решений пока нет …