php gd imagettftext

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)."/" />";

Prueba en línea aquí

Estos son los resultados que obtengo de diferentes textos de entrada:

¿Cómo puedo arreglar eso?