Подтвердить что ты не робот

Правый выравнивать текст в изображении с помощью imagettftext(), PHP

Я настраиваю динамические изображения подписи для моих пользователей, и я хочу, чтобы они могли поместить их имя пользователя на изображение. Я могу сделать это просто отлично, но поскольку имена пользователей различаются по длине, и я хочу правильно выровнять имя пользователя, как я могу это сделать, когда мне нужно установить координаты 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);
4b9b3361

Ответ 1

Используйте функцию imagettfbbox, чтобы получить ширину строки, а затем вычтите ее из ширины изображения, чтобы получить начальную координату x.

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

Ответ 2

Предварительно вычислить размер имени пользователя, используя imagettfbbox().

Из ширины, которую вы получаете оттуда, вы можете затем вычесть позицию x, в которой должен начинаться ваш текст.

Ответ 3

Вы можете использовать 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");

Вы также можете рисовать многострочный текст. Просто используйте \n в строке, переданной методу draw(). Пример, сгенерированный с помощью этого класса:

right aligned text demo

Ответ 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);
    }
}