【问题标题】:Right align text in an image with imagettftext(), PHP使用 imagettftext(),PHP 右对齐图像中的文本
【发布时间】:2011-01-27 11:48:04
【问题描述】:

我正在为我的用户设置动态论坛签名图像,我希望能够将他们的用户名放在图像上。我可以很好地做到这一点,但是由于用户名的长度不同,并且我想右对齐用户名,当我必须设置 x 和 y 坐标时,我该怎么做呢。

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

【问题讨论】:

  • 好的。我对多行也有同样的问题。

标签: php image gd imagettftext


【解决方案1】:

使用 imagettfbbox 函数获取字符串的宽度,然后将其从图像的宽度中减去得到起始 x 坐标。

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

【讨论】:

  • @Andy...我也是(只是喜欢你的回答)
  • 多行的任何想法?
  • 希望我能给超过 +1。一段完美的代码。谢谢。要稍微向左调整,请添加 -10以在右侧缩进 10p。
【解决方案2】:

您可以使用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。 使用此类生成的示例:

【讨论】:

    【解决方案3】:

    使用imagettfbbox()预先计算用户名的大小。

    从那里得到的宽度,然后可以扣除文本需要开始的 x 位置。

    【讨论】:

      【解决方案4】:

      这将工作......

                        $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】:

        我增强了 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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-04-20
          • 2012-12-30
          • 1970-01-01
          • 2012-02-24
          • 2020-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多