2010-03-14 141 views
21

將圖像中的文本右對齊我爲用戶設置了動態論壇簽名圖像,我希望能夠將其用戶名放在圖像上。我能夠做到這一點很好,但由於用戶名是不同的長度,我想對齊用戶名,我怎麼能做到這一點,當我必須設置x & y座標。使用imagettftext(),PHP

$im = imagecreatefromjpeg("/path/to/base/image.jpg"); 
$text = "Username"; 
$font = "Font.ttf"; 
$black = imagecolorallocate($im, 0, 0, 0); 

imagettftext($im, 10, 0, 217, 15, $black, $font, $text); 
imagejpeg($im, null, 90); 
+0

好的。我有多行相同的問題。 – Melki 2013-11-04 11:45:43

回答

56

使用imagettfbbox函數獲取字符串的寬度,然後從圖像的寬度中減去該寬度以獲取起始x座標。

$dimensions = imagettfbbox($fontSize, $angle, $font, $text); 
$textWidth = abs($dimensions[4] - $dimensions[0]); 
$x = imagesx($im) - $textWidth; 
+0

我現在很愛你。這很好。 – rncrtr 2013-04-12 22:53:15

+0

@安迪......我也是(只愛你的答案) – h2O 2013-10-09 05:46:59

+0

有多行的任何想法? – Melki 2013-11-04 11:46:28

3

使用imagettfbbox()預先計算用戶名的大小。

從您從那裏獲得的寬度,您可以扣除文本需要啓動的x位置。

1

這將工作...............

    $s = split("[\n]+", $text); 
        $top=20; 
        $left=30; 
        $font_file="yourfont.ttf"; 
        $fontsize=20; 
       $__H=$top; 
       foreach($s as $key=>$val){ 
        $_b = imageTTFBbox($fontsize,0,$font_file,$val); 
        $_W = abs($_b[2]-$_b[0]); 
        $_X = ($left+$text_box_width)-$_W; 
        $_H = abs($_b[5]-$_b[3]); 
        $_H +=1; 
        $__H += $_H;    
        $res=imagettftext($image, $this->_fontsize, 0, $_X, $__H, $color, $font_file, $val); 
        $__H += 1; 
5

可以使用stil/gd-text類。免責聲明:我是作者。

<?php 
use GDText\Box; 
use GDText\Color; 

$im = imagecreatefromjpeg("/path/to/base/image.jpg"); 

$textbox = new Box($im); 
$textbox->setFontSize(12); 
$textbox->setFontFace("Font.ttf"); 
$textbox->setFontColor(new Color(0, 0, 0)); // black 
$textbox->setBox(
    50, // distance from left edge 
    50, // distance from top edge 
    200, // textbox width 
    100 // textbox height 
); 

// text will be aligned inside textbox to right horizontally and to top vertically 
$textbox->setTextAlign('right', 'top'); 

$textbox->draw("Username"); 

您還可以繪製多線文本。只需在傳遞給draw()方法的字符串中使用\n即可。 實施例與此類生成:

right aligned text demo

1

我增強sujithayur代碼,和創建的函數,其允許所有對齊(左,中,右)&(頂部,中部,中)和其組合。它也使用文字陰影。

// $x is margin from left, in case of left align, and margin from right, in case of right horizontal align 
// $alignHorizontal values can be 'left', 'center', 'right' 
// $alignVertical values can be 'top', 'center', 'bottom' 
function imagettftext_aligned($image, $fontSize, $x, $y, $color, $colorShadow, $fontPath, $text, $alignHorizontal, $alignVertical) { 

     $s = explode("\n", $text); 
     $imageWidth = imagesx($image); 
     $imageHeight = imagesy($image); 

     $top=$y; 
     $left=$imageWidth - $x; 
     $__H=$top; // default - top 
     $lineHeight = $fontSize + 14; 

     if ($alignVertical == 'bottom') 
     $__H = $imageHeight - $y - (count($s) * $lineHeight); 
     elseif ($alignVertical == 'center') 
     $__H = $imageHeight/2 - (count($s) * $lineHeight)/2; 

     foreach($s as $key=>$val){ 
      $_b = imageTTFBbox($fontSize,0,$fontPath,$val); 
      $_W = abs($_b[2]-$_b[0]); 
      $_H = abs($_b[5]-$_b[3]); 
      $_H +=1; 

      if ($alignHorizontal == 'right') 
       $_X = $left - $_W; 
      elseif ($alignHorizontal == 'center') 
       $_X = $imageWidth/2 - $_W/2; 
      else // default - left 
       $_X = $x; 

      imagettftextblur($image, $fontSize, 0, $_X + 2, $__H + 2, $colorShadow, $fontPath, $val, 4); // 1 can be higher to increase blurriness of the shadow 
      imagettftextblur($image, $fontSize, 0, $_X, $__H, $color, $fontPath, $val); 

      $__H += $lineHeight + 1; 
     } 

    return ['bottom' => $__H]; 

} 

// https://github.com/andrewgjohnson/imagettftextblur 
if (!function_exists('imagettftextblur')) 
{ 
    function imagettftextblur(&$image,$size,$angle,$x,$y,$color,$fontfile,$text,$blur_intensity = null) 
    { 
     $blur_intensity = !is_null($blur_intensity) && is_numeric($blur_intensity) ? (int)$blur_intensity : 0; 
     if ($blur_intensity > 0) 
     { 
      $text_shadow_image = imagecreatetruecolor(imagesx($image),imagesy($image)); 
      imagefill($text_shadow_image,0,0,imagecolorallocate($text_shadow_image,0x00,0x00,0x00)); 
      imagettftext($text_shadow_image,$size,$angle,$x,$y,imagecolorallocate($text_shadow_image,0xFF,0xFF,0xFF),$fontfile,$text); 
      for ($blur = 1;$blur <= $blur_intensity;$blur++) 
       imagefilter($text_shadow_image,IMG_FILTER_GAUSSIAN_BLUR); 
      for ($x_offset = 0;$x_offset < imagesx($text_shadow_image);$x_offset++) 
      { 
       for ($y_offset = 0;$y_offset < imagesy($text_shadow_image);$y_offset++) 
       { 
        $visibility = (imagecolorat($text_shadow_image,$x_offset,$y_offset) & 0xFF)/255; 
        if ($visibility > 0) 
         imagesetpixel($image,$x_offset,$y_offset,imagecolorallocatealpha($image,($color >> 16) & 0xFF,($color >> 8) & 0xFF,$color & 0xFF,(1 - $visibility) * 127)); 
       } 
      } 
      imagedestroy($text_shadow_image); 
     } 
     else 
      return imagettftext($image,$size,$angle,$x,$y,$color,$fontfile,$text); 
    } 
}