2009-12-20 44 views
5

Mã PHP bên dưới tạo văn bản dưới dạng hình ảnh được tạo động, làm cách nào để tôi có thể lấy hình ảnh chỉ lớn như văn bản? Cảm ơn.Thay đổi kích thước hình ảnh theo kích thước văn bản

<?php 
    header('Content-Type: image/jpeg'); 

    $text='Test'; 

    $img = imageCreate(200,200); 

    imagecolorallocate($img, 255, 255, 255); 

    $textColor = imagecolorallocate($img, 0, 0, 0); 

    imagefttext($img, 15, 0, 0, 55, $textColor, 'bgtbt.ttf', $text); 

    imagejpeg($img); 

    imagedestroy($img); 
?> 

UPDATE 1: Tôi tìm thấy câu trả lời ở đây với các ví dụ về các poster ban đầu - Creating IMage from Text in PHP - how can I make multiline?

UPDATE 2: phiên bản Martin Geisler cũng hoạt động tốt

Trả lời

6

Khi sử dụng một phông chữ TrueType, bạn sử dụng imageftbbox để có được hộp giới hạn cho một kiểu chuỗi với phông chữ của bạn. Hộp giới hạn cho phép dời số từ điểm cơ sở đến bốn góc trong hình chữ nhật bị chiếm bởi văn bản. Vì vậy, nếu bạn lưu trữ hộp bounding trong $bb và sử dụng imagefttext để đưa văn bản tại ($x, $y), sau đó các góc sẽ có các tọa độ:

($x + $bb[6], $y + $bb[7])   ($x + $bb[4], $y + $bb[5]) 
          +-------+ 
          | Hello | 
          +-------+ 
($x + $bb[0], $y + $bb[1])   ($x + $bb[2], $y + $bb[3]) 

Điều đó nói với chúng ta rằng chúng ta muốn có chiều rộng hình ảnh của ($x + $bb[2]) - ($x + $bb[6]) = $bb[2] - $bb[6] và tương tự một chiều cao hình ảnh của $bb[3] - $bb[7]. Văn bản sau đó sẽ được hiển thị tại tọa độ (-$bb[6], -$bb[7]) bên trong ảnh đó vì chúng tôi muốn có

(0, 0) = ($x + $bb[6], $y + $bb[7]) ==> $x = -$bb[6] and $y = -$bb[7] 

Bạn có thể dùng thử với mã này. Đặt nó vào một tập tin gọi là img.php và duyệt đến img.php?q=Hello để kiểm tra:

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

$q  = $_REQUEST['q']; 
$font = "Impact.ttf"; 
$size = 30; 
$bbox = imageftbbox($size, 0, $font, $q); 

$width = $bbox[2] - $bbox[6]; 
$height = $bbox[3] - $bbox[7]; 

$im = imagecreatetruecolor($width, $height); 
$green = imagecolorallocate($im, 60, 240, 60); 

imagefttext($im, $size, 0, -$bbox[6], -$bbox[7], $green, $font, $q); 
imagepng($im); 
imagedestroy($im); 
?> 

Nếu bạn sử dụng các phông chữ bitmap thay vào đó, sau đó nhìn vào các chức năng imagefontwidthimagefontheight.

+0

Tôi muốn sử dụng phông chữ ttf, tôi nhìn vào một số ví dụ trên trang imageftbbox nhưng tôi dường như không thể có được kích thước của văn bản. – usertest

+0

Vâng, tôi xin lỗi vì tôi đã trả lời câu hỏi sai lúc đầu - tôi đã đưa ra mã cho các phông chữ TrueType thay thế. –

+0

Tôi đã thử mã và tôi nhận được lỗi "Hình ảnh" test.php "không thể được hiển thị, bởi vì nó có lỗi." – usertest

2

@Martin Geisler của câu trả lời là gần như chính xác, nhưng tôi không thể có được văn bản của tôi để phù hợp hoàn toàn bên trong hình ảnh. Tôi đã thử điều này thay vào đó, hoạt động hoàn hảo!

Từ PHP Manual's User Contributed Notes:

$text = "<?php echo \"hello, world\"; ?>"; 
$font = "./arial.ttf"; 
$size = "60"; 

$bbox = imagettfbbox($size, 0, $font, $text); 

$width = abs($bbox[2] - $bbox[0]); 
$height = abs($bbox[7] - $bbox[1]); 

$image = imagecreatetruecolor($width, $height); 

$bgcolor = imagecolorallocate($image, 255, 255, 255); 
$color = imagecolorallocate($image, 0, 0, 0); 

$x = $bbox[0] + ($width/2) - ($bbox[4]/2); 
$y = $bbox[1] + ($height/2) - ($bbox[5]/2); 

imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor); 
imagettftext($image, $size, 0, $x, $y, $color, $font, $text); 

$last_pixel= imagecolorat($image, 0, 0); 

for ($j = 0; $j < $height; $j++) 
{ 
    for ($i = 0; $i < $width; $i++) 
    { 
     if (isset($blank_left) && $i >= $blank_left) 
     { 
      break; 
     } 

     if (imagecolorat($image, $i, $j) !== $last_pixel) 
     { 
      if (!isset($blank_top)) 
      { 
       $blank_top = $j; 
      } 
      $blank_left = $i; 
      break; 
     } 

     $last_pixel = imagecolorat($image, $i, $j); 
    } 
} 

$x -= $blank_left; 
$y -= $blank_top; 

imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $bgcolor); 
imagettftext($image, $size, 0, $x, $y, $color, $font, $text); 

header('Content-type: image/png'); 
imagepng($image); 
imagedestroy($image); 
+0

Xin lỗi, có vẻ như Windows và Linux hoạt động khác nhau và không có kịch bản nào hoạt động hoàn hảo cả hai. –

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