2011-01-09 30 views
6

tôi đã được sử dụng kịch bản này đơn giản để tạo ra hình ảnh từ văn bản:?Sử dụng PHP GD để tạo ra hình thức văn bản hình ảnh với phông chữ khác nhau

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

?> 

tôi gọi là kịch bản với file.php text = kiểm tra kịch bản & color = 000000

Bây giờ tôi muốn biết làm thế nào tôi có thể tạo ra văn bản với phông chữ bình thường và đậm trộn lẫn trong cùng một hình ảnh, một cái gì đó giống như file.php?text=testing <b>script</b>&color=000000


Cảm ơn dqhendricks để giúp tôi tìm ra điều này.

Dưới đây là một kịch bản nhanh chóng tôi đã viết, vẫn cần nhiều cải tiến nhưng đối với các chức năng cơ bản có vẻ như được làm việc tốt:

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

?> 

Lưu ý: Điều này sẽ chỉ làm việc cho "bolding" từ đơn tách bằng dấu cách và không cho bolding một phần của một từ.

Gọi kịch bản với file.php?text=testing+<b>script</b>&color=000000

+0

Hãy thử http://www.roseindia.net/tutorial/php/phpgd/About-boldtext.html có vẻ như để làm những gì bạn muốn, đó là phông chữ màu đen đó là trên đầu trang của phông chữ màu xám, bạn chỉ có thể thay đổi vị trí của màu xám để cho phép chúng được đặt theo cách bạn muốn. URL sẽ tương tự như 'file.php? Text = testing & bold = script & color = 000000'. – Daniel

+0

Điều đó không giống như đậm, nhưng giống như một cái bóng, và nếu tôi đặt nó chỉ là một ở phía trước của nhau tôi không nghĩ rằng họ sẽ xuất hiện bất kỳ khác nhau như chỉ có một imagettftext(). – Meredith

Trả lời

0

bạn sẽ cần phải tải một file font arial-đậm, và làm hai imagettftext riêng biệt() gọi, một với mỗi font bạn muốn sử dụng. để phân tích cú pháp chuỗi để tìm ra phần nào bạn muốn in đậm và nơi bạn nên in từng phần văn bản, điều này nghe có vẻ như nó sẽ trở thành mã rất phức tạp. bạn đang sử dụng cái này để làm gì? có thể có các giải pháp tốt hơn để hoàn thành cùng một điều.

Addition

Sử dụng giá trị trả về từ imagettftext() chức năng để xác định nơi in văn bản bên cạnh nên bắt đầu.

Từ tài liệu:

Trả về mảng có 8 phần tử đại diện cho bốn điểm làm cho hộp giới hạn của văn bản. Thứ tự của các điểm thấp hơn bên trái, phía dưới bên phải, phía trên bên phải, phía trên bên trái. Các điểm có liên quan đến văn bản bất kể góc, do đó, "phía trên bên trái" có nghĩa là ở góc trên cùng bên trái khi bạn thấy văn bản theo chiều ngang. Trả về FALSE do lỗi.

+1

Việc phân tích cú pháp sẽ không phải là vấn đề, những gì tôi không rõ ràng là làm thế nào tôi sẽ tìm thấy vị trí X cho từ thứ hai trong ví dụ này? Tôi có nghĩa là làm thế nào để tôi biết nơi từ đầu tiên kết thúc vì vậy tôi có thể đặt thứ hai ở đó với một imagettftext() và một phông chữ đậm. – Meredith

+0

xem các chỉnh sửa cho câu trả lời cho điều đó. – dqhendricks

+0

Thats tuyệt vời, cảm ơn rất nhiều. – Meredith

-1

đáp ứng cho:

Các phân tích cú pháp sẽ không là một vấn đề, những gì tôi không có rõ ràng là thế nào tôi sẽ tìm ra vị trí X cho wordr thứ hai trong ví dụ text = thử nghiệm kịch bản?. Tôi có nghĩa là làm thế nào để tôi biết nơi từ đầu tiên kết thúc vì vậy tôi có thể đặt thứ hai ở đó với một imagettftext() và một phông chữ đậm. - Meredith 09 Tháng 1 '11 2:43


hài hước như thế nào một người nào đó dành thời gian để nói "nhìn thấy chỉnh sửa câu trả lời cho rằng" khi họ coulda vừa nói nổ chuỗi tại chỗ, sau đó mỗi từ nằm trong một mảng ..

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

} 
?> 

Vị trí X của bạn sẽ đơn giản là $ s cho logic của bạn. Để nhận được từ thứ hai, bạn có thể làm điều này:

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

Vâng, tôi đã đặt tên $ words chỉ cho một hiệu ứng hình ảnh tinh thần.

$ câu [1] sẽ là từ 2

Các vấn đề liên quan