Qui ci viene in aiuto la matematica =D.
Allora la logica di questa soluzione consiste nello stabilire una proporzione con i seguenti dati:
- un carattere di base di cui si conoscono le dimensioni (12);
- le dimensioni in pixel di quel carattere (10);
- la dimensione inviata dall'utente ($size);
- l'incognita corrispondente alle dimensioni del carattere scelto dall'utente ($font_size).
Con Courier New siamo avvantaggiati in quanto ogni carattere pare ricoprire l'area di un quadrato, quindi basta impostare una sola proporzione sia per l'altezza che per la larghezza:
Codice:
12 : $size = 10 : $font_size
Che si risolve come segue:
Codice:
$font_size = ($size * 10) / 12
Se per esempio impostiamo $size a 18, otteniamo che:
Codice:
$font_size = (18 * 10) / 12 = 15
che corrisponde proprio alla dimensione che avevo trovato nell'esempio precedente a seguito di un paio di tentativi.
Ho provato questo codice in locale e pare funzioni, tranne che per la dimensione 9, nella quale in caso di frasi lunghe l'ultima parte viene tagliata (evidentemente perchè 10 non è proprio la dimensione precisa del carattere 12, potresti provare a cambiarlo con 10.1, 10.2 eccetera per vedere quale sia quella più equilibrata), ma ho provato anche con dimensione 500 e fila tutto liscio.
Quindi il tuo nuovo codice ora dovrebbe essere così:
Codice PHP:
<?php
if (isset($_GET["send"]))
{
header("Content-type: image/png");
$text = $_POST['string'];
$size = $_POST['dim'];
// 12 : $size = 10 : $font_size
$font_size = ($size * 10) / 12;
$image_width = $font_size * (strlen($text) + 2);
$image_height = $font_size * 3;
$image = imagecreate($image_width, $image_height);
$background = imagecolorallocate($image, 225, 225, 225);
$text_color = imagecolorallocate($image, 0, 0, 0);
imagettftext($image, $size, 0, $font_size, $font_size * 2, $text_color, "CourierNew.ttf", $text);
imagepng($image);
imagedestroy($image);
}
else
{
?>
<form action="index.php?send" method="post">
<input type="text" name="string" value="Inserisci qui il testo..." onfocus="if(this.value == 'Inserisci qui il testo...') this.value = '';" onblur="if(this.value == '') this.value = 'Inserisci qui il testo...';" />
- <input type="text" size="2" maxlength="2" name="dim" />
- <input type="submit" value="Crea!" />
</form>
<?php
}
?>
Ti ho sistemato anche gli eventi onblur e onfocus del campo string, in modo che quando ci clicchi sopra solo se il testo è quello di base il campo viene svuotato, mentre se quando clicchi da un'altra parte se il campo è vuoto ritorna in testo di base - non so se ti interessava.
Questo è quanto, spero che sia utile come soluzione.
E poi dicono che la matematica non è bella =D.