Per farlo occorre suddividere una circonferenza (o parte di essa se la frase non deve circoscriverla) in una quantità di settori uguali a quello delle lettere da far comparire.Per disegnare il testo è possibile usare entrambe le funzioni che GD fornisce.
imagestring() con i caratteri a corredo di GD, obbligatoriamente con lettere in orizzontale o verticale oppureimagepstext() | imagefttext() (in ragione del tipo di TTF usati).Con questa seconda opzione, oltre a poter scegliere la dimensione dei caratteri in maniera molto più ampia, questi possono essere ruotati rendendo il risultato più armonioso.
La stringa di testo va inserita in una variabile.
L'arco viene disegnato con una quantità di passi (archi) uguale a quello delle lettere.
Per ogni arco viene calcolato, sul piano cartesiano, la posizione x,y, quindi estratta dalla stringa la lettera corrispondente al numero d'ordine del semiarco corrente e disegnata alle coordinate cartesiane citate in precedenza.
Nell'esempio seguente la funzione scrive_su_conferenza() viene chiamata 3 volte scrivendo testo su circonferenze e risulti diversi in ragione dei dati passati.
Il nome delle variabili è autoesplicativo e lo script commentato completamente.:
<?php
$Frase = isset($_POST['Frase']) ? $_POST['Frase'] : "ABCDEFGHILMNOPQRST";
$ColoreFrase = isset($_POST['ColoreFrase']) ? $_POST['ColoreFrase'] : "Rosso";
$ColoreSfondo = isset($_POST['ColoreSfondo']) ? $_POST['ColoreSfondo'] : "Verde";
$Tratti = isset($_POST['Tratti']) ? $_POST['Tratti'] : "Si";
function scrive_su_conferenza($Immagine, $InclTipo, $Cx,$Cy,$AsseOrizz,$AsseVertic,$Frase,$ColoreTestoCorrente,$Tratti){
// colori usati nell'esempio
$Celeste =
imagecolorallocate($Immagine,0,255,255);
$font = "font/arial.ttf"; $Dim = 20; // tipo e dimensione font
$t = 0; // lettera da estrarre dalla stringa $Frase
$TipoInclinazione = 0;
$N = strlen($Frase); // quantità di caratteri da inserire
$Step = floor(360/$N); // dimensione singolo arco
for($i = 0 ; $i< 360; $i+=$Step){ // inizio creazione archi
if($Tratti == "Si")// disegna l'arco
{
imagearc($Immagine,$Cx,$Cy,$AsseOrizz,$AsseVertic,$i,$i,$Celeste); }
// tipo di inclinazione della lettera
if($InclTipo == 1){$a = $i-($Step/3 - 90);} // lettere con base rivolta verso il centro
else
{$a = $i+$Step;}// lettere con base rivolta verso la lettera precedente
// calcola, sul piano cartesiano, le coordinate dove disegnare la lettera
$cos = cos(deg2rad($a)); $sin = sin(deg2rad($a)); // calcolo in radianti
$xt = round($cos*(0) - $sin*($AsseOrizz)); // posizione x
$yt = round($sin*(0) + $cos*($AsseVertic)); // posizione y
// disegna segmento dal centro della circoverenza alla lettera
if($Tratti == "Si")
{
imageline ($Immagine, $Cx , $Cy , $Cx+$xt , $Cy+$yt , $Celeste );}
if($InclTipo == 1) // disegna lettere se inclinazione è opzione 1
{
imagettftext($Immagine,$Dim, $TipoInclinazione ,$Cx+$xt,$Cy+$yt,$ColoreTestoCorrente,$font,substr($Frase,$t,1));}
else // disegna lettere se inclinazione è opzione diversa da 1
{
imagettftext($Immagine,$Dim, 180-($a) , $Cx+$xt,$Cy+$yt,$ColoreTestoCorrente,$font,substr($Frase,$t,1));}
$t++; // prepara estrazione prossimo carattere
$TipoInclinazione = $TipoInclinazione - $Step; // prossima inclinazione lettera
}}
$Immagine =
imagecreatetruecolor(720,450); // crea immagine
//
imagecolorallocate($Immagine,0,0,0); // colore sfondo
//$Frase = "ABCDEFGHILMNOPQRST"; // stringa con frase da disporre su circonferenza
// colori usati nell'esempio
$Rosso =
imagecolorallocate($Immagine,255,0,0);
$Verde =
imagecolorallocate($Immagine,0,255,0);
$Blu =
imagecolorallocate($Immagine,0,0,255);
if($ColoreFrase == "Rosso"){$ColoreTestoCorrente = $Rosso;}
if($ColoreFrase == "Verde"){$ColoreTestoCorrente = $Verde;}
if($ColoreFrase == "Blu"){$ColoreTestoCorrente = $Blu;}
if($ColoreSfondo == "Rosso"){$ColoreSfondoCorrente = $Rosso;}
if($ColoreSfondo == "Verde"){$ColoreSfondoCorrente = $Verde;}
if($ColoreSfondo == "Blu"){$ColoreSfondoCorrente = $Blu;}
if($ColoreFrase == $ColoreSfondo){$ColoreTestoCorrente =
imagecolorallocate($Immagine,80,80,80);}
if($ColoreSfondo == "Trasparente"){
/*** rende l'immagine TRASPARENTE ***/
imagesavealpha($Immagine, true); // imposta il flag per salvare informazioni con canale Alpha
$CanaleAlpha =
imagecolorallocatealpha($Immagine, 255, 255, 0, 127);
imagefill($Immagine, 0, 0, $CanaleAlpha); // rende l'immagine completamente trasparente
}
else{
imagefill($Immagine, 0, 0, $ColoreSfondoCorrente);}
// circonferenza, lettere con base caratteri rivolta verso il centro
$InclTipo = 0; $Cx = 160; $Cy = 140;$AsseOrizz = 100; $AsseVertic = 100;
scrive_su_conferenza($Immagine, $InclTipo, $Cx,$Cy,$AsseOrizz,$AsseVertic,$Frase,$ColoreTestoCorrente,$Tratti);
// circonferenza, lettere con base rivolta verso la lettera precedente
$InclTipo = 1; $Cx = 570; $Cy = 140;$AsseOrizz = 100; $AsseVertic = 100;
scrive_su_conferenza($Immagine, $InclTipo, $Cx,$Cy,$AsseOrizz,$AsseVertic,$Frase,$ColoreTestoCorrente,$Tratti);
// ellisse, lettere con base caratteri rivolta verso il centro
$InclTipo = 0; $Cx = 370; $Cy = 330;$AsseOrizz = 160; $AsseVertic = 70;
scrive_su_conferenza($Immagine, $InclTipo, $Cx,$Cy,$AsseOrizz,$AsseVertic,$Frase,$ColoreTestoCorrente,$Tratti);
imagepng($Immagine,"NomeFile.png"); // salva
imagedestroy($Immagine); // libera memoria
?>