2011-01-09 13 views
6

Używam tego prosty skrypt do generowania obrazów z tekstem:pomocą PHP GD stworzyć formularz obraz tekstu z różnych czcionek

<?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); 
} 

?> 

nazywam skrypt file.php text = skryptu testowanie & color = 000000

teraz chciałbym wiedzieć, w jaki sposób mogę wygenerować tekst z normalnych i śmiałych czcionek mieszane w tym samym obrazie, coś file.php?text=testing <b>script</b>&color=000000


Dzięki do dqhendricks za pomoc w rozwiązaniu tego problemu.

Oto krótki skrypt pisałem, musi jeszcze wiele ulepszeń, ale dla podstawowych funkcji wydaje się działać prawidłowo:

<?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); 
} 

?> 

Uwaga: Funkcja ta działa tylko dla „pogrubienie” pojedynczych słów oddzielonych spacjami i nie pogrubienie części słowa.

wywołać skrypt z file.php?text=testing+<b>script</b>&color=000000

+0

Spróbuj http://www.roseindia.net/tutorial/php/phpgd/About-boldtext.html wydaje się robić to, co chcesz, to czarna czcionka to na górze szarej czcionki, możesz po prostu zmienić pozycję szarej, aby umożliwić jej umieszczanie w dowolny sposób. Adres URL będzie podobny do 'file.php? Text = testing & bold = script & color = 000000'. – Daniel

+0

To nie wygląda na odważne, ale bardziej jak cień, i jeśli umieszczę go tylko jeden przed sobą, nie sądzę, by wyglądały one inaczej niż tylko jeden imagettftext(). – Meredith

Odpowiedz

0

trzeba będzie załadować arial-Bold plik czcionki, a nie dwa oddzielne imagettftext() zwraca jeden z każdej czcionki, której chcesz użyć. jeśli chodzi o analizowanie łańcucha znaków, aby dowiedzieć się, które części mają być odważne, i gdzie należy wydrukować każdą sekcję tekstu, brzmi to tak, jakby stał się bardzo skomplikowanym kodem. do czego nawet tego używasz? mogą istnieć lepsze rozwiązania dla osiągnięcia tego samego.

Dodawanie

Użyj wartości zwracanej z funkcji imagettftext(), aby określić, gdzie obok drukuj tekst powinien zacząć.

Z dokumentacji:

Zwraca tablicę z 8 elementów reprezentujących cztery punkty czyni obwiedni tekstu. Kolejność punktów to dolny lewy, prawy dolny, górny prawy, górny lewy. Punkty odnoszą się do tekstu niezależnie od kąta, więc "lewy górny" oznacza w lewym górnym rogu, gdy widzisz tekst w poziomie. Zwraca FALSE w przypadku błędu.

+1

Parsowanie nie stanowiłoby problemu, nie mam pojęcia, jak znaleźć pozycję X dla drugiego słowa w przykładowym tekście = testowanie skrypt. Chodzi mi o to, skąd mam wiedzieć, gdzie kończy się pierwsze słowo, więc mogę umieścić drugie z innym imagettftext() i pogrubioną czcionką. – Meredith

+0

Zobacz zmiany, aby uzyskać odpowiedź na to pytanie. – dqhendricks

+0

To świetnie, wielkie dzięki. – Meredith

-1

odpowiedzi dla:

parsowanie nie byłoby problemu, co nie mam jasne, w jaki sposób mogę znaleźć pozycję X dla drugiego wordr w przykładzie text = testowania skryptu?. Chodzi mi o to, skąd mam wiedzieć, gdzie kończy się pierwsze słowo, więc mogę umieścić drugie z innym imagettftext() i pogrubioną czcionką. - Meredith 09 stycznia '11 w 2:43


śmieszne jak ktoś wziął czas, aby powiedzieć „zobaczyć zmiany na odpowiedź do tego” kiedy coulda po prostu powiedział wybuchnąć ciąg w przestrzeni, to każdy wyraz jest w tablicy ..

<?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]; 

} 
?> 

Twoja pozycja X będzie po prostu $ s dla twojej logiki. Aby uzyskać drugie słowo można to zrobić:

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

Tak, nazwałem dolarów słowa tylko dla umysłowo efekt wizualny.

$ zdanie [1] byłoby słowo 2

Powiązane problemy