php - imagettfbbox calcula un rectángulo incorrecto cuando el texto comienza con un número
gd imagettftext (1)
El problema fue causado por un concepto erróneo. Los valores de imagettfbbox
también definen dónde debe comenzar a dibujar , y con frecuencia esas coordenadas son incluso negativas. Siempre supuse que puedes empezar en [0, 0]
coordenadas. Eso no es cierto, las coordenadas del dibujo pueden ser negativas .
Esta función, también mencionada en los comentarios y originada en las contribuciones de los usuarios de PHP.net, calcula las coordenadas de inicio, así como el ancho y el alto (que era correcto en el código en cuestión).
// Source: http://php.net/manual/en/function.imagettfbbox.php#75407
function imagettfbboxextended($size, $angle, $fontfile, $text) {
/*this function extends imagettfbbox and includes within the returned array
the actual text width and height as well as the x and y coordinates the
text should be drawn from to render correctly. This currently only works
for an angle of zero and corrects the issue of hanging letters e.g. jpqg*/
$bbox = imagettfbbox($size, $angle, $fontfile, $text);
//calculate x baseline
if($bbox[0] >= -1) {
$bbox[''x''] = abs($bbox[0] + 1) * -1;
} else {
//$bbox[''x''] = 0;
$bbox[''x''] = abs($bbox[0] + 2);
}
//calculate actual text width
$bbox[''width''] = abs($bbox[2] - $bbox[0]);
if($bbox[0] < -1) {
$bbox[''width''] = abs($bbox[2]) + abs($bbox[0]) - 1;
}
//calculate y baseline
$bbox[''y''] = abs($bbox[5] + 1);
//calculate actual text height
$bbox[''height''] = abs($bbox[7]) - abs($bbox[1]);
if($bbox[3] > 0) {
$bbox[''height''] = abs($bbox[7] - $bbox[1]) - 1;
}
return $bbox;
}
Pero es imperativo que use las coordenadas x e y que proporciona esta función al dibujar:
imagettftext($im, $fontSize, 0, $bbox["x"], $bbox["y"], $text_color, $font, $text);
El problema es que cuando se utiliza imagettfbbox
para calcular las dimensiones del texto, se devuelve un rectángulo demasiado pequeño cuando el texto de entrada comienza con números. Este es mi código:
$fontSize = 150;
$font = "font/courier_new.ttf";
$text = $_GET["text"];
//Determine font dimensions
$bbox = imagettfbbox($fontSize, 0, $font, $text);
$bbox["width"]= abs($bbox[4]-$bbox[0]);
$bbox["height"]= abs($bbox[5]-$bbox[1]);
$im = imagecreatetruecolor($bbox["width"], $bbox["height"]);
echo "<b>Image size:</b>/n";
print_r($bbox);
// This part makes transparent background
imagesavealpha($im, true);
$bg = imagecolorallocatealpha($im, 254, 254, 254,127);
$text_color= imagecolorallocate($im, 0, 0, 0);
imagealphablending($im, false);
imagefilledrectangle($im, 0, 0, imagesx($im), imagesy($im), $bg );
imagealphablending($im, true);
header("X-Img-Size: ".$bbox["width"]."x".$bbox["height"]."");
imagettftext($im, $fontSize, 0, 0, $bbox["height"], $text_color, $font, $text);
// This is output
header("Content-Type: text/html");
ob_start();
imagepng($im);
$image_data = ob_get_contents();
ob_end_clean();
imagedestroy($im);
echo "<img src=/"data:image/png;base64,".base64_encode($image_data)."/" />";
Estos son los resultados que obtengo de diferentes textos de entrada:
¿Cómo puedo arreglar eso?