2011-01-09 8 views
6

ho utilizzato questo semplice script per generare immagini di testo:?Utilizzo di PHP GD per creare il testo sotto forma di immagine con diversi tipi di carattere

<?php 
header('Content-type: image/png'); 

$color = RgbfromHex($_GET['color']); 

$text = urldecode($_GET['text']); 

$font = 'arial.ttf'; 

$im = imagecreatetruecolor(400, 30); 

$bg_color = imagecolorallocate($im, 255, 255, 255); 

$font_color = imagecolorallocate($im, $color[0], $color[1], $color[2]); 

imagefilledrectangle($im, 0, 0, 399, 29, $bg_color); 

imagettftext($im, 20, 0, 10, 20, $font_color, $font, $text); 

imagepng($im); 

imagedestroy($im); 

function RgbfromHex($hexValue) { 
    if(strlen(trim($hexValue))==6) { 
     return array(
        hexdec(substr($hexValue,0,2)), // R 
        hexdec(substr($hexValue,2,2)), // G 
        hexdec(substr($hexValue,4,2)) // B 
        ); 
    } 
    else return array(0, 0, 0); 
} 

?> 

io chiamo lo script con file.php text = script di test colore & = 000000

Ora mi piacerebbe sapere come ho potuto generare il testo con caratteri normali e grassetto mescolati nella stessa immagine, qualcosa di simile a file.php?text=testing <b>script</b>&color=000000


Grazie a dqhendricks per avermi aiutato a capirlo.

Ecco un breve script che ho scritto, ha ancora bisogno di molti miglioramenti, ma per le funzionalità di base che sembra funzionare bene:

<?php 
header('Content-type: image/png'); 

$color = RgbfromHex($_GET['color']); 

$im = imagecreatetruecolor(400, 30); 

$white = imagecolorallocate($im, 255, 255, 255); 

imagefilledrectangle($im, 0, 0, 399, 29, $white); 

$tmp = $_GET['text']; 

$words = explode(" ", $tmp); 

$x = array(0,0,10); // DUMMY ARRAY WITH X POSITION FOR FIRST WORD 

$addSpace = 0; 

foreach($words as $word) 
{ 
    if($addSpace) $word = " ".$word; // IF WORD IS NOT THE FIRST ONE, THEN ADD SPACE 

    if(stristr($word, "<b>")) 
    { 
     $font = 'arialbd.ttf'; // BOLD FONT 
     $x = imagettftext($im, 20, 0, $x[2], 20, imagecolorallocate($im, $color[0], $color[1], $color[2]), $font, str_replace(array("<b>","</b>"), "", $word)); 
    } 
    else 
    { 
     $font = 'arial.ttf'; // NORMAL FONT 
     $x = imagettftext($im, 20, 0, $x[2], 20, imagecolorallocate($im, $color[0], $color[1], $color[2]), $font, $word); 
    } 

    $addSpace = 1; 
} 

imagepng($im); 

imagedestroy($im); 

function RgbfromHex($hexValue) { 
    if(strlen(trim($hexValue))==6) { 
     return array(
        hexdec(substr($hexValue,0,2)), // R 
        hexdec(substr($hexValue,2,2)), // G 
        hexdec(substr($hexValue,4,2)) // B 
        ); 
    } 
    else return array(0, 0, 0); 
} 

?> 

Nota: Questo funziona solo per "grassetto" singole parole separate da spazi e non per la parte audace di una parola.

chiamare lo script con file.php?text=testing+<b>script</b>&color=000000

+0

Prova http://www.roseindia.net/tutorial/php/phpgd/About-boldtext.html sembra di fare ciò che si vuole, è carattere nero che è in cima al carattere grigio, puoi semplicemente cambiare la posizione di quella grigia per consentire loro di essere posizionati come preferisci. L'URL sarà simile a 'file.php? Text = testing & bold = script & color = 000000'. – Daniel

+0

Non sembra audace, ma più simile a un'ombra, e se lo metto solo uno di fronte all'altro non penso che sembrerebbero diversi come solo un imagettftext(). – Meredith

risposta

0

è necessario caricare un file di carattere Arial grassetto, e fare due imagettftext separato() chiama, uno con ogni tipo di carattere che si desidera utilizzare. come per analizzare la stringa per scoprire quali parti desideri essere in grassetto e dove dovresti stampare ogni sezione di testo, sembra che diventerà un codice molto complicato. per cosa stai usando questo? ci possono essere soluzioni migliori per realizzare la stessa cosa.

aggiunta

Utilizzare il valore restituito dalla funzione imagettftext() per determinare dove la stampa di testo accanto dovrebbe iniziare.

Da documentazione:

Restituisce un array con 8 elementi che rappresentano quattro punti rendendo il rettangolo di selezione del testo. L'ordine dei punti è in basso a sinistra, in basso a destra, in alto a destra, in alto a sinistra. I punti sono relativi al testo indipendentemente dall'angolo, quindi "in alto a sinistra" significa nell'angolo in alto a sinistra quando vedi il testo in orizzontale. Restituisce FALSE per errore.

+1

L'analisi non sarebbe un problema, quello che non ho chiaro è come troverei la posizione X per il secondo wordr nell'esempio? Text = testing script. Voglio dire come faccio a sapere dove finisce la prima parola, quindi posso posizionare la seconda lì con un altro imagettftext() e un carattere grassetto. – Meredith

+0

vedi le modifiche per la risposta. – dqhendricks

+0

Questo è fantastico, grazie mille. – Meredith

-1

risposta per:

L'analisi non sarebbe un problema, quello che non ho chiaro è come avrei trovato la posizione X per la seconda wordr nell'esempio text = test sceneggiatura?. Voglio dire come faccio a sapere dove finisce la prima parola, quindi posso posizionare la seconda lì con un altro imagettftext() e un carattere grassetto. - Meredith 9 gennaio '11 a 2:43


divertente come qualcuno ha avuto il tempo di dire "vedere le modifiche per la risposta a questa" quando hanno appena detto coulda esplodere la stringa presso gli spazi, quindi ogni parola è in un array ..

<?PHP 
$sentence = "I LOVE giving retarded answers that don't amount to jack!"; 
$sentence = explode(" ",$sentence); 

for($s=0;$s<count($sentence);$s++){ 

#THERES YOUR INDIVIDUAL WORDS! 
$word = $sentence[$s]; 

} 
?> 

La posizione X sarebbe semplicemente $ s per la logica. Per ottenere la seconda parola è possibile fare questo:

<?PHP 
$word1 = $sentence[0]; 
$word2 = $sentence[1]; 
$word3 = $sentence[2]; 
$word4 = $sentence[3]; 
?> 

Sì, ho chiamato le parole $ solo per un effetto visivo mentale.

$ frase [1] sarebbe parola 2