2011-08-03 49 views
6

Có ai có chức năng vẽ chuỗi ttf (imagettftext) với khoảng cách chữ cái được chỉ định không?khoảng cách giữa các khoảng trống imagettftext

Tôi không thể tìm thấy bất kỳ chức năng GD tích hợp nào vì vậy tôi nghĩ rằng nó nên được thực hiện bằng thư thêm một số chiều rộng không đổi.

Có thể ai đó đã có chức năng như vậy :)

ps. phông chữ tốt nhất sẽ là arial.ttf

Trả lời

20
function imagettftextSp($image, $size, $angle, $x, $y, $color, $font, $text, $spacing = 0) 
{   
    if ($spacing == 0) 
    { 
     imagettftext($image, $size, $angle, $x, $y, $color, $font, $text); 
    } 
    else 
    { 
     $temp_x = $x; 
     for ($i = 0; $i < strlen($text); $i++) 
     { 
      $bbox = imagettftext($image, $size, $angle, $temp_x, $y, $color, $font, $text[$i]); 
      $temp_x += $spacing + ($bbox[2] - $bbox[0]); 
     } 
    } 
} 

và cuộc gọi:

imagettftextSp($image, 30, 0, 30, 30, $black, 'arial.ttf', $text, 23); 

Chức năng thứ tự các tham số đáp ứng thứ tự tham số imagettftext chuẩn, và tham số cuối cùng là tham số khoảng cách $ tùy chọn. Nếu không được đặt hoặc giá trị được truyền là 0, khoảng cách kerning/letter không được đặt.

+0

thay thế $ text [$ i] bằng mb_substr ($ text, $ i, 1) để khắc phục sự cố với các ký tự mulitibyte – Juergen

0

GD không hỗ trợ kerning, vì vậy bạn sẽ phải thực hiện theo cách thủ công. Cá nhân, tôi đã viết một chức năng có thể viết từng chữ riêng biệt. Tôi không thể tìm thấy nó ngay bây giờ, nhưng đó là một cái gì đó dọc theo dòng:

function drawText(&$image, $text, $fgColor, $font, $fgColor, 
        $fontSize = 14, $kerning = 0, $x = 0, $y = 0) { 
    $letters = explode('', $text); 

    foreach ($letters as $n => $letter) { 
     $bbox = imagettftext($image, $fontSize, 0, $x, $y, $fgColor, $font, $letter); 
     $x += $bbox[2] + $kerning; 
    } 
} 
-1

Hãy thử chức năng này:

$image = imagecreatetruecolor(500,200); 
$text = "Text to print"; 
$text_color=imagecolorallocate($image,255,255,255); 
$font_size = 18; 
$space = 8; 
$font = "path_to_font/arial.ttf"; 
$x=20; 
$y=20; 
for ($i = 0; $i <strlen($text); $i++){ 
    $arr = imagettftext ($image, $font_size,0, $x, $y, $text_color, $font, $text{$i}); 
    $x = $arr[4]+$space; 
} 
imagejpeg($image); 
destroyimage($image); 
10

Tôi biết điều này đã được trả lời trong khi trở lại, nhưng tôi cần một giải pháp có khoảng cách giữa các chữ cái và duy trì độ lệch góc.

tôi đổi mã Radzi để thực hiện điều này:

function imagettftextSp($image, $size, $angle, $x, $y, $color, $font, $text, $spacing = 0) 
{   
    if ($spacing == 0) 
    { 
     imagettftext($image, $size, $angle, $x, $y, $color, $font, $text); 
    } 
    else 
    { 
     $temp_x = $x; 
     $temp_y = $y; 
     for ($i = 0; $i < strlen($text); $i++) 
     { 
      imagettftext($image, $size, $angle, $temp_x, $temp_y, $color, $font, $text[$i]); 
      $bbox = imagettfbbox($size, 0, $font, $text[$i]); 
      $temp_x += cos(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0])); 
      $temp_y -= sin(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0])); 
     } 
    } 
} 
+1

Rất vui khi thấy bạn đã trả lại cộng đồng Stack Overflow với câu trả lời này. Chương trình hay nhất +1 – Fluffeh

5

Chỉ cần để hoàn thành câu trả lời pidalia (mà là tốt nhất) để tránh một số rắc rối với char đặc biệt (như "é" hay "à")

static function imagettftextSp($image, $size, $angle, $x, $y, $color, $font, $text, $spacing = 0) { 
    if ($spacing == 0) { 
     imagettftext($image, $size, $angle, $x, $y, $color, $font, $text); 
    } else { 
     $temp_x = $x; 
     $temp_y = $y; 
     //to avoid special char problems 
     $char_array = preg_split('//u',$text, -1, PREG_SPLIT_NO_EMPTY); 
     foreach($char_array as $char) { 
      imagettftext($image, $size, $angle, $temp_x, $temp_y, $color, $font, $char); 
      $bbox = imagettfbbox($size, 0, $font, $char); 
      $temp_x += cos(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0])); 
      $temp_y -= sin(deg2rad($angle)) * ($spacing + ($bbox[2] - $bbox[0])); 
     } 
    } 
} 
Các vấn đề liên quan