2009-12-20 33 views
5

Aşağıdaki PHP kodu, dinamik olarak oluşturulmuş bir görüntü olarak metin oluşturur, resmi yalnızca metin kadar büyük olacak şekilde nasıl edinebilirim? Teşekkürler.Görüntü boyutunu metnin boyutuna göre yeniden boyutlandırı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); 
?> 

GÜNCELLEME 1: Ben orijinal posterin örnekle burada cevap buldu - Creating IMage from Text in PHP - how can I make multiline?

GÜNCELLEME 2: TrueType'ı kullanırken Martin Geisler'in versiyonu da iyi

cevap

6

çalışır, kullanmak imageftbbox, yazı tipinizle bir dize yazı kümesi için sınırlayıcı kutuyu elde etme işlevi. Sınırlayıcı kutu ofsetleri taban noktasından, metnin işgal ettiği dikdörtgenin dört köşesine verir. Eğer $bb içindeki sınırlama kutusunu saklamak ve ($x, $y) metni koymak için imagefttext kullanmak Yani eğer, o zaman köşeleri bu koordinatları sahip olacaktır: bize

($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]) 

biz benzer bir görüntü ($x + $bb[2]) - ($x + $bb[6]) = $bb[2] - $bb[6] genişliğini ve bir görüntü yüksekliği istediğiniz $bb[3] - $bb[7]. Biz bu kodla deneyebilirsiniz

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

istiyorum çünkü metin daha sonra bu resmin içindeki koordinatlara (-$bb[6], -$bb[7]) işlenip edilmelidir. img.php adlı bir dosya içine koyun ve teste img.php?q=Hello gidin:

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

yerine, daha sonra imagefontwidth ve imagefontheight fonksiyonları bakmak bitmap fontları kullanın.

+0

, ben imageftbbox sayfasındaki örneklerden bazıları baktım ama metnin boyutlarını almak gibi olamaz. – usertest

+0

Evet, ilk başta yanlış soruyu yanıtladığım için özür dilerim. Şimdi bunun yerine TrueType yazı tipleri için kod verdim. –

+0

Kodu denedim ve "Resim" test.php "hatası görüntülenemiyor, çünkü hata içeriyor." – usertest

2

@Martin Geisler'in yanıtı neredeyse doğru, ancak metnimi görüntünün içine sığacak şekilde alamadım. Bunun yerine çalıştı, bu mükemmel çalışıyor! PHP Manual's User Contributed Notes itibaren

:

$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); 
Ben ttf fontları kullanmak istiyorum
+0

Maalesef, Windows ve Linux'un farklı şekilde çalıştığı ve hiçbir betiğin her ikisinde de mükemmel çalışmadığı görülüyor. –

İlgili konular