Правый выравнивать текст в изображении с помощью 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); 

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

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

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

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

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

Вы можете использовать класс 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() . Пример, сгенерированный с помощью этого класса:

правая выровненная текстовая демонстрация

Это будет работать …………….

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

Я расширил код 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); } }