PHP GD — выравнивание текста по центру по горизонтали и уменьшение размера шрифта, чтобы он оставался внутри изображения

Надеюсь, у тебя все отлично.

Я все еще новичок в php, поэтому после некоторого чтения и проверки некоторых сообщений здесь я смог поместить текст поверх изображения с помощью функции imagecreatefrompng() с помощью PHP GD, пользователи перейдут в форму, и они будут смог ввести свое имя, и имя будет написано поверх изображения, к сожалению, мне не удалось выровнять центр текста по горизонтали, я пробовал все возможные способы (мои способы, очевидно, и должны быть неправильными) с imagettfbbox, но я потерпел неудачу во всех своих попытках , не могли бы вы, ребята, помочь мне немного выровнять центр строки по горизонтали? Кроме того, поскольку я использую своего рода альтернативный большой шрифт, мне нужно, чтобы размер уменьшался, если введенное имя довольно длинное, чтобы таким образом оно не вышло за пределы изображения и оставалось в центре. Я получаю значение текста из формы, как вы можете проверить в начале моего кода:

<?php
 $nombre=$_POST['nombre'];
  //Set the Content Type
  header('Content-type: image/jpeg');

  // Create Image From Existing File
  $jpg_image = imagecreatefromjpeg('fabian.jpg');

  // Allocate A Color For The Text
  $white = imagecolorallocate($jpg_image, 255, 255, 255);

  // Set Path to Font File
  $font_path = 'fabian.TTF';

  // Set Text to Be Printed On Image , I set it to uppercase
  $text =strtoupper($nombre);

  // Print Text On Image
  imagettftext($jpg_image, 75, 0, 50, 400, $white, $font_path, $text);



  // Send Image to Browser
  imagepng($jpg_image);

  // Clear Memory
  imagedestroy($jpg_image);

  ?>

Ваша помощь будет высоко оценена, позже я сломаю голову, пытаясь сохранить изображение, нажав кнопку отправки, поскольку я не хочу, чтобы пользователи сохраняли изображение, щелкнув его правой кнопкой мыши.

Спасибо друзья!


person i'llbdevsomeday    schedule 13.04.2013    source источник


Ответы (2)


Вам нужна ширина изображения и ширина текста, чтобы связать оба.

// get image dimensions
list($img_width, $img_height,,) = getimagesize("fabian.jpg");

// find font-size for $txt_width = 80% of $img_width...
$font_size = 1; 
$txt_max_width = intval(0.8 * $img_width);    

do {        
    $font_size++;
    $p = imagettfbbox($font_size, 0, $font_path, $text);
    $txt_width = $p[2] - $p[0];
    // $txt_height=$p[1]-$p[7]; // just in case you need it
} while ($txt_width <= $txt_max_width);

// now center the text
$y = $img_height * 0.9; // baseline of text at 90% of $img_height
$x = ($img_width - $txt_width) / 2;

imagettftext($jpg_image, $font_size, 0, $x, $y, $white, $font_path, $text);
person michi    schedule 13.04.2013
comment
Отличный мичи!!!, сработало отлично большое спасибо!!! Ты не представляешь, сколько раз я пытался добиться этого, ты гениальный друг, я очень ценю это. Будет анализировать и запоминать каждую строку кода и помнить об этом для дальнейшего использования. Спасибо! - person i'llbdevsomeday; 13.04.2013
comment
Это работает как шарм для однострочного текста. Это не будет служить цели для нескольких строк текста. Спасибо - person JayKandari; 05.11.2015
comment
@JayKandari спасибо за комплимент, поскольку цель ОП состояла в том, чтобы центрировать имя человека на его фотографии, которая представляет собой одну строчку ... по крайней мере, с большинством имен :-) - person michi; 05.11.2015

Вы можете использовать класс stil/gd-text для выравнивания текста. Отказ от ответственности: я автор.

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

$jpg_image = imagecreatefromjpeg('fabian.jpg');

$textbox = new Box($jpg_image);
$textbox->setFontSize(75);
$textbox->setFontFace('fabian.TTF');
$textbox->setFontColor(new Color(255, 255, 255));
$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 center horizontally and to top vertically
$textbox->setTextAlign('center', 'top');
$textbox->draw(strtoupper($nombre));

Однако это не полный ответ, поскольку он не может автоматически уменьшать размер шрифта.

person stil    schedule 02.01.2015